From 5ff98685797dfe816a1f9d24c639533756280caa Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 7 Sep 2023 17:26:41 -0400 Subject: [PATCH 001/122] fix(mempool): Re-add locks (#1082) --- cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go index 1bf79ae2f3..43180e88cc 100644 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go +++ b/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go @@ -43,6 +43,8 @@ func (etp *EthTxPool) Pending(bool) map[common.Address]coretypes.Transactions { pendingNonces := make(map[common.Address]uint64) pending := make(map[common.Address]coretypes.Transactions) + etp.mu.RLock() + defer etp.mu.RUnlock() for iter := etp.PriorityNonceMempool.Select(context.Background(), nil); iter != nil; iter = iter.Next() { tx := iter.Tx() if ethTx := evmtypes.GetAsEthTx(tx); ethTx != nil { @@ -84,6 +86,8 @@ func (etp *EthTxPool) queued() map[common.Address]coretypes.Transactions { queued := make(map[common.Address]coretypes.Transactions) // After the lock is released we can iterate over the mempool. + etp.mu.RLock() + defer etp.mu.RUnlock() for iter := etp.PriorityNonceMempool.Select(context.Background(), nil); iter != nil; iter = iter.Next() { if ethTx := evmtypes.GetAsEthTx(iter.Tx()); ethTx != nil { addr := coretypes.GetSender(ethTx) @@ -122,6 +126,8 @@ func (etp *EthTxPool) queued() map[common.Address]coretypes.Transactions { // // NOT THREAD SAFE. func (etp *EthTxPool) Nonce(addr common.Address) uint64 { + etp.mu.RLock() + defer etp.mu.RUnlock() pendingNonces := make(map[common.Address]uint64) // search for the last pending tx for the given address From 7d16e3f0cac47b62237da68b6656de38eb915162 Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Thu, 7 Sep 2023 17:50:05 -0400 Subject: [PATCH 002/122] fix(txpool): get state from disk from nonce (#1080) Co-authored-by: ocnc <97242826+ocnc@users.noreply.github.com> --- .../evm/plugins/txpool/mempool/interfaces.go | 8 +++++++- .../plugins/txpool/mempool/mempool_test.go | 20 +++++++++++++++++-- .../plugins/txpool/mempool/mempool_writer.go | 10 ++++++++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/cosmos/x/evm/plugins/txpool/mempool/interfaces.go b/cosmos/x/evm/plugins/txpool/mempool/interfaces.go index 688a85ec01..7ea05cae9a 100644 --- a/cosmos/x/evm/plugins/txpool/mempool/interfaces.go +++ b/cosmos/x/evm/plugins/txpool/mempool/interfaces.go @@ -20,11 +20,17 @@ package mempool -import "pkg.berachain.dev/polaris/eth/common" +import ( + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/core" +) type ( // NonceRetriever is used to retrieve a nonce from the db. NonceRetriever interface { + // used to directly retrieve a nonce during queries. GetNonce(addr common.Address) uint64 + // used to verify nonce during insertion into mempool. + StateAtBlockNumber(number uint64) (core.StatePlugin, error) } ) diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go index d578000059..9583c422f6 100644 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go +++ b/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go @@ -24,6 +24,7 @@ import ( "bytes" "context" "crypto/ecdsa" + "errors" "math/big" "sync" "testing" @@ -40,7 +41,6 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/crypto" "pkg.berachain.dev/polaris/eth/params" @@ -56,7 +56,7 @@ func TestEthPool(t *testing.T) { var ( ctx sdk.Context - sp core.StatePlugin + sp state.Plugin etp *EthTxPool key1, _ = crypto.GenerateEthKey() addr1 = crypto.PubkeyToAddress(key1.PublicKey) @@ -70,6 +70,7 @@ var _ = Describe("EthTxPool", func() { sCtx, ak, _, _ := testutil.SetupMinimalKeepers() sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) ctx = sCtx + sp.SetQueryContextFn(mockQueryContext) sp.Reset(ctx) sp.SetNonce(addr1, 1) sp.SetNonce(addr2, 2) @@ -491,3 +492,18 @@ func (m *mockSdkTx) GetSigners() ([][]byte, error) { return m.s func (m *mockSdkTx) GetPubKeys() ([]cryptotypes.PubKey, error) { return m.pubKeys, nil } func (m *mockSdkTx) GetSignaturesV2() ([]signing.SignatureV2, error) { return m.signatures, nil } + +func mockQueryContext(height int64, _ bool) (sdk.Context, error) { + if height <= 0 { + return sdk.Context{}, errors.New("cannot query context at this height") + } + newCtx := testutil.NewContext().WithBlockHeight(height) + header := &coretypes.Header{Number: big.NewInt(height)} + headerBz, err := coretypes.MarshalHeader(header) + if err != nil { + return sdk.Context{}, err + } + newCtx.KVStore(testutil.EvmKey).Set([]byte{evmtypes.HeaderKey}, headerBz) + newCtx.KVStore(testutil.EvmKey).Set(header.Hash().Bytes(), header.Number.Bytes()) + return newCtx, nil +} diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go index ea2322a418..dbf9cc2c6c 100644 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go +++ b/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go @@ -36,8 +36,14 @@ func (etp *EthTxPool) Insert(ctx context.Context, tx sdk.Tx) error { etp.mu.Lock() defer etp.mu.Unlock() + // TODO: do this once per block. This is a temporary solution. + sp, err := etp.nr.StateAtBlockNumber(uint64(sdk.UnwrapSDKContext(ctx).BlockHeight())) + if err != nil { + return err + } + // Call the base mempool's Insert method - if err := etp.PriorityNonceMempool.Insert(ctx, tx); err != nil { + if err = etp.PriorityNonceMempool.Insert(ctx, tx); err != nil { return err } @@ -47,7 +53,7 @@ func (etp *EthTxPool) Insert(ctx context.Context, tx sdk.Tx) error { nonce := ethTx.Nonce() // Reject txs with a nonce lower than the nonce reported by the statedb. - if sdbNonce := etp.nr.GetNonce(sender); sdbNonce > nonce { + if sdbNonce := sp.GetNonce(sender); sdbNonce > nonce { return errorslib.Wrap(etp.PriorityNonceMempool.Remove(tx), "nonce too low") } From 1928f4a21413817522c287fd2c551039f419def4 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 7 Sep 2023 17:50:15 -0400 Subject: [PATCH 003/122] fix(pc): handle gas edge case (#1071) --- cosmos/x/evm/plugins/precompile/plugin.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cosmos/x/evm/plugins/precompile/plugin.go b/cosmos/x/evm/plugins/precompile/plugin.go index a9c0e5a0ba..68cdcd3812 100644 --- a/cosmos/x/evm/plugins/precompile/plugin.go +++ b/cosmos/x/evm/plugins/precompile/plugin.go @@ -129,6 +129,12 @@ func (p *plugin) Run( ms := utils.MustGetAs[MultiStore](ctx.MultiStore()) cem := utils.MustGetAs[state.ControllableEventManager](ctx.EventManager()) + requiredGas := pc.RequiredGas(input) + // handle edge case when not enough gas is provided for even the required gas + if requiredGas > suppliedGas { + return nil, 0, vm.ErrOutOfGas + } + // make sure the readOnly is only set if we aren't in readOnly yet, which also makes sure that // the readOnly flag isn't removed for child calls (taken from geth core/vm/interepreter.go) if readOnly && !ms.IsReadOnly() { @@ -149,7 +155,7 @@ func (p *plugin) Run( // use a precompile-specific gas meter for dynamic consumption gm := storetypes.NewGasMeter(suppliedGas) - gm.ConsumeGas(pc.RequiredGas(input), "RequiredGas") + gm.ConsumeGas(requiredGas, "precompile required gas") // run the precompile container ret, err = pc.Run( From acb4f0ea8dc39670b19dcdc2a9407a487c5451e1 Mon Sep 17 00:00:00 2001 From: ocnc <97242826+ocnc@users.noreply.github.com> Date: Fri, 8 Sep 2023 15:20:51 -0400 Subject: [PATCH 004/122] revert(pc): Enforce read-only at the container level" (#1089) Reverts berachain/polaris#1076 --- .../mock_precompile_interface.abigen.go | 106 +++++++----------- .../src/testing/MockPrecompileInterface.sol | 4 +- .../precompile/distribution/distribution.go | 13 ++- eth/core/precompile/stateful_container.go | 9 -- .../precompile/stateful_container_test.go | 6 - eth/core/vm/mock/statedb.go | 13 +-- 6 files changed, 62 insertions(+), 89 deletions(-) diff --git a/contracts/bindings/testing/mock_precompile_interface.abigen.go b/contracts/bindings/testing/mock_precompile_interface.abigen.go index 725998a1f0..9b39c88208 100644 --- a/contracts/bindings/testing/mock_precompile_interface.abigen.go +++ b/contracts/bindings/testing/mock_precompile_interface.abigen.go @@ -37,7 +37,7 @@ type MockPrecompileInterfaceObject struct { // MockPrecompileMetaData contains all meta data concerning the MockPrecompile contract. var MockPrecompileMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"contractFunc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ans\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"contractFuncStr\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"getOutput\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creationHeight\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"timeStamp\",\"type\":\"string\"}],\"internalType\":\"structMockPrecompileInterface.Object[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOutputPartial\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creationHeight\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"timeStamp\",\"type\":\"string\"}],\"internalType\":\"structMockPrecompileInterface.Object\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"overloadedFunc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ans\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"overloadedFunc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ans\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"contractFunc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ans\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"contractFuncStr\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"getOutput\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creationHeight\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"timeStamp\",\"type\":\"string\"}],\"internalType\":\"structMockPrecompileInterface.Object[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOutputPartial\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"creationHeight\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"timeStamp\",\"type\":\"string\"}],\"internalType\":\"structMockPrecompileInterface.Object\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"overloadedFunc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ans\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"overloadedFunc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ans\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // MockPrecompileABI is the input ABI used to generate the binding from. @@ -186,68 +186,6 @@ func (_MockPrecompile *MockPrecompileTransactorRaw) Transact(opts *bind.Transact return _MockPrecompile.Contract.contract.Transact(opts, method, params...) } -// GetOutput is a free data retrieval call binding the contract method 0xb5c11fc2. -// -// Solidity: function getOutput(string str) view returns((uint256,string)[]) -func (_MockPrecompile *MockPrecompileCaller) GetOutput(opts *bind.CallOpts, str string) ([]MockPrecompileInterfaceObject, error) { - var out []interface{} - err := _MockPrecompile.contract.Call(opts, &out, "getOutput", str) - - if err != nil { - return *new([]MockPrecompileInterfaceObject), err - } - - out0 := *abi.ConvertType(out[0], new([]MockPrecompileInterfaceObject)).(*[]MockPrecompileInterfaceObject) - - return out0, err - -} - -// GetOutput is a free data retrieval call binding the contract method 0xb5c11fc2. -// -// Solidity: function getOutput(string str) view returns((uint256,string)[]) -func (_MockPrecompile *MockPrecompileSession) GetOutput(str string) ([]MockPrecompileInterfaceObject, error) { - return _MockPrecompile.Contract.GetOutput(&_MockPrecompile.CallOpts, str) -} - -// GetOutput is a free data retrieval call binding the contract method 0xb5c11fc2. -// -// Solidity: function getOutput(string str) view returns((uint256,string)[]) -func (_MockPrecompile *MockPrecompileCallerSession) GetOutput(str string) ([]MockPrecompileInterfaceObject, error) { - return _MockPrecompile.Contract.GetOutput(&_MockPrecompile.CallOpts, str) -} - -// GetOutputPartial is a free data retrieval call binding the contract method 0x7acaaeb9. -// -// Solidity: function getOutputPartial() view returns((uint256,string)) -func (_MockPrecompile *MockPrecompileCaller) GetOutputPartial(opts *bind.CallOpts) (MockPrecompileInterfaceObject, error) { - var out []interface{} - err := _MockPrecompile.contract.Call(opts, &out, "getOutputPartial") - - if err != nil { - return *new(MockPrecompileInterfaceObject), err - } - - out0 := *abi.ConvertType(out[0], new(MockPrecompileInterfaceObject)).(*MockPrecompileInterfaceObject) - - return out0, err - -} - -// GetOutputPartial is a free data retrieval call binding the contract method 0x7acaaeb9. -// -// Solidity: function getOutputPartial() view returns((uint256,string)) -func (_MockPrecompile *MockPrecompileSession) GetOutputPartial() (MockPrecompileInterfaceObject, error) { - return _MockPrecompile.Contract.GetOutputPartial(&_MockPrecompile.CallOpts) -} - -// GetOutputPartial is a free data retrieval call binding the contract method 0x7acaaeb9. -// -// Solidity: function getOutputPartial() view returns((uint256,string)) -func (_MockPrecompile *MockPrecompileCallerSession) GetOutputPartial() (MockPrecompileInterfaceObject, error) { - return _MockPrecompile.Contract.GetOutputPartial(&_MockPrecompile.CallOpts) -} - // ContractFunc is a paid mutator transaction binding the contract method 0xc7dda0b9. // // Solidity: function contractFunc(address addr) returns(uint256 ans) @@ -290,6 +228,48 @@ func (_MockPrecompile *MockPrecompileTransactorSession) ContractFuncStr(str stri return _MockPrecompile.Contract.ContractFuncStr(&_MockPrecompile.TransactOpts, str) } +// GetOutput is a paid mutator transaction binding the contract method 0xb5c11fc2. +// +// Solidity: function getOutput(string str) returns((uint256,string)[]) +func (_MockPrecompile *MockPrecompileTransactor) GetOutput(opts *bind.TransactOpts, str string) (*types.Transaction, error) { + return _MockPrecompile.contract.Transact(opts, "getOutput", str) +} + +// GetOutput is a paid mutator transaction binding the contract method 0xb5c11fc2. +// +// Solidity: function getOutput(string str) returns((uint256,string)[]) +func (_MockPrecompile *MockPrecompileSession) GetOutput(str string) (*types.Transaction, error) { + return _MockPrecompile.Contract.GetOutput(&_MockPrecompile.TransactOpts, str) +} + +// GetOutput is a paid mutator transaction binding the contract method 0xb5c11fc2. +// +// Solidity: function getOutput(string str) returns((uint256,string)[]) +func (_MockPrecompile *MockPrecompileTransactorSession) GetOutput(str string) (*types.Transaction, error) { + return _MockPrecompile.Contract.GetOutput(&_MockPrecompile.TransactOpts, str) +} + +// GetOutputPartial is a paid mutator transaction binding the contract method 0x7acaaeb9. +// +// Solidity: function getOutputPartial() returns((uint256,string)) +func (_MockPrecompile *MockPrecompileTransactor) GetOutputPartial(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockPrecompile.contract.Transact(opts, "getOutputPartial") +} + +// GetOutputPartial is a paid mutator transaction binding the contract method 0x7acaaeb9. +// +// Solidity: function getOutputPartial() returns((uint256,string)) +func (_MockPrecompile *MockPrecompileSession) GetOutputPartial() (*types.Transaction, error) { + return _MockPrecompile.Contract.GetOutputPartial(&_MockPrecompile.TransactOpts) +} + +// GetOutputPartial is a paid mutator transaction binding the contract method 0x7acaaeb9. +// +// Solidity: function getOutputPartial() returns((uint256,string)) +func (_MockPrecompile *MockPrecompileTransactorSession) GetOutputPartial() (*types.Transaction, error) { + return _MockPrecompile.Contract.GetOutputPartial(&_MockPrecompile.TransactOpts) +} + // OverloadedFunc is a paid mutator transaction binding the contract method 0x1e61d5aa. // // Solidity: function overloadedFunc() returns(uint256 ans) diff --git a/contracts/src/testing/MockPrecompileInterface.sol b/contracts/src/testing/MockPrecompileInterface.sol index 640d9b2297..aab1dab1d9 100644 --- a/contracts/src/testing/MockPrecompileInterface.sol +++ b/contracts/src/testing/MockPrecompileInterface.sol @@ -31,9 +31,9 @@ interface MockPrecompileInterface { string timeStamp; } - function getOutput(string calldata str) external view returns (Object[] calldata); + function getOutput(string calldata str) external returns (Object[] calldata); - function getOutputPartial() external view returns (Object calldata); + function getOutputPartial() external returns (Object calldata); function contractFunc(address addr) external returns (uint256 ans); diff --git a/cosmos/precompile/distribution/distribution.go b/cosmos/precompile/distribution/distribution.go index 39d84e44b7..9d350edb13 100644 --- a/cosmos/precompile/distribution/distribution.go +++ b/cosmos/precompile/distribution/distribution.go @@ -25,6 +25,7 @@ import ( "cosmossdk.io/core/address" + sdk "github.com/cosmos/cosmos-sdk/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" @@ -175,8 +176,12 @@ func (c *Contract) GetAllDelegatorRewards( return nil, err } + // NOTE: CacheContext is necessary here because this is a view method (EVM static call), but + // the Cosmos SDK distribution module's querier performs writes to the context kv stores. The + // cache context is never committed and discarded after this function call. + cacheCtx, _ := sdk.UnwrapSDKContext(ctx).CacheContext() res, err := c.querier.DelegationTotalRewards( // performs writes to the context kv stores - ctx, + cacheCtx, &distributiontypes.QueryDelegationTotalRewardsRequest{ DelegatorAddress: delAddr, }, @@ -219,8 +224,12 @@ func (c *Contract) GetTotalDelegatorReward( return nil, err } + // NOTE: CacheContext is necessary here because this is a view method (EVM static call), but + // the Cosmos SDK distribution module's querier performs writes to the context kv stores. The + // cache context is never committed and discarded after this function call. + cacheCtx, _ := sdk.UnwrapSDKContext(ctx).CacheContext() res, err := c.querier.DelegationTotalRewards( // performs writes to the context kv stores - ctx, + cacheCtx, &distributiontypes.QueryDelegationTotalRewardsRequest{ DelegatorAddress: delAddr, }, diff --git a/eth/core/precompile/stateful_container.go b/eth/core/precompile/stateful_container.go index 4a2946ab77..e24b245597 100644 --- a/eth/core/precompile/stateful_container.go +++ b/eth/core/precompile/stateful_container.go @@ -82,15 +82,6 @@ func (sc *statefulContainer) Run( return nil, ErrMethodNotFound } - // If the method is read-only (view/pure), snapshot so any state changes made during the call - // are not persisted. NOTE: this may not be the best place to handle state mutability, but it - // gets the job done. - if method.abiMethod.IsConstant() { - sdb := evm.GetStateDB() - snapshot := sdb.Snapshot() - defer func() { sdb.RevertToSnapshot(snapshot) }() - } - // Execute the method with the reflected ctx and raw input return method.Call( vm.NewPolarContext(ctx, evm, caller, value), diff --git a/eth/core/precompile/stateful_container_test.go b/eth/core/precompile/stateful_container_test.go index f19fb1f412..1b3b738efd 100644 --- a/eth/core/precompile/stateful_container_test.go +++ b/eth/core/precompile/stateful_container_test.go @@ -115,7 +115,6 @@ var _ = Describe("Stateful Container", func() { var inputs []byte inputs, err = getOutputABI.Inputs.Pack("string") Expect(err).ToNot(HaveOccurred()) - var ret []byte ret, err = sc.Run( ctx, @@ -125,7 +124,6 @@ var _ = Describe("Stateful Container", func() { vm.UnwrapPolarContext(ctx).MsgValue(), ) Expect(err).ToNot(HaveOccurred()) - var outputs []interface{} outputs, err = getOutputABI.Outputs.Unpack(ret) Expect(err).ToNot(HaveOccurred()) @@ -139,10 +137,6 @@ var _ = Describe("Stateful Container", func() { Expect( reflect.ValueOf(outputs[0]).Index(0).FieldByName("TimeStamp").Interface().(string), ).To(Equal("string")) - - // view method should not be able to add logs to the statedb - Expect(vm.UnwrapPolarContext(ctx).Evm().GetStateDB().GetLogs( - common.Hash{}, 0, common.Hash{})).To(BeEmpty()) }) }) }) diff --git a/eth/core/vm/mock/statedb.go b/eth/core/vm/mock/statedb.go index 94726b2724..feabadf6d7 100644 --- a/eth/core/vm/mock/statedb.go +++ b/eth/core/vm/mock/statedb.go @@ -33,7 +33,6 @@ import ( // NewEmptyStateDB creates a new `StateDBMock` instance. func NewEmptyStateDB() *PolarisStateDBMock { - logs := []*types.Log{} mockedPolarisStateDB := &PolarisStateDBMock{ AddAddressToAccessListFunc: func(addr common.Address) { @@ -42,7 +41,7 @@ func NewEmptyStateDB() *PolarisStateDBMock { }, AddLogFunc: func(log *types.Log) { - logs = append(logs, log) + }, AddPreimageFunc: func(hash common.Hash, bytes []byte) { @@ -90,7 +89,7 @@ func NewEmptyStateDB() *PolarisStateDBMock { return common.Hash{} }, GetLogsFunc: func(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { - return logs + return []*types.Log{} }, GetNonceFunc: func(address common.Address) uint64 { return 0 @@ -111,7 +110,7 @@ func NewEmptyStateDB() *PolarisStateDBMock { // no-op }, RevertToSnapshotFunc: func(n int) { - logs = []*types.Log{} + }, SetCodeFunc: func(address common.Address, bytes []byte) { @@ -138,11 +137,11 @@ func NewEmptyStateDB() *PolarisStateDBMock { }, } mockedPolarisStateDB.LogsFunc = func() []*types.Log { - ret := []*types.Log{} + logs := []*types.Log{} for _, l := range mockedPolarisStateDB.AddLogCalls() { - ret = append(ret, l.Log) + logs = append(logs, l.Log) } - return ret + return logs } return mockedPolarisStateDB } From d71d79b8b3da1d85c65cfbc95781098e53cc66c5 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 13 Sep 2023 10:52:20 -0400 Subject: [PATCH 005/122] feat(infra): Support `sync_progress` and reduce spammy tx logs. (#1096) - Help brick manage node status better - Reduce spammy logs which I think may be a non trivial I/O bottleneck --- cosmos/x/evm/keeper/host.go | 8 +++ cosmos/x/evm/keeper/keeper.go | 3 + cosmos/x/evm/plugins/engine/comet_bft.go | 88 ++++++++++++++++++++++++ cosmos/x/evm/plugins/engine/plugin.go | 56 +++++++++++++++ eth/core/chain_reader.go | 6 +- eth/core/host.go | 15 ++++ eth/core/mock/host.mock.go | 37 ++++++++++ eth/polar/backend.go | 38 ++++++---- eth/polar/polaris.go | 4 ++ 9 files changed, 238 insertions(+), 17 deletions(-) create mode 100644 cosmos/x/evm/plugins/engine/comet_bft.go create mode 100644 cosmos/x/evm/plugins/engine/plugin.go diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index 2b04d693c0..a1a171f7d5 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -29,6 +29,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/configuration" + "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/gas" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/historical" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile" @@ -61,6 +62,7 @@ type host struct { // The various plugins that are are used to implement core.PolarisHostChain. bp block.Plugin cp configuration.Plugin + ep engine.Plugin gp gas.Plugin hp historical.Plugin pp precompile.Plugin @@ -83,6 +85,7 @@ func NewHost( // Build the Plugins h.bp = block.NewPlugin(storeKey, sk) h.cp = configuration.NewPlugin(storeKey) + h.ep = engine.NewPlugin() h.gp = gas.NewPlugin() h.txp = txpool.NewPlugin(utils.MustGetAs[*mempool.EthTxPool](ethTxMempool)) h.pcs = precompiles @@ -120,6 +123,11 @@ func (h *host) GetConfigurationPlugin() core.ConfigurationPlugin { return h.cp } +// GetEnginePlugin returns the engine plugin. +func (h *host) GetEnginePlugin() core.EnginePlugin { + return h.ep +} + // GetGasPlugin returns the gas plugin. func (h *host) GetGasPlugin() core.GasPlugin { return h.gp diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index 7c6ccffea7..d768fe752b 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -32,6 +32,7 @@ import ( sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" + "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool" "pkg.berachain.dev/polaris/cosmos/x/evm/types" @@ -140,6 +141,8 @@ func (k *Keeper) GetPolaris() *polar.Polaris { func (k *Keeper) SetClientCtx(clientContext client.Context) { k.host.GetTxPoolPlugin().(txpool.Plugin).SetClientContext(clientContext) + k.host.GetEnginePlugin().(engine.Plugin).Start(clientContext) + // TODO: move this go func() { // spin lock for a bit diff --git a/cosmos/x/evm/plugins/engine/comet_bft.go b/cosmos/x/evm/plugins/engine/comet_bft.go new file mode 100644 index 0000000000..f65d66a84d --- /dev/null +++ b/cosmos/x/evm/plugins/engine/comet_bft.go @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package engine + +import ( + "context" + + cmtclient "github.com/cometbft/cometbft/rpc/client" + + "github.com/cosmos/cosmos-sdk/client" + + "github.com/ethereum/go-ethereum" +) + +// syncView is a view of the sync status from CometBFT. +type cometBftView struct { + cometClient client.CometRPC +} + +// newSyncView returns a new syncView. +func newSyncView(clientCtx client.Context) *cometBftView { + return &cometBftView{ + cometClient: clientCtx.Client, + } +} + +// PeerCount returns the number of peers currently connected to the node. +func (sv *cometBftView) PeerCount(ctx context.Context) (uint64, error) { + result, err := sv.cometClient.(cmtclient.NetworkClient).NetInfo(ctx) + if err != nil { + return 0, err + } + + return uint64(result.NPeers), nil +} + +// Listening returns whether the node is currently listening for incoming +// connections from other nodes. +func (sv *cometBftView) Listening(ctx context.Context) (bool, error) { + result, err := sv.cometClient.(cmtclient.NetworkClient).NetInfo(ctx) + if err != nil { + return false, err + } + + return result.Listening, nil +} + +// SyncProgress returns the current sync progress. +func (sv *cometBftView) SyncProgress(ctx context.Context) (ethereum.SyncProgress, error) { + resultStatus, err := sv.cometClient.(cmtclient.StatusClient).Status(ctx) + if err != nil { + return ethereum.SyncProgress{}, err + } + + resultInfo, err := sv.cometClient.(cmtclient.HistoryClient). + BlockchainInfo( + ctx, + resultStatus.SyncInfo.EarliestBlockHeight, + resultStatus.SyncInfo.LatestBlockHeight, + ) + if err != nil { + return ethereum.SyncProgress{}, err + } + + return ethereum.SyncProgress{ + StartingBlock: uint64(resultStatus.SyncInfo.EarliestBlockHeight), + CurrentBlock: uint64(resultInfo.LastHeight), + HighestBlock: uint64(resultStatus.SyncInfo.LatestBlockHeight), + }, nil +} diff --git a/cosmos/x/evm/plugins/engine/plugin.go b/cosmos/x/evm/plugins/engine/plugin.go new file mode 100644 index 0000000000..ddfa912d9e --- /dev/null +++ b/cosmos/x/evm/plugins/engine/plugin.go @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package engine + +import ( + "github.com/cosmos/cosmos-sdk/client" + + "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" + "pkg.berachain.dev/polaris/eth/core" +) + +// Compile-time type assertion. +var _ Plugin = (*plugin)(nil) + +// Plugin defines the required functions of the transaction pool plugin. +type Plugin interface { + plugins.Base + core.EnginePlugin + Start(client.Context) +} + +// plugin represents the transaction pool plugin. +type plugin struct { + *cometBftView +} + +// NewPlugin returns a new transaction pool plugin. +func NewPlugin() Plugin { + return &plugin{} +} + +// Setup implements the Plugin interface. +func (p *plugin) Start(ctx client.Context) { + p.cometBftView = newSyncView(ctx) +} + +// IsPlugin implements the Plugin interface. +func (plugin) IsPlugin() {} diff --git a/eth/core/chain_reader.go b/eth/core/chain_reader.go index 357b6aa148..4b441e1d4c 100644 --- a/eth/core/chain_reader.go +++ b/eth/core/chain_reader.go @@ -179,7 +179,7 @@ func (bc *blockchain) GetBlockByHash(hash common.Hash) *types.Block { // check the historical plugin block, err := bc.hp.GetBlockByHash(hash) if block == nil || err != nil { - bc.logger.Warn("failed to get block from historical plugin", "block", block, "err", err) + bc.logger.Debug("failed to get block from historical plugin", "block", block, "err", err) return nil } @@ -248,7 +248,7 @@ func (bc *blockchain) GetReceiptsByHash(blockHash common.Hash) types.Receipts { // check the historical plugin receipts, err := bc.hp.GetReceiptsByHash(blockHash) if receipts == nil || err != nil { - bc.logger.Warn("failed to get receipts from historical plugin", "receipts", receipts, "err", err) + bc.logger.Debug("failed to get receipts from historical plugin", "receipts", receipts, "err", err) return nil } @@ -284,7 +284,7 @@ func (bc *blockchain) GetTransactionLookup( // check the historical plugin txLookupEntry, err := bc.hp.GetTransactionByHash(hash) if err != nil { - bc.logger.Warn("failed to get transaction by hash", "tx", hash, "err", err) + bc.logger.Debug("failed to get transaction by hash", "tx", hash, "err", err) return nil } diff --git a/eth/core/host.go b/eth/core/host.go index a4d5ea779a..b42a1e4834 100644 --- a/eth/core/host.go +++ b/eth/core/host.go @@ -21,8 +21,10 @@ package core import ( + "context" "math/big" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/event" "pkg.berachain.dev/polaris/eth/common" @@ -39,6 +41,8 @@ type PolarisHostChain interface { GetBlockPlugin() BlockPlugin // GetConfigurationPlugin returns the `ConfigurationPlugin` of the Polaris host chain. GetConfigurationPlugin() ConfigurationPlugin + // GetEnginePlugin() returns the `EnginePlugin` of the Polaris host chain. + GetEnginePlugin() EnginePlugin // GetGasPlugin returns the `GasPlugin` of the Polaris host chain. GetGasPlugin() GasPlugin // GetHistoricalPlugin returns the OPTIONAL `HistoricalPlugin` of the Polaris host chain. @@ -87,6 +91,17 @@ type ( ChainConfig() *params.ChainConfig } + // EnginePlugin defines methods that allow the chain to have insight into the underlying + // consensus engine of the host chain. + EnginePlugin interface { + // SyncProgress returns the current sync progress of the host chain. + SyncProgress(ctx context.Context) (ethereum.SyncProgress, error) + // IsListening returns whether or not the host chain is listening for new blocks. + Listening(ctx context.Context) (bool, error) + // PeerCount returns the current number of peers connected to the host chain. + PeerCount(ctx context.Context) (uint64, error) + } + // GasPlugin is an interface that allows the Polaris EVM to consume gas on the host chain. GasPlugin interface { // GasPlugin implements `libtypes.Preparable`. Calling `Prepare` should reset the diff --git a/eth/core/mock/host.mock.go b/eth/core/mock/host.mock.go index d751613d58..97e58c4cd1 100644 --- a/eth/core/mock/host.mock.go +++ b/eth/core/mock/host.mock.go @@ -25,6 +25,9 @@ var _ core.PolarisHostChain = &PolarisHostChainMock{} // GetConfigurationPluginFunc: func() core.ConfigurationPlugin { // panic("mock out the GetConfigurationPlugin method") // }, +// GetEnginePluginFunc: func() core.EnginePlugin { +// panic("mock out the GetEnginePlugin method") +// }, // GetGasPluginFunc: func() core.GasPlugin { // panic("mock out the GetGasPlugin method") // }, @@ -53,6 +56,9 @@ type PolarisHostChainMock struct { // GetConfigurationPluginFunc mocks the GetConfigurationPlugin method. GetConfigurationPluginFunc func() core.ConfigurationPlugin + // GetEnginePluginFunc mocks the GetEnginePlugin method. + GetEnginePluginFunc func() core.EnginePlugin + // GetGasPluginFunc mocks the GetGasPlugin method. GetGasPluginFunc func() core.GasPlugin @@ -76,6 +82,9 @@ type PolarisHostChainMock struct { // GetConfigurationPlugin holds details about calls to the GetConfigurationPlugin method. GetConfigurationPlugin []struct { } + // GetEnginePlugin holds details about calls to the GetEnginePlugin method. + GetEnginePlugin []struct { + } // GetGasPlugin holds details about calls to the GetGasPlugin method. GetGasPlugin []struct { } @@ -94,6 +103,7 @@ type PolarisHostChainMock struct { } lockGetBlockPlugin sync.RWMutex lockGetConfigurationPlugin sync.RWMutex + lockGetEnginePlugin sync.RWMutex lockGetGasPlugin sync.RWMutex lockGetHistoricalPlugin sync.RWMutex lockGetPrecompilePlugin sync.RWMutex @@ -155,6 +165,33 @@ func (mock *PolarisHostChainMock) GetConfigurationPluginCalls() []struct { return calls } +// GetEnginePlugin calls GetEnginePluginFunc. +func (mock *PolarisHostChainMock) GetEnginePlugin() core.EnginePlugin { + if mock.GetEnginePluginFunc == nil { + panic("PolarisHostChainMock.GetEnginePluginFunc: method is nil but PolarisHostChain.GetEnginePlugin was just called") + } + callInfo := struct { + }{} + mock.lockGetEnginePlugin.Lock() + mock.calls.GetEnginePlugin = append(mock.calls.GetEnginePlugin, callInfo) + mock.lockGetEnginePlugin.Unlock() + return mock.GetEnginePluginFunc() +} + +// GetEnginePluginCalls gets all the calls that were made to GetEnginePlugin. +// Check the length with: +// +// len(mockedPolarisHostChain.GetEnginePluginCalls()) +func (mock *PolarisHostChainMock) GetEnginePluginCalls() []struct { +} { + var calls []struct { + } + mock.lockGetEnginePlugin.RLock() + calls = mock.calls.GetEnginePlugin + mock.lockGetEnginePlugin.RUnlock() + return calls +} + // GetGasPlugin calls GetGasPluginFunc. func (mock *PolarisHostChainMock) GetGasPlugin() core.GasPlugin { if mock.GetGasPluginFunc == nil { diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 6f99f74406..e79382d577 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -108,16 +108,6 @@ func (b *backend) CurrentBlock() *types.Header { return b.polar.blockchain.CurrentHeader() } -// SyncProgress returns the current progress of the sync algorithm. -func (b *backend) SyncProgress() ethereum.SyncProgress { - // Consider implementing this in the future. - b.logger.Warn("called eth.rpc.backend.SyncProgress", "sync_progress", "not implemented") - return ethereum.SyncProgress{ - CurrentBlock: 0, - HighestBlock: 0, - } -} - // SuggestGasTipCap returns the recommended gas tip cap for a new transaction. func (b *backend) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { defer b.logger.Debug("called eth.rpc.backend.SuggestGasTipCap", "suggested_tip_cap") @@ -544,14 +534,34 @@ func (b *backend) Version() string { return chainID.String() } +// SyncProgress returns the current progress of the sync algorithm. +func (b *backend) SyncProgress() ethereum.SyncProgress { + sp, err := b.polar.engine.SyncProgress(context.Background()) + if err != nil { + b.logger.Error("eth.rpc.backend.SyncProgress", "err", err) + return ethereum.SyncProgress{} + } + return sp +} + +// Listening returns whether the node is listening for connections. func (b *backend) Listening() bool { - // TODO: Implement your code here - return true + listening, err := b.polar.engine.Listening(context.Background()) + if err != nil { + b.logger.Error("eth.rpc.backend.Listening", "err", err) + return false + } + return listening } +// PeerCount returns the number of connected peers. func (b *backend) PeerCount() hexutil.Uint { - // TODO: Implement your code here - return 1 + peerCount, err := b.polar.engine.PeerCount(context.Background()) + if err != nil { + b.logger.Error("eth.rpc.backend.PeerCount", "err", err) + return hexutil.Uint(0) + } + return hexutil.Uint(peerCount) } // ClientVersion returns the current client version. diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index 590aabfcce..e6380fe34a 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -75,6 +75,9 @@ type Polaris struct { // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs and the blockchain. backend Backend + // engine represents the consensus engine for the backend. + engine core.EnginePlugin + // filterSystem is the filter system that is used by the filter API. // TODO: relocate filterSystem *filters.FilterSystem @@ -90,6 +93,7 @@ func NewWithNetworkingStack( cfg: cfg, blockchain: core.NewChain(host), stack: stack, + engine: host.GetEnginePlugin(), } // When creating a Polaris EVM, we allow the implementing chain // to specify their own log handler. If logHandler is nil then we From 2e5d3d34cdbf5196bda8ef642eef8d902f8b6af5 Mon Sep 17 00:00:00 2001 From: monem <119044801+pucedoteth@users.noreply.github.com> Date: Thu, 14 Sep 2023 17:47:54 +0200 Subject: [PATCH 006/122] chore(docs): Berachain Official Discord (#1098) I have updated the README file by inserting **Berachain** Official Discord which increases visibility, provides real-time updates, fosters community engagement, builds brand identity, generates traffic, and boosts credibility. Signed-off-by: monem <119044801+pucedoteth@users.noreply.github.com> Co-authored-by: Devon Bear --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7aaff30896..8711d72f4f 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ Twitter Follow + + Discord From f6f9ca1e0f43612e10aae0c07bc9abfe050c256d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 14 Sep 2023 12:14:09 -0400 Subject: [PATCH 007/122] chore(deps): move to official `cometbft v0.38.0` release (#1099) --- contracts/go.mod | 4 ++-- contracts/go.sum | 11 ++++++----- cosmos/go.mod | 22 +++++++++++----------- cosmos/go.sum | 43 ++++++++++++++++++++++--------------------- e2e/localnet/go.mod | 22 +++++++++++----------- e2e/localnet/go.sum | 43 ++++++++++++++++++++++--------------------- e2e/testapp/go.mod | 22 +++++++++++----------- e2e/testapp/go.sum | 43 ++++++++++++++++++++++--------------------- eth/go.mod | 8 ++++---- eth/go.sum | 15 ++++++++------- lib/go.mod | 6 +++--- lib/go.sum | 12 ++++++------ magefiles/go.mod | 10 +++++----- magefiles/go.sum | 19 ++++++++++--------- 14 files changed, 143 insertions(+), 137 deletions(-) diff --git a/contracts/go.mod b/contracts/go.mod index 2ac4a38851..4391fc40fb 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -36,9 +36,9 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/sys v0.12.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect ) diff --git a/contracts/go.sum b/contracts/go.sum index 0f6dca819a..6b3237d57e 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -155,8 +155,8 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -195,16 +195,17 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/cosmos/go.mod b/cosmos/go.mod index 1e7d7d5a55..60ddd82632 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -10,21 +10,21 @@ replace ( ) require ( - cosmossdk.io/api v0.7.0 + cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 cosmossdk.io/collections v0.4.0 // indirect - cosmossdk.io/core v0.10.0 + cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 cosmossdk.io/errors v1.0.0 cosmossdk.io/log v1.2.1 cosmossdk.io/math v1.1.2 cosmossdk.io/store v1.0.0-rc.0 - cosmossdk.io/x/tx v0.9.1 + cosmossdk.io/x/tx v0.10.0 github.com/btcsuite/btcd v0.23.4 github.com/btcsuite/btcd/btcutil v1.1.3 - github.com/cometbft/cometbft v0.38.0-rc3 + github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.12.0 @@ -40,7 +40,7 @@ require ( github.com/tidwall/btree v1.6.0 google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/grpc v1.57.0 + google.golang.org/grpc v1.58.0 google.golang.org/protobuf v1.31.0 pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230830221145-a6c6454d3697 @@ -239,14 +239,14 @@ require ( github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index fed53c6e6f..80aa125500 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -35,12 +35,12 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.0 h1:QsEMIWuv9xWDbF2HZnW4Lpu1/SejCztPu0LQx7t6MN4= -cosmossdk.io/api v0.7.0/go.mod h1:kJFAEMLN57y0viszHDPLMmieF0471o5QAwwApa+270M= +cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 h1:z1aCAqEXi5fzC5tjanWnkP/zhhuWTX17IiNKxLvXFcw= +cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0/go.mod h1:h4YT2OHIBT/YIwWrc5L+4dY05ZIqvo89zs6m7j4/RSk= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= -cosmossdk.io/core v0.10.0 h1:NP28Ol9YyRODmZLJg2ko/mUl40hMegeMzhJnG+XPkcY= -cosmossdk.io/core v0.10.0/go.mod h1:MygXNld9DvMgYY4yE76DM/mdZpgfeyRjy6FPjEEehlY= +cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= @@ -51,8 +51,8 @@ cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= -cosmossdk.io/x/tx v0.9.1 h1:9pmmXA9Vs4qdouOFnzhsdsff2mif0f0kylMq5xTGhRI= -cosmossdk.io/x/tx v0.9.1/go.mod h1:/YFGTXG6+kyihd8YbfuJiXHV4R/mIMm2uvVzo80CIhA= +cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= +cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= @@ -211,8 +211,8 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.0-rc3 h1:Ly3eVPWoFu0y68PmZwLljucPdEBtfigZtqm+OV1W6dE= -github.com/cometbft/cometbft v0.38.0-rc3/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= +github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= @@ -235,8 +235,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e h1:2SGTtQzOwOMtJ5FfcLTeGvWobq8ro9UkNFmXHBpgc8g= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e/go.mod h1:olbHxcVB4zWwnF+oNPbKIoEIO5HgHndzKUqdpuu4s34= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d h1:cfoI78ri25ZSmqxS45iz3rYsNgxt6MVhFVB3A+KSyEU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d/go.mod h1:LXNFhlvJnxcUddVA+wz9o0rDE9A6Iy3omvtK7UIUY78= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -1045,8 +1045,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 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= @@ -1133,8 +1133,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1244,12 +1244,13 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 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= @@ -1259,8 +1260,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= @@ -1434,8 +1435,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index e6ed94e6ed..727921364c 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -18,15 +18,15 @@ require ( ) require ( - cosmossdk.io/api v0.7.0 // indirect + cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 // indirect cosmossdk.io/collections v0.4.0 // indirect - cosmossdk.io/core v0.10.0 // indirect + cosmossdk.io/core v0.11.0 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 // indirect cosmossdk.io/math v1.1.2 // indirect cosmossdk.io/store v1.0.0-rc.0 // indirect - cosmossdk.io/x/tx v0.9.1 // indirect + cosmossdk.io/x/tx v0.10.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect @@ -47,13 +47,13 @@ require ( github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft v0.38.0-rc3 // indirect + github.com/cometbft/cometbft v0.38.0 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e // indirect + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect @@ -174,19 +174,19 @@ require ( github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/grpc v1.58.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index b2b7c712df..9153e7080d 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -35,12 +35,12 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.0 h1:QsEMIWuv9xWDbF2HZnW4Lpu1/SejCztPu0LQx7t6MN4= -cosmossdk.io/api v0.7.0/go.mod h1:kJFAEMLN57y0viszHDPLMmieF0471o5QAwwApa+270M= +cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 h1:z1aCAqEXi5fzC5tjanWnkP/zhhuWTX17IiNKxLvXFcw= +cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0/go.mod h1:h4YT2OHIBT/YIwWrc5L+4dY05ZIqvo89zs6m7j4/RSk= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= -cosmossdk.io/core v0.10.0 h1:NP28Ol9YyRODmZLJg2ko/mUl40hMegeMzhJnG+XPkcY= -cosmossdk.io/core v0.10.0/go.mod h1:MygXNld9DvMgYY4yE76DM/mdZpgfeyRjy6FPjEEehlY= +cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= @@ -51,8 +51,8 @@ cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= -cosmossdk.io/x/tx v0.9.1 h1:9pmmXA9Vs4qdouOFnzhsdsff2mif0f0kylMq5xTGhRI= -cosmossdk.io/x/tx v0.9.1/go.mod h1:/YFGTXG6+kyihd8YbfuJiXHV4R/mIMm2uvVzo80CIhA= +cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= +cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= @@ -178,8 +178,8 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.0-rc3 h1:Ly3eVPWoFu0y68PmZwLljucPdEBtfigZtqm+OV1W6dE= -github.com/cometbft/cometbft v0.38.0-rc3/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= +github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= @@ -198,8 +198,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e h1:2SGTtQzOwOMtJ5FfcLTeGvWobq8ro9UkNFmXHBpgc8g= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e/go.mod h1:olbHxcVB4zWwnF+oNPbKIoEIO5HgHndzKUqdpuu4s34= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d h1:cfoI78ri25ZSmqxS45iz3rYsNgxt6MVhFVB3A+KSyEU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d/go.mod h1:LXNFhlvJnxcUddVA+wz9o0rDE9A6Iy3omvtK7UIUY78= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -954,8 +954,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 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= @@ -1042,8 +1042,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1150,12 +1150,13 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 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= @@ -1165,8 +1166,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= @@ -1341,8 +1342,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 50e481672d..3a21c4653a 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -22,21 +22,21 @@ require ( ) require ( - cosmossdk.io/api v0.7.0 + cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 cosmossdk.io/collections v0.4.0 // indirect - cosmossdk.io/core v0.10.0 + cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 cosmossdk.io/math v1.1.2 // indirect cosmossdk.io/store v1.0.0-rc.0 - cosmossdk.io/x/tx v0.9.1 // indirect + cosmossdk.io/x/tx v0.10.0 // indirect github.com/btcsuite/btcd v0.23.4 // indirect github.com/btcsuite/btcd/btcutil v1.1.3 // indirect - github.com/cometbft/cometbft v0.38.0-rc3 + github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect github.com/ethereum/go-ethereum v1.12.0 // indirect @@ -52,7 +52,7 @@ require ( github.com/tidwall/btree v1.6.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/grpc v1.58.0 // indirect google.golang.org/protobuf v1.31.0 // indirect ) @@ -254,14 +254,14 @@ require ( go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 1178408e8a..7ea1e707f1 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -187,14 +187,14 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.0 h1:QsEMIWuv9xWDbF2HZnW4Lpu1/SejCztPu0LQx7t6MN4= -cosmossdk.io/api v0.7.0/go.mod h1:kJFAEMLN57y0viszHDPLMmieF0471o5QAwwApa+270M= +cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 h1:z1aCAqEXi5fzC5tjanWnkP/zhhuWTX17IiNKxLvXFcw= +cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0/go.mod h1:h4YT2OHIBT/YIwWrc5L+4dY05ZIqvo89zs6m7j4/RSk= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= -cosmossdk.io/core v0.10.0 h1:NP28Ol9YyRODmZLJg2ko/mUl40hMegeMzhJnG+XPkcY= -cosmossdk.io/core v0.10.0/go.mod h1:MygXNld9DvMgYY4yE76DM/mdZpgfeyRjy6FPjEEehlY= +cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= @@ -209,8 +209,8 @@ cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 h1:axKhxRa3M9QW2GdK cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508/go.mod h1:qcJ1zwLIMefpDHZuYSa73yBe/k5HyQ5H1Jg9PWv30Ts= cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6IDE38o0Wp8xE/+BAxocb0oyX4I= cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= -cosmossdk.io/x/tx v0.9.1 h1:9pmmXA9Vs4qdouOFnzhsdsff2mif0f0kylMq5xTGhRI= -cosmossdk.io/x/tx v0.9.1/go.mod h1:/YFGTXG6+kyihd8YbfuJiXHV4R/mIMm2uvVzo80CIhA= +cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= +cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508 h1:tZ5fSX+ev+QHQ15457Vhxug8BSZJcHeBhU8DpgwlkCc= cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508/go.mod h1:M0JWINHzdN0eFHrWMs082akHHSO5muExS+/tNNIOyP8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -376,8 +376,8 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.0-rc3 h1:Ly3eVPWoFu0y68PmZwLljucPdEBtfigZtqm+OV1W6dE= -github.com/cometbft/cometbft v0.38.0-rc3/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= +github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= @@ -398,8 +398,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e h1:2SGTtQzOwOMtJ5FfcLTeGvWobq8ro9UkNFmXHBpgc8g= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230831181921-878e00a9bb6e/go.mod h1:olbHxcVB4zWwnF+oNPbKIoEIO5HgHndzKUqdpuu4s34= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d h1:cfoI78ri25ZSmqxS45iz3rYsNgxt6MVhFVB3A+KSyEU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d/go.mod h1:LXNFhlvJnxcUddVA+wz9o0rDE9A6Iy3omvtK7UIUY78= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -1247,8 +1247,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 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= @@ -1352,8 +1352,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1500,13 +1500,14 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 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= @@ -1518,8 +1519,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= @@ -1815,8 +1816,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/eth/go.mod b/eth/go.mod index c14a5265f9..9544203572 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -11,7 +11,7 @@ require ( github.com/holiman/uint256 v1.2.3 github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 - golang.org/x/text v0.12.0 + golang.org/x/text v0.13.0 pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 ) @@ -119,11 +119,11 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/sys v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect diff --git a/eth/go.sum b/eth/go.sum index 1fc858ca52..577f9a2f7a 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -328,8 +328,8 @@ golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -345,8 +345,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -382,16 +382,17 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/lib/go.mod b/lib/go.mod index a4f5c8b59c..eedb7565b2 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -15,9 +15,9 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/stretchr/testify v1.8.4 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/lib/go.sum b/lib/go.sum index 294e21fef3..e7bede382a 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -37,12 +37,12 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/magefiles/go.mod b/magefiles/go.mod index 15fe02224d..ec676f23c9 100644 --- a/magefiles/go.mod +++ b/magefiles/go.mod @@ -301,15 +301,15 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect diff --git a/magefiles/go.sum b/magefiles/go.sum index 0da813284d..93ecc16e75 100644 --- a/magefiles/go.sum +++ b/magefiles/go.sum @@ -945,8 +945,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 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= @@ -1042,8 +1042,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1145,16 +1145,17 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 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= @@ -1166,8 +1167,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 2fbdc19f96cc4dc4066608023b10f256f1c06221 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sun, 17 Sep 2023 19:28:20 -0400 Subject: [PATCH 008/122] fix(pc): negative gas consumed. (#1072) Co-authored-by: Cal Bera --- .../x/evm/plugins/precompile/plugin_test.go | 37 +++++++++++++++++++ cosmos/x/evm/plugins/precompile/recovery.go | 11 ++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/cosmos/x/evm/plugins/precompile/plugin_test.go b/cosmos/x/evm/plugins/precompile/plugin_test.go index f88499427e..61903f9a6f 100644 --- a/cosmos/x/evm/plugins/precompile/plugin_test.go +++ b/cosmos/x/evm/plugins/precompile/plugin_test.go @@ -22,6 +22,7 @@ package precompile import ( "context" + "errors" "math/big" storetypes "cosmossdk.io/store/types" @@ -98,6 +99,23 @@ var _ = Describe("plugin", func() { Expect(ms.IsReadOnly()).To(BeFalse()) Expect(cem.IsReadOnly()).To(BeFalse()) }) + + It("should catch panics and return a geth error type", func() { + _, remainingGas, err := p.Run(e, + &mockPanicking{err: storetypes.ErrorNegativeGasConsumed{Descriptor: "henlo"}}, + []byte{}, addr, new(big.Int), 30, false) + Expect(err).To(MatchError(vm.ErrOutOfGas.Error())) + Expect(remainingGas).To(Equal(uint64(0))) + }) + + It("should catch panics and propagate", func() { + Expect(func() { + _, _, _ = p.Run(e, &mockPanicking{ + err: errors.New("error"), + }, []byte{}, addr, new(big.Int), 30, false) + }, + ).To(Panic()) + }) }) var ( @@ -180,3 +198,22 @@ func (msf *mockStateful) Run( func (msf *mockStateful) RequiredGas(_ []byte) uint64 { return 1 } + +type mockPanicking struct { + err any +} // at addr 1 + +func (mp *mockPanicking) RegistryKey() common.Address { + return addr +} + +func (mp *mockPanicking) Run( + _ context.Context, _ vm.PrecompileEVM, _ []byte, + _ common.Address, _ *big.Int, +) ([]byte, error) { + panic(mp.err) +} + +func (*mockPanicking) RequiredGas(_ []byte) uint64 { + return 1 +} diff --git a/cosmos/x/evm/plugins/precompile/recovery.go b/cosmos/x/evm/plugins/precompile/recovery.go index 07de78877e..7f900a7a1d 100644 --- a/cosmos/x/evm/plugins/precompile/recovery.go +++ b/cosmos/x/evm/plugins/precompile/recovery.go @@ -29,19 +29,22 @@ import ( "pkg.berachain.dev/polaris/lib/utils" ) -// RecoveryHandler is used to recover from any WriteProtection and OutOfGas panics that occur -// during precompile execution; the handler modifies the given error to be returned to the caller. -// Any other type of panic is propogated up to the caller. +// RecoveryHandler is used to recover from any WriteProtection and gas consumption panics that +// occur during precompile execution; the handler modifies the given error to be returned to the +// caller. Any other type of panic is propogated up to the caller via panic. func RecoveryHandler(err *error) { if panicked := recover(); panicked != nil { // NOTE: this only propagates an error back to the EVM if the type of the given panic - // is ErrWriteProtection, Cosmos ErrorOutOfGas, or Cosmos ErrorGasOverflow + // is ErrWriteProtection, Cosmos ErrorOutOfGas, Cosmos ErrorGasOverflow, or Cosmos + // ErrorNegativeGasConsumed. switch { case utils.Implements[error](panicked) && errors.Is(utils.MustGetAs[error](panicked), vm.ErrWriteProtection): *err = vm.ErrWriteProtection case utils.Implements[storetypes.ErrorGasOverflow](panicked): fallthrough case utils.Implements[storetypes.ErrorOutOfGas](panicked): + fallthrough + case utils.Implements[storetypes.ErrorNegativeGasConsumed](panicked): *err = vm.ErrOutOfGas default: // any other type of panic value is ignored and passed up the call stack From 2b8760cfcdaf5fc682073a27de3f5d38c211181e Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 18 Sep 2023 11:46:47 -0400 Subject: [PATCH 009/122] refactor(node): Deprecate `graphql` (#1101) No-one uses this fr and its utilizing resources and causing flaky af tests. --- .github/workflows/e2e.yml | 2 +- cosmos/testing/e2e/polard/config/polaris.toml | 2 - e2e/hive/clients/polard/config/polaris.toml | 2 - e2e/hive/simulators/graphql/README.md | 18 --------- .../simulators/graphql/init/testGenesis.json | 39 ------------------- .../graphql/testcases/01_eth_blockNumber.json | 13 ------- .../graphql/testcases/02_eth_call_Block8.json | 16 -------- .../testcases/03_eth_call_BlockLatest.json | 16 -------- .../04_eth_estimateGas_contractDeploy.json | 11 ------ .../05_eth_estimateGas_noParams.json | 11 ------ .../06_eth_estimateGas_transfer.json | 11 ------ .../testcases/08_eth_getBalance_0x19.json | 15 ------- ..._getBalance_invalidAccountBlockNumber.json | 15 ------- ...0_eth_getBalance_invalidAccountLatest.json | 13 ------- .../testcases/11_eth_getBalance_latest.json | 14 ------- .../12_eth_getBalance_toobig_bn.json | 15 ------- .../13_eth_getBalance_without_addr.json | 21 ---------- .../testcases/14_eth_getBlock_byHash.json | 11 ------ .../15_eth_getBlock_byHashInvalid.json | 11 ------ .../testcases/16_eth_getBlock_byNumber.json | 30 -------------- .../18_eth_getBlock_wrongParams.json | 26 ------------- ...9_eth_getBlockTransactionCount_byHash.json | 11 ------ ...eth_getBlockTransactionCount_byNumber.json | 26 ------------- .../testcases/21_eth_getCode_noCode.json | 14 ------- .../graphql/testcases/22_eth_getCode.json | 14 ------- .../testcases/23_eth_getLogs_matchTopic.json | 13 ------- .../testcases/24_eth_getLogs_range.json | 11 ------ ..._getStorageAt_illegalRangeGreaterThan.json | 15 ------- .../testcases/26_eth_getStorageAt.json | 15 ------- ...th_getTransaction_byBlockHashAndIndex.json | 14 ------- ..._getTransaction_byBlockNumberAndIndex.json | 13 ------- ...nsaction_byBlockNumberAndInvalidIndex.json | 14 ------- .../30_eth_getTransaction_byHash.json | 11 ------ .../31_eth_getTransaction_byHashNull.json | 13 ------- .../testcases/32_eth_getTransactionCount.json | 15 ------- .../33_eth_getTransactionReceipt.json | 11 ------ ...h_sendRawTransaction_contractCreation.json | 9 ----- .../graphql/testcases/35_graphql_pending.json | 22 ----------- ...36_eth_sendRawTransaction_messageCall.json | 10 ----- ...37_eth_sendRawTransaction_nonceTooLow.json | 26 ------------- ..._eth_sendRawTransaction_transferEther.json | 9 ----- ...endRawTransaction_unsignedTransaction.json | 26 ------------- .../graphql/testcases/40_eth_syncing.json | 11 ------ .../testcases/41_graphql_blocks_byFrom.json | 9 ----- .../testcases/42_graphql_blocks_byRange.json | 28 ------------- .../43_graphql_blocks_byWrongRange.json | 9 ----- .../testcases/46_getBlock_byHexNumber.json | 14 ------- .../testcases/47_eth_getLogs_range_hex.json | 9 ----- .../48_transaction_fromByHexBlockNumber.json | 11 ------ e2e/testapp/docker/local/config/polaris.toml | 2 - eth/polar/.polaris.example.toml | 2 - eth/polar/node.go | 5 +-- eth/polar/polaris.go | 7 ---- go.work.sum | 10 +---- magefiles/hive.go | 2 +- 55 files changed, 5 insertions(+), 738 deletions(-) delete mode 100644 e2e/hive/simulators/graphql/README.md delete mode 100644 e2e/hive/simulators/graphql/init/testGenesis.json delete mode 100644 e2e/hive/simulators/graphql/testcases/01_eth_blockNumber.json delete mode 100644 e2e/hive/simulators/graphql/testcases/02_eth_call_Block8.json delete mode 100644 e2e/hive/simulators/graphql/testcases/03_eth_call_BlockLatest.json delete mode 100644 e2e/hive/simulators/graphql/testcases/04_eth_estimateGas_contractDeploy.json delete mode 100644 e2e/hive/simulators/graphql/testcases/05_eth_estimateGas_noParams.json delete mode 100644 e2e/hive/simulators/graphql/testcases/06_eth_estimateGas_transfer.json delete mode 100644 e2e/hive/simulators/graphql/testcases/08_eth_getBalance_0x19.json delete mode 100644 e2e/hive/simulators/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json delete mode 100644 e2e/hive/simulators/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json delete mode 100644 e2e/hive/simulators/graphql/testcases/11_eth_getBalance_latest.json delete mode 100644 e2e/hive/simulators/graphql/testcases/12_eth_getBalance_toobig_bn.json delete mode 100644 e2e/hive/simulators/graphql/testcases/13_eth_getBalance_without_addr.json delete mode 100644 e2e/hive/simulators/graphql/testcases/14_eth_getBlock_byHash.json delete mode 100644 e2e/hive/simulators/graphql/testcases/15_eth_getBlock_byHashInvalid.json delete mode 100644 e2e/hive/simulators/graphql/testcases/16_eth_getBlock_byNumber.json delete mode 100644 e2e/hive/simulators/graphql/testcases/18_eth_getBlock_wrongParams.json delete mode 100644 e2e/hive/simulators/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json delete mode 100644 e2e/hive/simulators/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json delete mode 100644 e2e/hive/simulators/graphql/testcases/21_eth_getCode_noCode.json delete mode 100644 e2e/hive/simulators/graphql/testcases/22_eth_getCode.json delete mode 100644 e2e/hive/simulators/graphql/testcases/23_eth_getLogs_matchTopic.json delete mode 100644 e2e/hive/simulators/graphql/testcases/24_eth_getLogs_range.json delete mode 100644 e2e/hive/simulators/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json delete mode 100644 e2e/hive/simulators/graphql/testcases/26_eth_getStorageAt.json delete mode 100644 e2e/hive/simulators/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json delete mode 100644 e2e/hive/simulators/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json delete mode 100644 e2e/hive/simulators/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json delete mode 100644 e2e/hive/simulators/graphql/testcases/30_eth_getTransaction_byHash.json delete mode 100644 e2e/hive/simulators/graphql/testcases/31_eth_getTransaction_byHashNull.json delete mode 100644 e2e/hive/simulators/graphql/testcases/32_eth_getTransactionCount.json delete mode 100644 e2e/hive/simulators/graphql/testcases/33_eth_getTransactionReceipt.json delete mode 100644 e2e/hive/simulators/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json delete mode 100644 e2e/hive/simulators/graphql/testcases/35_graphql_pending.json delete mode 100644 e2e/hive/simulators/graphql/testcases/36_eth_sendRawTransaction_messageCall.json delete mode 100644 e2e/hive/simulators/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json delete mode 100644 e2e/hive/simulators/graphql/testcases/38_eth_sendRawTransaction_transferEther.json delete mode 100644 e2e/hive/simulators/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json delete mode 100644 e2e/hive/simulators/graphql/testcases/40_eth_syncing.json delete mode 100644 e2e/hive/simulators/graphql/testcases/41_graphql_blocks_byFrom.json delete mode 100644 e2e/hive/simulators/graphql/testcases/42_graphql_blocks_byRange.json delete mode 100644 e2e/hive/simulators/graphql/testcases/43_graphql_blocks_byWrongRange.json delete mode 100644 e2e/hive/simulators/graphql/testcases/46_getBlock_byHexNumber.json delete mode 100644 e2e/hive/simulators/graphql/testcases/47_eth_getLogs_range_hex.json delete mode 100644 e2e/hive/simulators/graphql/testcases/48_transaction_fromByHexBlockNumber.json diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 06d062ab79..39198054ef 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -109,7 +109,7 @@ jobs: needs: build-base strategy: matrix: - simulator: [polaris/rpc, polaris/graphql] + simulator: [polaris/rpc] namespace: [cosmos] os: [polaris-linux-latest] go-version: [1.21.0] diff --git a/cosmos/testing/e2e/polard/config/polaris.toml b/cosmos/testing/e2e/polard/config/polaris.toml index 6ca7ab8216..c18b1bb2d1 100644 --- a/cosmos/testing/e2e/polard/config/polaris.toml +++ b/cosmos/testing/e2e/polard/config/polaris.toml @@ -11,8 +11,6 @@ WSHost = "0.0.0.0" WSPort = 8546 WSOrigins = ["*"] WSModules = ["eth", "net", "web3"] -GraphQLCors = ["*"] -GraphQLVirtualHosts = ["*"] [NodeConfig.HTTPTimeouts] ReadTimeout = "30s" diff --git a/e2e/hive/clients/polard/config/polaris.toml b/e2e/hive/clients/polard/config/polaris.toml index f7e754ada5..8aa0d10e2d 100644 --- a/e2e/hive/clients/polard/config/polaris.toml +++ b/e2e/hive/clients/polard/config/polaris.toml @@ -11,8 +11,6 @@ WSHost = "0.0.0.0" WSPort = 8546 WSOrigins = ["*"] WSModules = ["eth", "net", "web3"] -GraphQLCors = ["*"] -GraphQLVirtualHosts = ["*"] [NodeConfig.HTTPTimeouts] ReadTimeout = "30s" diff --git a/e2e/hive/simulators/graphql/README.md b/e2e/hive/simulators/graphql/README.md deleted file mode 100644 index 8e78305b42..0000000000 --- a/e2e/hive/simulators/graphql/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Hive GraphQL Execution Tests - -`init` contains the genesis file that the Hive instance tests on. -`testcases` contains all of the requests and expected responses. - -When running `mage hive:setup hive:testv polaris/graphql polard`, on your machine, an instance of Hive starts and tests locally against your `testcases` folder and checks that each GraphQL request results in the expected response. - -No additional files are needed as most of the core logic for running the tests are contained within the Hive instance, which, as previously mentioned, is already set up for you after running `mage hive:setup`. - -# How to run the tests - -You must build a Polard image first, do so by running `mage cosmos:testHive polaris/graphql`. This builds a fresh Docker image for Polard in which to run your tests on. The tests will run after this. - -After building an image, if you want to modify a testcase or the genesis, simply run `mage hive:setup hive:test polaris/graphql polard` after making your changes. - -NOTE: If you change any of the core Polaris EVM logic in `./eth/...`, you must rebuild your Polard image. - - diff --git a/e2e/hive/simulators/graphql/init/testGenesis.json b/e2e/hive/simulators/graphql/init/testGenesis.json deleted file mode 100644 index 9a9586e3b3..0000000000 --- a/e2e/hive/simulators/graphql/init/testGenesis.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "config": { - "chainId": 2061, - "homesteadBlock": 0, - "daoForkBlock": 0, - "daoForkSupport": true, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "arrowGlacierBlock": 0, - "grayGlacierBlock": 0, - "mergeNetsplitBlock": 0, - "shanghaiTime": 0, - "terminalTotalDifficulty": 0, - "terminalTotalDifficultyPassed": true - }, - "nonce": "0x0", - "timestamp": "0x0", - "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", - "gasLimit": "0x1c9c380", - "difficulty": "0x0", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "20f33ce90a13a4b5e7697e3544c3083b8f8a51d4": { - "balance": "0x4563918244f40000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "baseFeePerGas": null -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/01_eth_blockNumber.json b/e2e/hive/simulators/graphql/testcases/01_eth_blockNumber.json deleted file mode 100644 index 5150757d3f..0000000000 --- a/e2e/hive/simulators/graphql/testcases/01_eth_blockNumber.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": - "{ block(number: 0) { number } }", - - "responses": [{ - "data" : { - "block" : { - "number" : "0x0" - } - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/02_eth_call_Block8.json b/e2e/hive/simulators/graphql/testcases/02_eth_call_Block8.json deleted file mode 100644 index b0aaf5e85e..0000000000 --- a/e2e/hive/simulators/graphql/testcases/02_eth_call_Block8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "request": "{block(number :1) {call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x12a7b914\"}){data status}}}", - "responses": [ - { - "data": { - "block": { - "call": { - "data": "0x", - "status": "0x1" - } - } - } - } - ], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/03_eth_call_BlockLatest.json b/e2e/hive/simulators/graphql/testcases/03_eth_call_BlockLatest.json deleted file mode 100644 index f36e148e61..0000000000 --- a/e2e/hive/simulators/graphql/testcases/03_eth_call_BlockLatest.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "request": "{block(number: 0) {number call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x12a7b914\"}){data status}}}" - , - "responses":[{ - "data" : { - "block" : { - "number" : "0x0", - "call" : { - "data" : "0x", - "status" : "0x1" - } - } - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/04_eth_estimateGas_contractDeploy.json b/e2e/hive/simulators/graphql/testcases/04_eth_estimateGas_contractDeploy.json deleted file mode 100644 index 2c658cd7b8..0000000000 --- a/e2e/hive/simulators/graphql/testcases/04_eth_estimateGas_contractDeploy.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request" :"{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029\"})}}", - "responses":[{ - "data" : { - "block" : { - "estimateGas" : "0x253ea" - } - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/05_eth_estimateGas_noParams.json b/e2e/hive/simulators/graphql/testcases/05_eth_estimateGas_noParams.json deleted file mode 100644 index aa3bda1866..0000000000 --- a/e2e/hive/simulators/graphql/testcases/05_eth_estimateGas_noParams.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request" :"{block{ estimateGas(data:{}) }}", - "responses":[{ - "data" : { - "block" : { - "estimateGas" : "0xf870" - } - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/06_eth_estimateGas_transfer.json b/e2e/hive/simulators/graphql/testcases/06_eth_estimateGas_transfer.json deleted file mode 100644 index 5df69f7a02..0000000000 --- a/e2e/hive/simulators/graphql/testcases/06_eth_estimateGas_transfer.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request" :"{block{estimateGas (data: {from :\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", to :\"0x8888f1f195afa192cfee860698584c030f4c9db1\"})}}", - "responses":[{ - "data" : { - "block" : { - "estimateGas" : "0x6270" - } - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/08_eth_getBalance_0x19.json b/e2e/hive/simulators/graphql/testcases/08_eth_getBalance_0x19.json deleted file mode 100644 index 1477cde1ef..0000000000 --- a/e2e/hive/simulators/graphql/testcases/08_eth_getBalance_0x19.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block (number : 1) {account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - } - ], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json b/e2e/hive/simulators/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json deleted file mode 100644 index 2027ecede4..0000000000 --- a/e2e/hive/simulators/graphql/testcases/09_eth_getBalance_invalidAccountBlockNumber.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block (number: 2) {account(address: \"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\") { balance } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json b/e2e/hive/simulators/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json deleted file mode 100644 index 885795588e..0000000000 --- a/e2e/hive/simulators/graphql/testcases/10_eth_getBalance_invalidAccountLatest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": "{block{account(address: \"0xdeaff00ddeaff00ddeaff00ddeaff00ddeaff00d\") { balance } }}", - "responses": [{ - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/11_eth_getBalance_latest.json b/e2e/hive/simulators/graphql/testcases/11_eth_getBalance_latest.json deleted file mode 100644 index c49aab4602..0000000000 --- a/e2e/hive/simulators/graphql/testcases/11_eth_getBalance_latest.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": "{block{account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance } }}", - "responses":[{ - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - }], - "statusCode": 200 -} - diff --git a/e2e/hive/simulators/graphql/testcases/12_eth_getBalance_toobig_bn.json b/e2e/hive/simulators/graphql/testcases/12_eth_getBalance_toobig_bn.json deleted file mode 100644 index d0e2166254..0000000000 --- a/e2e/hive/simulators/graphql/testcases/12_eth_getBalance_toobig_bn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block (number: 2) {account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "balance": "0x0" - } - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/13_eth_getBalance_without_addr.json b/e2e/hive/simulators/graphql/testcases/13_eth_getBalance_without_addr.json deleted file mode 100644 index 54bb700d1c..0000000000 --- a/e2e/hive/simulators/graphql/testcases/13_eth_getBalance_without_addr.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "request": "{block{account { balance } }}", - "responses": [{ - "errors": [ - { - "message": "Validation error of type MissingFieldArgument: Missing field argument address @ 'account'", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "extensions": { - "classification": "ValidationError" - } - } - ] - }], - "statusCode": 400 -} - diff --git a/e2e/hive/simulators/graphql/testcases/14_eth_getBlock_byHash.json b/e2e/hive/simulators/graphql/testcases/14_eth_getBlock_byHash.json deleted file mode 100644 index bc85212d4f..0000000000 --- a/e2e/hive/simulators/graphql/testcases/14_eth_getBlock_byHash.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{block (hash : \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") {number transactions{hash} timestamp totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}} ", - "responses": [ - { - "data": { - "block": null - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/15_eth_getBlock_byHashInvalid.json b/e2e/hive/simulators/graphql/testcases/15_eth_getBlock_byHashInvalid.json deleted file mode 100644 index c33993eafd..0000000000 --- a/e2e/hive/simulators/graphql/testcases/15_eth_getBlock_byHashInvalid.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{block (hash : \"0x123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0\") {number } }", - "responses": [ - { - "data": { - "block": null - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/16_eth_getBlock_byNumber.json b/e2e/hive/simulators/graphql/testcases/16_eth_getBlock_byNumber.json deleted file mode 100644 index 38b84f3a5c..0000000000 --- a/e2e/hive/simulators/graphql/testcases/16_eth_getBlock_byNumber.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "request": "{block (number : 1) { difficulty totalDifficulty gasUsed gasLimit nonce ommerCount logsBloom mixHash ommerHash extraData receiptsRoot transactionCount transactionsRoot ommers{hash} ommerAt(index : 1){hash} account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\"){balance} }} ", - "responses": [ - { - "data": { - "block": { - "account": { - "balance": "0x0" - }, - "difficulty": "0x0", - "extraData": "0x", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x0000000000000000", - "ommerAt": null, - "ommerCount": "0x0", - "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "ommers": [], - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "totalDifficulty": "0x0", - "transactionCount": "0x0", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/18_eth_getBlock_wrongParams.json b/e2e/hive/simulators/graphql/testcases/18_eth_getBlock_wrongParams.json deleted file mode 100644 index fed0b12c7f..0000000000 --- a/e2e/hive/simulators/graphql/testcases/18_eth_getBlock_wrongParams.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "{block (number: \"0x02\", hash : \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") {number transactions{hash} timestamp difficulty totalDifficulty gasUsed gasLimit hash nonce ommerCount logsBloom mixHash ommerHash extraData stateRoot receiptsRoot transactionCount transactionsRoot}} ", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/block) : Invalid params", - "locations": [ - { - "line": 1, - "column": 2 - } - ], - "path": [ - "block" - ], - "extensions": { - "errorCode": -32602, - "errorMessage": "Invalid params", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json b/e2e/hive/simulators/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json deleted file mode 100644 index 6c517afdf3..0000000000 --- a/e2e/hive/simulators/graphql/testcases/19_eth_getBlockTransactionCount_byHash.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{block (hash : \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") {transactionCount}} ", - "responses": [ - { - "data": { - "block": null - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json b/e2e/hive/simulators/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json deleted file mode 100644 index a1d8ee1ed0..0000000000 --- a/e2e/hive/simulators/graphql/testcases/20_eth_getBlockTransactionCount_byNumber.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "{block (number : 1) {transactions{hash} difficulty totalDifficulty gasUsed gasLimit nonce ommerCount logsBloom mixHash ommerHash extraData receiptsRoot transactionCount transactionsRoot}} ", - "responses": [ - { - "data": { - "block": { - "difficulty": "0x0", - "extraData": "0x", - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x0000000000000000", - "ommerCount": "0x0", - "ommerHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "totalDifficulty": "0x0", - "transactionCount": "0x0", - "transactions": [], - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/21_eth_getCode_noCode.json b/e2e/hive/simulators/graphql/testcases/21_eth_getCode_noCode.json deleted file mode 100644 index f70d77d1d1..0000000000 --- a/e2e/hive/simulators/graphql/testcases/21_eth_getCode_noCode.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request" : "{block{ account(address: \"0x8888f1f195afa192cfee860698584c030f4c9db1\") { code } }}", - - "responses": [{ - "data": { - "block": { - "account": { - "code": "0x" - } - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/22_eth_getCode.json b/e2e/hive/simulators/graphql/testcases/22_eth_getCode.json deleted file mode 100644 index 076ae39998..0000000000 --- a/e2e/hive/simulators/graphql/testcases/22_eth_getCode.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request" : "{block{ account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { code } }}", - - "responses": [{ - "data": { - "block": { - "account": { - "code": "0x" - } - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/23_eth_getLogs_matchTopic.json b/e2e/hive/simulators/graphql/testcases/23_eth_getLogs_matchTopic.json deleted file mode 100644 index 002f00fe04..0000000000 --- a/e2e/hive/simulators/graphql/testcases/23_eth_getLogs_matchTopic.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": "{ block(number: 1) { logs( filter: { topics : [[\"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b\", \"0x65c9ac8011e286e89d02a269890f41d67ca2cc597b2c76c7c69321ff492be580\"]]}) { index topics data account{address} transaction{hash} } } }", - "responses": [ - { - "data": { - "block": { - "logs": [] - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/24_eth_getLogs_range.json b/e2e/hive/simulators/graphql/testcases/24_eth_getLogs_range.json deleted file mode 100644 index 6591251bab..0000000000 --- a/e2e/hive/simulators/graphql/testcases/24_eth_getLogs_range.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{ logs( filter: { fromBlock:20, toBlock: 24, topics : [], addresses : []}) { index topics data account{address} transaction{hash block {number}} } }", - "responses": [ - { - "data": { - "logs": [] - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json b/e2e/hive/simulators/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json deleted file mode 100644 index 4995192765..0000000000 --- a/e2e/hive/simulators/graphql/testcases/25_eth_getStorageAt_illegalRangeGreaterThan.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block{ account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { storage(slot: \"0x0000000000000000000000000000000000000000000000000000000000000021\") } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/26_eth_getStorageAt.json b/e2e/hive/simulators/graphql/testcases/26_eth_getStorageAt.json deleted file mode 100644 index 68cbd6aa2f..0000000000 --- a/e2e/hive/simulators/graphql/testcases/26_eth_getStorageAt.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block{ account(address: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { storage(slot: \"0x0000000000000000000000000000000000000000000000000000000000000004\") } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "storage": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json b/e2e/hive/simulators/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json deleted file mode 100644 index 7f2515b8c3..0000000000 --- a/e2e/hive/simulators/graphql/testcases/27_eth_getTransaction_byBlockHashAndIndex.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": - - "{ block(hash: \"0xc8df1f061abb4d0c107b2b1a794ade8780b3120e681f723fe55a7be586d95ba6\") { transactionAt(index: 0) {block{hash} hash } } }", - - "responses":[{ - "data" : { - "block" : null - - } - }], - - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json b/e2e/hive/simulators/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json deleted file mode 100644 index e61334b5d1..0000000000 --- a/e2e/hive/simulators/graphql/testcases/28_eth_getTransaction_byBlockNumberAndIndex.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": "{ block(number: 0) { transactionAt(index: 0) {block{hash} hash} } }", - "responses": [ - { - "data": { - "block": { - "transactionAt": null - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json b/e2e/hive/simulators/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json deleted file mode 100644 index fa6e532226..0000000000 --- a/e2e/hive/simulators/graphql/testcases/29_eth_getTransaction_byBlockNumberAndInvalidIndex.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": - - "{ block(number: 0) { transactionAt(index: 1) {block{hash} hash} } }", - - "responses":[{ - "data" : { - "block" : { - "transactionAt": null - } - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/30_eth_getTransaction_byHash.json b/e2e/hive/simulators/graphql/testcases/30_eth_getTransaction_byHash.json deleted file mode 100644 index 94cfde28bc..0000000000 --- a/e2e/hive/simulators/graphql/testcases/30_eth_getTransaction_byHash.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{transaction (hash : \"0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block{hash} gas gasPrice hash inputData nonce index value from {address} to {address} logs{index} status createdContract{address} } } ", - "responses": [ - { - "data": { - "transaction": null - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/31_eth_getTransaction_byHashNull.json b/e2e/hive/simulators/graphql/testcases/31_eth_getTransaction_byHashNull.json deleted file mode 100644 index cf238cb74e..0000000000 --- a/e2e/hive/simulators/graphql/testcases/31_eth_getTransaction_byHashNull.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "request": - - "{transaction (hash : \"0xffc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block{hash} gas gasPrice hash inputData nonce index value }} ", - - - "responses": [{ - "data" : { - "transaction" : null - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/32_eth_getTransactionCount.json b/e2e/hive/simulators/graphql/testcases/32_eth_getTransactionCount.json deleted file mode 100644 index ef9437c886..0000000000 --- a/e2e/hive/simulators/graphql/testcases/32_eth_getTransactionCount.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "request": "{block{ account(address: \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\") { transactionCount } }}", - "responses": [ - { - "data": { - "block": { - "account": { - "transactionCount": "0x0" - } - } - } - } - ], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/33_eth_getTransactionReceipt.json b/e2e/hive/simulators/graphql/testcases/33_eth_getTransactionReceipt.json deleted file mode 100644 index cc839dbd70..0000000000 --- a/e2e/hive/simulators/graphql/testcases/33_eth_getTransactionReceipt.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{ transaction(hash: \"0x812742182a79a8e67733edc58cfa3767aa2d7ad06439d156ddbbb33e3403b4ed\") {block{hash logsBloom} hash createdContract{address} cumulativeGasUsed gas gasUsed logs{topics} from{address} to{address} index } }", - "responses": [ - { - "data": { - "transaction": null - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json b/e2e/hive/simulators/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json deleted file mode 100644 index 54c7174960..0000000000 --- a/e2e/hive/simulators/graphql/testcases/34_eth_sendRawTransaction_contractCreation.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request" : "mutation { sendRawTransaction(data: \"0xf901ca3285174876e800830fffff8080b90177608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb00291ca05d71c687073e23402e59853d85c587f6eebc735082f40a450e407451b42ee2a4a07d4f2db1717dc9be745b991962193fa0d5f6059b9c92350dba3efe3a99df6b52\") }", - "responses":[{ - "data" : { - "sendRawTransaction" : "0xf9a25e1d6202e9ea1d984f76939e9bb3609bfb9aea2541ae8a629270343fbb2f" - } - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/35_graphql_pending.json b/e2e/hive/simulators/graphql/testcases/35_graphql_pending.json deleted file mode 100644 index 6994b40e52..0000000000 --- a/e2e/hive/simulators/graphql/testcases/35_graphql_pending.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "request": "{ pending { transactionCount transactions { nonce gas } account(address:\"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\") { balance} estimateGas(data:{}) call (data : {from : \"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b\", to: \"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f\", data :\"0x12a7b914\"}){data status}} }", - "responses": [ - { - "data": { - "pending": { - "account": { - "balance": "0x0" - }, - "call": { - "data": "0x", - "status": "0x1" - }, - "estimateGas": "0xf870", - "transactionCount": "0x0", - "transactions": [] - } - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/36_eth_sendRawTransaction_messageCall.json b/e2e/hive/simulators/graphql/testcases/36_eth_sendRawTransaction_messageCall.json deleted file mode 100644 index f347b376c9..0000000000 --- a/e2e/hive/simulators/graphql/testcases/36_eth_sendRawTransaction_messageCall.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "request" : "mutation { sendRawTransaction(data: \"0xf8693785174876e800830fffff94450b61224a7df4d8a70f3e20d4fd6a6380b920d180843bdab8bf1ba054b00220864ab58246bbe0a6f6d50166f9bd0ba3f1711912f79c073da6368ca5a04f84bc3231ee4406b8ceb8740d6d8d1900f87b67b9f4a0a38bc55062121a94c6\") }", - "responses":[{ - "data" : { - "sendRawTransaction" : "0x6ad12f495251471d1834852623c2eeb2cb04d2fb9e1a5d6cff481cfec7b233a8" - } - }], - - "statusCode": 400 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json b/e2e/hive/simulators/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json deleted file mode 100644 index 5d677670fc..0000000000 --- a/e2e/hive/simulators/graphql/testcases/37_eth_sendRawTransaction_nonceTooLow.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "mutation { sendRawTransaction(data: \"0xf86410018304cb2f946295ee1b4f6dd65047762f924ecd367c17eabf8f0a8457cb2fc41ca0060dc80554e845b572ab6b88dab08f7491f83b4405fea2f067a80b3742127fb0a0246160f01d027a0335be590d443335ecb2cf5d9f9589c8efffa4acbda4acafea\") }", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/sendRawTransaction) : Nonce too low", - "locations": [ - { - "line": 1, - "column": 12 - } - ], - "path": [ - "sendRawTransaction" - ], - "extensions": { - "errorCode": -32001, - "errorMessage": "Nonce too low", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/38_eth_sendRawTransaction_transferEther.json b/e2e/hive/simulators/graphql/testcases/38_eth_sendRawTransaction_transferEther.json deleted file mode 100644 index aed734b9cf..0000000000 --- a/e2e/hive/simulators/graphql/testcases/38_eth_sendRawTransaction_transferEther.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request" : "mutation { sendRawTransaction(data: \"0xf86d3785174876e801830222e0945aae326516b4f8fe08074b7e972e40a713048d628829a2241af62c0000801ca077d36666ce36d433b6f1ac62eafe7a232354c83ad2293cfcc2445a86bcd08b4da04b8bd0918d440507ab81d47cf562addaa15a1d28ac701989f5141c8da49615d0\") }", - "responses":[{ - "data" : { - "sendRawTransaction" : "0x772b6d5c64b9798865d6dfa35ba44d181abd96a448f8ab7ea9e9631cabb7b290" - } - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json b/e2e/hive/simulators/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json deleted file mode 100644 index 30b83680aa..0000000000 --- a/e2e/hive/simulators/graphql/testcases/39_eth_sendRawTransaction_unsignedTransaction.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "request": "mutation { sendRawTransaction(data: \"0xed0a85174876e800830222e0945aae326516b4f8fe08074b7e972e40a713048d62880de0b6b3a7640000801c8080\") }", - "responses": [{ - "errors": [ - { - "message": "Exception while fetching data (/sendRawTransaction) : Invalid params", - "locations": [ - { - "line": 1, - "column": 12 - } - ], - "path": [ - "sendRawTransaction" - ], - "extensions": { - "errorCode": -32602, - "errorMessage": "Invalid params", - "classification": "DataFetchingException" - } - } - ], - "data": null - }], - "statusCode": 400 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/40_eth_syncing.json b/e2e/hive/simulators/graphql/testcases/40_eth_syncing.json deleted file mode 100644 index 3c9a1997c3..0000000000 --- a/e2e/hive/simulators/graphql/testcases/40_eth_syncing.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": - "{ syncing {startingBlock currentBlock highestBlock } }", - - "responses": [{ - "data" : { - "syncing" : null - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/41_graphql_blocks_byFrom.json b/e2e/hive/simulators/graphql/testcases/41_graphql_blocks_byFrom.json deleted file mode 100644 index 1142d84c46..0000000000 --- a/e2e/hive/simulators/graphql/testcases/41_graphql_blocks_byFrom.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request": "{ blocks(from:30) { number } }", - "responses": [{ - "data": { - "blocks": [ ] - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/42_graphql_blocks_byRange.json b/e2e/hive/simulators/graphql/testcases/42_graphql_blocks_byRange.json deleted file mode 100644 index 9e74711141..0000000000 --- a/e2e/hive/simulators/graphql/testcases/42_graphql_blocks_byRange.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "request": "{blocks (from : 1, to: 2) { number gasUsed gasLimit nonce receiptsRoot transactionCount }} ", - "responses": [ - { - "data": { - "blocks": [ - { - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "nonce": "0x0000000000000000", - "number": "0x1", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "transactionCount": "0x0" - }, - { - "gasLimit": "0x1c9c380", - "gasUsed": "0x0", - "nonce": "0x0000000000000000", - "number": "0x2", - "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "transactionCount": "0x0" - } - ] - } - } - ], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/43_graphql_blocks_byWrongRange.json b/e2e/hive/simulators/graphql/testcases/43_graphql_blocks_byWrongRange.json deleted file mode 100644 index 3f2aa22d4b..0000000000 --- a/e2e/hive/simulators/graphql/testcases/43_graphql_blocks_byWrongRange.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request": "{blocks (from : \"0x1e\", to: \"0x1c\") { number gasUsed gasLimit hash nonce stateRoot receiptsRoot transactionCount }} ", - "responses": [{ - "data": { - "blocks": [] - } - }], - "statusCode": 200 -} \ No newline at end of file diff --git a/e2e/hive/simulators/graphql/testcases/46_getBlock_byHexNumber.json b/e2e/hive/simulators/graphql/testcases/46_getBlock_byHexNumber.json deleted file mode 100644 index 81e33c7614..0000000000 --- a/e2e/hive/simulators/graphql/testcases/46_getBlock_byHexNumber.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "request": "{block (number : \"0x1\") { gasUsed gasLimit }} ", - "responses": [ - { - "data": { - "block": { - "gasLimit": "0x1c9c380", - "gasUsed": "0x0" - } - } - } - ], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/47_eth_getLogs_range_hex.json b/e2e/hive/simulators/graphql/testcases/47_eth_getLogs_range_hex.json deleted file mode 100644 index bd315dec5b..0000000000 --- a/e2e/hive/simulators/graphql/testcases/47_eth_getLogs_range_hex.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request": "{ logs( filter: { fromBlock:\"0x14\", toBlock: \"0x18\", topics : [], addresses : []}) { index transaction{hash} } }", - "responses": [{ - "data": { - "logs": [] - } - }], - "statusCode": 200 -} diff --git a/e2e/hive/simulators/graphql/testcases/48_transaction_fromByHexBlockNumber.json b/e2e/hive/simulators/graphql/testcases/48_transaction_fromByHexBlockNumber.json deleted file mode 100644 index db6c4b2a98..0000000000 --- a/e2e/hive/simulators/graphql/testcases/48_transaction_fromByHexBlockNumber.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "request": "{transaction (hash : \"0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block { number } from(block: \"0x1d\") {transactionCount}} } ", - "responses": [ - { - "data": { - "transaction":null - } - } - ], - "statusCode": 200 -} diff --git a/e2e/testapp/docker/local/config/polaris.toml b/e2e/testapp/docker/local/config/polaris.toml index 6ca7ab8216..c18b1bb2d1 100644 --- a/e2e/testapp/docker/local/config/polaris.toml +++ b/e2e/testapp/docker/local/config/polaris.toml @@ -11,8 +11,6 @@ WSHost = "0.0.0.0" WSPort = 8546 WSOrigins = ["*"] WSModules = ["eth", "net", "web3"] -GraphQLCors = ["*"] -GraphQLVirtualHosts = ["*"] [NodeConfig.HTTPTimeouts] ReadTimeout = "30s" diff --git a/eth/polar/.polaris.example.toml b/eth/polar/.polaris.example.toml index 6b8ef10fda..61e71b38da 100644 --- a/eth/polar/.polaris.example.toml +++ b/eth/polar/.polaris.example.toml @@ -15,8 +15,6 @@ WSHost = "0.0.0.0" WSPort = 8546 WSOrigins = ["*"] WSModules = ["eth", "net"] -GraphQLCors = ["*"] -GraphQLVirtualHosts = ["0.0.0.0"] [NodeConfig.HTTPTimeouts] ReadTimeout = "30s" diff --git a/eth/polar/node.go b/eth/polar/node.go index 406b5d6ef4..202535b8af 100644 --- a/eth/polar/node.go +++ b/eth/polar/node.go @@ -24,8 +24,7 @@ import ( "github.com/ethereum/go-ethereum/node" ) -// Node is a wrapper around the go-ethereum node.Node object, that allows us to conform to the -// NetworkingStack interface, we have to do some hacky stuff to initialize the graphql service, +// Node is a wrapper around the go-ethereum node.Node object. // TODO: deprecate this and use a more elegant solution. type Node struct { *node.Node @@ -68,7 +67,5 @@ func DefaultGethNodeConfig() *node.Config { nodeCfg.WSOrigins = []string{"*"} nodeCfg.HTTPCors = []string{"*"} nodeCfg.HTTPVirtualHosts = []string{"*"} - nodeCfg.GraphQLCors = []string{"*"} - nodeCfg.GraphQLVirtualHosts = []string{"*"} return &nodeCfg } diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index e6380fe34a..fe571d8f57 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -27,7 +27,6 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/filters" - "github.com/ethereum/go-ethereum/graphql" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/log" @@ -138,12 +137,6 @@ func (pl *Polaris) StartServices() error { // Register the filter API separately in order to get access to the filterSystem pl.filterSystem = utils.RegisterFilterAPI(pl.stack, pl.backend, &defaultEthConfig) - // Register the GraphQL API (todo update cors stuff) - // TODO: gate this behind a flag - if err := graphql.New(pl.stack, pl.backend, pl.filterSystem, []string{"*"}, []string{"*"}); err != nil { - return err - } - go func() { // TODO: unhack this. time.Sleep(2 * time.Second) //nolint:gomnd // we will fix this eventually. diff --git a/go.work.sum b/go.work.sum index ab7d330f4f..c9f3d23195 100644 --- a/go.work.sum +++ b/go.work.sum @@ -129,11 +129,7 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= -cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= cosmossdk.io/math v1.0.1/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= -cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508 h1:tZ5fSX+ev+QHQ15457Vhxug8BSZJcHeBhU8DpgwlkCc= -cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508/go.mod h1:M0JWINHzdN0eFHrWMs082akHHSO5muExS+/tNNIOyP8= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= @@ -238,7 +234,9 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZi github.com/emicklei/dot v1.4.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= @@ -490,8 +488,6 @@ github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZ github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tetafro/godot v1.4.14 h1:ScO641OHpf9UpHPk8fCknSuXNMpi4iFlwuWoBs3L+1s= -github.com/tetafro/godot v1.4.14/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= @@ -526,8 +522,6 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4 go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.tmz.dev/musttag v0.7.2 h1:1J6S9ipDbalBSODNT5jCep8dhZyMr4ttnjQagmGYR5s= -go.tmz.dev/musttag v0.7.2/go.mod h1:m6q5NiiSKMnQYokefa2xGoyoXnrswCbJ0AWYzf4Zs28= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= diff --git a/magefiles/hive.go b/magefiles/hive.go index cf99b406c7..aedffe2877 100644 --- a/magefiles/hive.go +++ b/magefiles/hive.go @@ -55,7 +55,7 @@ var ( simulations = []tests{ {"rpc", []string{"init/genesis.json", "ethclient.hive"}}, {"rpc-compat", []string{"Dockerfile", "tests"}}, - {"graphql", []string{"testcases", "init/testGenesis.json"}}} + } ) type Hive mg.Namespace From faec924964107959fa7ba7abdce8d44081c9f48c Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Mon, 18 Sep 2023 17:09:00 -0400 Subject: [PATCH 010/122] feat(docs): Add more documentation for the precompiled contracts (#1100) Co-authored-by: Devon Bear --- contracts/src/cosmos/precompile/Bank.sol | 52 +++++++++++------- .../src/cosmos/precompile/Distribution.sol | 5 +- .../src/cosmos/precompile/Governance.sol | 33 ++++++------ contracts/src/cosmos/precompile/Staking.sol | 53 ++++++++++++++----- 4 files changed, 97 insertions(+), 46 deletions(-) diff --git a/contracts/src/cosmos/precompile/Bank.sol b/contracts/src/cosmos/precompile/Bank.sol index 4fc529dd41..befb0fa75b 100644 --- a/contracts/src/cosmos/precompile/Bank.sol +++ b/contracts/src/cosmos/precompile/Bank.sol @@ -35,93 +35,109 @@ interface IBankModule { /** * @dev Emitted by the bank module when `amount` tokens are sent to `recipient` + * @param recipient The recipient address + * @param amount The amount of Cosmos coins sent */ event Transfer(address indexed recipient, Cosmos.Coin[] amount); /** * @dev Emitted by the bank module when `sender` sends some amount of tokens + * @param sender The sender address */ event Message(address indexed sender); /** * @dev Emitted by the bank module when `amount` tokens are spent by `spender` + * @param spender The spender address + * @param amount The amount of Cosmos coins spent */ event CoinSpent(address indexed spender, Cosmos.Coin[] amount); /** * @dev Emitted by the bank module when `amount` tokens are received by `receiver` + * @param receiver The receiver address + * @param amount The amount of Cosmos coins received */ event CoinReceived(address indexed receiver, Cosmos.Coin[] amount); /** * @dev Emitted by the bank module when `amount` tokens are minted by `minter` - * - * Note: "Coinbase" refers to the Cosmos event: EventTypeCoinMint. `minter` is a module - * address. + * @param minter The minter address + * @param amount The amount of Cosmos coins minted + * @notice "Coinbase" refers to the Cosmos event: `EventTypeCoinMint` + * @notice `minter` is always a module address */ event Coinbase(address indexed minter, Cosmos.Coin[] amount); /** * @dev Emitted by the bank module when `amount` tokens are burned by `burner` - * - * Note: `burner` is a module address + * @param burner The burner address + * @param amount The amount of Cosmos coins burned + * @notice `burner` is always a module address */ event Burn(address indexed burner, Cosmos.Coin[] amount); /////////////////////////////////////// READ METHODS ////////////////////////////////////////// /** - * @dev Returns the `amount` of account balance by address for a given denomination. + * @dev Returns the `amount` of account balance by address for a given coin denomination + * @notice If the denomination is not found, returns 0 */ function getBalance(address accountAddress, string calldata denom) external view returns (uint256); /** - * @dev Returns account balance by address for all denominations. + * @dev Returns account balance by address for all denominations + * @notice If the account address is not found, returns an empty array */ function getAllBalances(address accountAddress) external view returns (Cosmos.Coin[] memory); /** - * @dev Returns the `amount` of account balance by address for a given denomination. + * @dev Returns the `amount` of account balance by address for a given coin denomination + * @notice If the denomination is not found, returns 0 */ function getSpendableBalance(address accountAddress, string calldata denom) external view returns (uint256); /** - * @dev Returns account balance by address for all denominations. + * @dev Returns account balance by address for all coin denominations + * @notice If the account address is not found, returns an empty array */ function getAllSpendableBalances(address accountAddress) external view returns (Cosmos.Coin[] memory); /** - * @dev Returns the total supply of a single coin. + * @dev Returns the total supply of a single coin */ function getSupply(string calldata denom) external view returns (uint256); /** - * @dev Returns the total supply of a all coins. + * @dev Returns the total supply of a all coins */ function getAllSupply() external view returns (Cosmos.Coin[] memory); /** - * @dev Returns the denomination's metadata. + * @dev Returns the coin denomination's metadata */ function getDenomMetadata(string calldata denom) external view returns (DenomMetadata memory); /** - * @dev Returns if the denom is enabled to send + * @dev Returns if the coin is enabled to be sent (transfered) */ function getSendEnabled(string calldata denom) external view returns (bool); ////////////////////////////////////// WRITE METHODS ////////////////////////////////////////// /** - * @dev Send coins from msg.sender to another. + * @dev Send coins from msg.sender to another + * @param toAddress The recipient address + * @param amount The amount of Cosmos coins to send + * @notice If the sender does not have enough balance, returns false */ function send(address toAddress, Cosmos.Coin[] calldata amount) external payable returns (bool); //////////////////////////////////////////// UTILS //////////////////////////////////////////// /** - * @dev Represents a denom unit. - * Note: this struct is generated in generated/i_bank_module.abigen.go + * @dev Represents a denom unit in the bank module + * @notice this struct is generated in generated/i_bank_module.abigen.go */ struct DenomUnit { string denom; @@ -130,8 +146,8 @@ interface IBankModule { } /** - * @dev Represents a denom metadata. - * Note: this struct is generated in generated/i_bank_module.abigen.go + * @dev Represents a denom metadata in the bank module + * @notice this struct is generated in generated/i_bank_module.abigen.go */ struct DenomMetadata { string description; diff --git a/contracts/src/cosmos/precompile/Distribution.sol b/contracts/src/cosmos/precompile/Distribution.sol index 1b702fa047..e959fe8a3c 100644 --- a/contracts/src/cosmos/precompile/Distribution.sol +++ b/contracts/src/cosmos/precompile/Distribution.sol @@ -46,7 +46,7 @@ interface IDistributionModule { /** * @dev Withdraw the rewrads accumulated by the caller(msg.sender). Returns the rewards claimed. * @param delegator The delegator to withdraw the rewards from. - * @param validator The validator to withdraw the rewards from. + * @param validator The validator (operator address) to withdraw the rewards from. */ function withdrawDelegatorReward(address delegator, address validator) external returns (Cosmos.Coin[] memory); @@ -77,6 +77,9 @@ interface IDistributionModule { */ event SetWithdrawAddress(address indexed withdrawAddress); + /** + * @dev Represents a delegator's rewards for one particular validator. + */ struct ValidatorReward { address validator; Cosmos.Coin[] rewards; diff --git a/contracts/src/cosmos/precompile/Governance.sol b/contracts/src/cosmos/precompile/Governance.sol index d2d83f2f01..13e6ccde28 100644 --- a/contracts/src/cosmos/precompile/Governance.sol +++ b/contracts/src/cosmos/precompile/Governance.sol @@ -27,18 +27,23 @@ pragma solidity ^0.8.4; import {Cosmos} from "../CosmosTypes.sol"; +/** + * @dev Interface of the governance module's precompiled contract + */ interface IGovernanceModule { ////////////////////////////////////////// Write Methods ///////////////////////////////////////////// /** - * @dev Submit a proposal to the governance module. Returns the proposal id. - * @param proposalMsg The proposal to submit. + * @dev Submit a proposal to the governance module. + * @param proposalMsg The proposal to submit (as marshaled bytes). NOTE: use the codec to + * marshal the proposal message. + * @return The id of the proposal. */ function submitProposal(bytes calldata proposalMsg) external returns (uint64); /** - * @dev Cancel a proposal. Returns the cancled time and height. - * burned. + * @dev Cancel a proposal. * @param proposalId The id of the proposal to cancel. + * @return The time and block height the proposal was canceled. */ function cancelProposal(uint64 proposalId) external returns (uint64, uint64); @@ -82,6 +87,7 @@ interface IGovernanceModule { /** * @dev Get proposals with a given status. + * @notice Accepts pagination request (empty == no pagination returned). * @param proposalStatus The status of the proposals to get. */ function getProposals(int32 proposalStatus, Cosmos.PageRequest calldata pagination) @@ -90,12 +96,15 @@ interface IGovernanceModule { returns (Proposal[] memory, Cosmos.PageResponse memory); /** - * @dev Get the proposal tally result with the given id. + * @dev Get the proposal tally result for the given id. + * @param proposalId The id of the proposal to get the tally result for. */ function getProposalTallyResult(uint64 proposalId) external view returns (TallyResult memory); /** * @dev Get the proposal votes with the given id. + * @notice Accepts pagination request. + * @param proposalId The id of the proposal to get the votes for. */ function getProposalVotes(uint64 proposalId, Cosmos.PageRequest calldata pagination) external @@ -104,6 +113,8 @@ interface IGovernanceModule { /** * @dev Get the proposal vote information with the given id and voter. + * @param proposalId The id of the proposal to get the vote info for. + * @param voter The address of the voter to get the vote info for. */ function getProposalVotesByVoter(uint64 proposalId, address voter) external view returns (Vote memory); @@ -135,7 +146,6 @@ interface IGovernanceModule { ////////////////////////////////////////// Structs /////////////////////////////////////////////////// /** * @dev Represents a governance module `WeightedVoteOption`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct WeightedVoteOption { int32 voteOption; @@ -144,7 +154,6 @@ interface IGovernanceModule { /** * @dev Represents a governance module `Vote`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct Vote { uint64 proposalId; @@ -155,7 +164,6 @@ interface IGovernanceModule { /** * @dev Represents a governance module `Proposal`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct Proposal { uint64 id; @@ -175,7 +183,6 @@ interface IGovernanceModule { /** * @dev Represents the governance module's parameters. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct Params { Cosmos.Coin[] minDeposit; @@ -197,7 +204,6 @@ interface IGovernanceModule { /** * @dev Represents the governance module's `VotingParams`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct VotingParams { uint64 votingPeriod; @@ -205,7 +211,6 @@ interface IGovernanceModule { /** * @dev Represents the governance module's `DepositParams`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct DepositParams { Cosmos.Coin[] minDeposit; @@ -214,7 +219,6 @@ interface IGovernanceModule { /** * @dev Represents the governance module's `TallyParams`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct TallyParams { string quorum; @@ -224,7 +228,6 @@ interface IGovernanceModule { /** * @dev Represents a governance module `TallyResult`. - * Note: this struct is generated in generated/i_staking_module.abigen.go */ struct TallyResult { string yesCount; @@ -234,7 +237,7 @@ interface IGovernanceModule { } /** - * @dev Emitted by the governance module when `submitProposal` is called. + * @dev Emitted by the governance precompile when `submitProposal` is called. * @param proposalId The id of the proposal. * @param proposalSender The sender of the submit proposal. */ @@ -248,7 +251,7 @@ interface IGovernanceModule { event ProposalDeposit(uint64 indexed proposalId, Cosmos.Coin[] amount); /** - * @dev Emitted by the governance module when `AddVote` is called in the msg server. + * @dev Emitted by the governance precompile when a proposal is voted on. * @param proposalVote The vote that was voted on for a proposal. */ event ProposalVoted(Vote proposalVote); diff --git a/contracts/src/cosmos/precompile/Staking.sol b/contracts/src/cosmos/precompile/Staking.sol index 4ac0bde884..26750e829a 100644 --- a/contracts/src/cosmos/precompile/Staking.sol +++ b/contracts/src/cosmos/precompile/Staking.sol @@ -36,28 +36,41 @@ interface IStakingModule { /** * @dev Emitted by the staking module when `amount` tokens are delegated to * `validator` + * @param validator The validator operator address + * @param amount The amount of tokens delegated */ event Delegate(address indexed validator, Cosmos.Coin[] amount); /** * @dev Emitted by the staking module when `amount` tokens are redelegated from * `sourceValidator` to `destinationValidator` + * @param sourceValidator The source validator operator address + * @param destinationValidator The destination validator operator address + * @param amount The amount of tokens redelegated */ event Redelegate(address indexed sourceValidator, address indexed destinationValidator, Cosmos.Coin[] amount); /** * @dev Emitted by the staking module when `amount` tokens are used to create `validator` + * @param validator The validator operator address + * @param amount The amount of tokens used to create the validator */ event CreateValidator(address indexed validator, Cosmos.Coin[] amount); /** * @dev Emitted by the staking module when `amount` tokens are unbonded from `validator` + * @param validator The validator operator address + * @param amount The amount of tokens unbonded */ event Unbond(address indexed validator, Cosmos.Coin[] amount); /** * @dev Emitted by the staking module when `amount` tokens are canceled from `delegator`'s * unbonding delegation with `validator` + * @param validator The validator operator address + * @param delegator The delegator address + * @param amount The amount of tokens canceled + * @param creationHeight The height at which the unbonding delegation was created */ event CancelUnbondingDelegation( address indexed validator, address indexed delegator, Cosmos.Coin[] amount, int64 creationHeight @@ -67,11 +80,13 @@ interface IStakingModule { /** * @dev Returns the operator address of the validator for the given consensus address. + * @param consAddr The consensus address (as bytes) of the validator */ function getValAddressFromConsAddress(bytes calldata consAddr) external pure returns (address); /** * @dev Returns a list of all active validators. + * @notice Accepts pagination request (empty == no pagination returned). */ function getValidators(Cosmos.PageRequest calldata pagination) external @@ -80,6 +95,7 @@ interface IStakingModule { /** * @dev Returns a list of bonded validator (operator) addresses. + * @notice Accepts pagination request (empty == no pagination returned). */ function getBondedValidators(Cosmos.PageRequest calldata pagination) external @@ -94,11 +110,14 @@ interface IStakingModule { /** * @dev Returns the validator at the given address. + * @param validatorAddress The validator operator address */ function getValidator(address validatorAddress) external view returns (Validator memory); /** * @dev Returns all the validators delegated to by the given delegator. + * @notice Accepts pagination request (empty == no pagination returned). + * @param delegatorAddress The delegator address to query validators for. */ function getDelegatorValidators(address delegatorAddress, Cosmos.PageRequest calldata pagination) external @@ -107,7 +126,8 @@ interface IStakingModule { /** * @dev Returns all the delegations delegated to the given validator. - * Note: if pagination is not a valid page request, it will execute without pagination + * @notice Accepts pagination request (empty == no pagination returned). + * @param validatorAddress The validator operator address to query delegations for. */ function getValidatorDelegations(address validatorAddress, Cosmos.PageRequest calldata pagination) external @@ -117,12 +137,16 @@ interface IStakingModule { /** * @dev Returns the `amount` of tokens currently delegated by `delegatorAddress` to * `validatorAddress` + * @param delegatorAddress The delegator address + * @param validatorAddress The validator operator address */ function getDelegation(address delegatorAddress, address validatorAddress) external view returns (uint256); /** * @dev Returns a time-ordered list of all UnbondingDelegationEntries between * `delegatorAddress` and `validatorAddress` + * @param delegatorAddress The delegator address + * @param validatorAddress The validator operator address */ function getUnbondingDelegation(address delegatorAddress, address validatorAddress) external @@ -131,6 +155,8 @@ interface IStakingModule { /** * @dev Returns a list of all unbonding delegations for a given delegator + * @notice Accepts pagination request (empty == no pagination returned). + * @param delegatorAddress The delegator address */ function getDelegatorUnbondingDelegations(address delegatorAddress, Cosmos.PageRequest calldata pagination) external @@ -140,6 +166,10 @@ interface IStakingModule { /** * @dev Returns a list of `delegatorAddress`'s redelegating bonds from `srcValidator` to * `dstValidator` + * @notice Accepts pagination request (empty == no pagination returned). + * @param delegatorAddress The delegator address + * @param srcValidator The source validator operator address + * @param dstValidator The destination validator operator address */ function getRedelegations( address delegatorAddress, @@ -152,16 +182,23 @@ interface IStakingModule { /** * @dev msg.sender delegates the `amount` of tokens to `validatorAddress` + * @param validatorAddress The validator operator address + * @param amount The amount of tokens to delegate */ function delegate(address validatorAddress, uint256 amount) external payable returns (bool); /** * @dev msg.sender undelegates the `amount` of tokens from `validatorAddress` + * @param validatorAddress The validator operator address + * @param amount The amount of tokens to undelegate */ function undelegate(address validatorAddress, uint256 amount) external payable returns (bool); /** * @dev msg.sender redelegates the `amount` of tokens from `srcValidator` to `validtorDstAddr` + * @param srcValidator The source validator operator address + * @param dstValidator The destination validator operator address + * @param amount The amount of tokens to redelegate */ function beginRedelegate(address srcValidator, address dstValidator, uint256 amount) external @@ -171,8 +208,9 @@ interface IStakingModule { /** * @dev Cancels msg.sender's unbonding delegation with `validatorAddress` and delegates the * `amount` of tokens back to `validatorAddress` - * - * Provide the `creationHeight` of the original unbonding delegation + * @param validatorAddress The validator operator address + * @param amount The amount of tokens to cancel + * @param creationHeight The height at which the unbonding delegation was created */ function cancelUnbondingDelegation(address validatorAddress, uint256 amount, int64 creationHeight) external @@ -230,9 +268,6 @@ interface IStakingModule { /** * @dev Represents one entry of an unbonding delegation - * - * Note: the field names of the native struct should match these field names (by camelCase) - * Note: we are using the types in precompile/generated */ struct UnbondingDelegationEntry { // creationHeight is the height which the unbonding took place @@ -249,9 +284,6 @@ interface IStakingModule { /** * @dev Represents all unbonding bonds of a single delegator with relevant metadata - * - * Note: the field names of the native struct should match these field names (by camelCase) - * Note: we are using the types in precompile/generated */ struct UnbondingDelegation { address delegatorAddress; @@ -261,9 +293,6 @@ interface IStakingModule { /** * @dev Represents a redelegation entry with relevant metadata - * - * Note: the field names of the native struct should match these field names (by camelCase) - * Note: we are using the types in precompile/generated */ struct RedelegationEntry { // creationHeight is the height which the redelegation took place From c636ad65bd20ef931c91639a75256a2e7a37c48d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 18 Sep 2023 17:22:03 -0400 Subject: [PATCH 011/122] fix(statedb): Logs `clone` was not correct. (#1103) Leads to StateByHeaderOrHash having a cloned logs journal size of 0 which is big bad. --- eth/core/state/journal/logs.go | 3 ++- lib/ds/stack/stack.go | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/eth/core/state/journal/logs.go b/eth/core/state/journal/logs.go index 875e3214d1..50d32c2a03 100644 --- a/eth/core/state/journal/logs.go +++ b/eth/core/state/journal/logs.go @@ -132,9 +132,10 @@ func (l *logs) Finalize() {} // Clone implements `libtypes.Cloneable`. func (l *logs) Clone() Log { + capacity := l.Capacity() size := l.Size() clone := &logs{ - Stack: stack.New[*coretypes.Log](size), + Stack: stack.New[*coretypes.Log](capacity), txHash: l.txHash, txIndex: l.txIndex, } diff --git a/lib/ds/stack/stack.go b/lib/ds/stack/stack.go index 9cbb9059f3..23b15f0af7 100644 --- a/lib/ds/stack/stack.go +++ b/lib/ds/stack/stack.go @@ -27,16 +27,18 @@ const ( // stack is a struct that holds a slice of Items as a last in, first out data structure. // It is implemented by pre-allocating a buffer with a capacity. type stack[T any] struct { - size int - capacity int - buf []T + size int + capacity int + initialCapacity int + buf []T } // Creates a new, empty stack with the given initial capacity. func New[T any](initialCapacity int) ds.Stack[T] { return &stack[T]{ - capacity: initialCapacity, - buf: make([]T, initialCapacity), + capacity: initialCapacity, + buf: make([]T, initialCapacity), + initialCapacity: initialCapacity, } } @@ -105,18 +107,17 @@ func (s *stack[T]) expandIfRequired() { if s.size < s.capacity { return } - - newBuf := make([]T, (s.capacity*resizeRatio)/two) - s.buf = append(s.buf, newBuf...) + newCapacity := max(s.initialCapacity, (s.capacity*resizeRatio)/two) + s.buf = append(s.buf, make([]T, newCapacity)...) s.capacity *= resizeRatio } // shrinkIfRequired shrinks the stack if the size is less than the capacity/resizeRatio. func (s *stack[T]) shrinkIfRequired() { - if newCap := s.capacity / resizeRatio; s.size < newCap { - newBuf := make([]T, newCap) + if newCapacity := max(s.initialCapacity, s.capacity/resizeRatio); s.size < newCapacity { + newBuf := make([]T, newCapacity) copy(newBuf, s.buf) s.buf = newBuf - s.capacity = newCap + s.capacity = newCapacity } } From c5030bda504236915a2aa3649f49d759f8cf802c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 18 Sep 2023 18:42:45 -0400 Subject: [PATCH 012/122] chore(deps): bump go (#1104) To reduce diff of #1102 --- .github/workflows/codeql.yml | 2 +- .github/workflows/e2e.yml | 8 ++++---- .github/workflows/pipeline.yml | 2 +- cosmos/README.md | 2 +- cosmos/testing/e2e/utils.go | 2 +- docs/web/pages/docs/running-a-node/running-locally.mdx | 2 +- e2e/localnet/network/fixture_test.go | 2 +- e2e/localnet/network/node_test.go | 2 +- e2e/testapp/docker/base.Dockerfile | 2 +- e2e/testapp/go.mod | 2 -- magefiles/cosmos.go | 2 +- 11 files changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 992bb27d1e..1fc56b66b6 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -34,7 +34,7 @@ # fail-fast: false # matrix: # language: ["go"] -# versions: [1.21.0] +# versions: [1.21.1] # # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # # Use only 'java' to analyze code written in Java, Kotlin or both # # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 39198054ef..216f4fc220 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -33,7 +33,7 @@ jobs: namespace: [cosmos] docker-version: [base] os: [polaris-linux-latest] - go-version: [1.21.0] + go-version: [1.21.1] go-arch: [amd64] image-name: ["polard/base:v0.0.0"] export-name: [base-image] @@ -69,7 +69,7 @@ jobs: namespace: [cosmos] docker-version: [localnet] os: [polaris-linux-latest] - go-version: [1.21.0] + go-version: [1.21.1] go-arch: [amd64] base-image: [base-image] image-name: ["polard/localnet:v0.0.0"] @@ -112,7 +112,7 @@ jobs: simulator: [polaris/rpc] namespace: [cosmos] os: [polaris-linux-latest] - go-version: [1.21.0] + go-version: [1.21.1] base-image: [base-image] runs-on: ${{ matrix.os }} steps: @@ -153,7 +153,7 @@ jobs: matrix: namespace: ["", "localnet"] os: [polaris-linux-latest] - go-version: [1.21.0] + go-version: [1.21.1] base-image: [localnet] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index fbd23dbc5a..6017ee8c38 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -32,7 +32,7 @@ jobs: matrix: args: ["build", "lint", "testunitrace", "testunitcover"] os: [polaris-linux-latest] - go-version: [1.21.0] + go-version: [1.21.1] runs-on: ${{ matrix.os }} steps: - name: Checkout diff --git a/cosmos/README.md b/cosmos/README.md index ef560953b9..d0bfd725f3 100644 --- a/cosmos/README.md +++ b/cosmos/README.md @@ -83,7 +83,7 @@ server_name: polard version: commit: build_tags: netgo,ledger -go: go version go1.21.0 darwin/amd64 +go: go version go1.21.1 darwin/amd64 ``` ## Running a Local Network diff --git a/cosmos/testing/e2e/utils.go b/cosmos/testing/e2e/utils.go index ac2bfa5dfc..328d9fc162 100644 --- a/cosmos/testing/e2e/utils.go +++ b/cosmos/testing/e2e/utils.go @@ -34,7 +34,7 @@ const ( containerName = "goodcontainer" polardHTTPAddress = "8545/tcp" polardWSAddress = "8546/tcp" - goVersion = "1.21.0" + goVersion = "1.21.1" ) // NewPolarisFixtureConfig returns a polaris fixture config. diff --git a/docs/web/pages/docs/running-a-node/running-locally.mdx b/docs/web/pages/docs/running-a-node/running-locally.mdx index e23e700aa5..e6bda9232e 100644 --- a/docs/web/pages/docs/running-a-node/running-locally.mdx +++ b/docs/web/pages/docs/running-a-node/running-locally.mdx @@ -85,7 +85,7 @@ server_name: polard version: commit: build_tags: netgo,ledger -go: go version go1.21.0 darwin/amd64 +go: go version go1.21.1 darwin/amd64 ``` ## Running a Local Network diff --git a/e2e/localnet/network/fixture_test.go b/e2e/localnet/network/fixture_test.go index 5f71b364c9..fc3500ecff 100644 --- a/e2e/localnet/network/fixture_test.go +++ b/e2e/localnet/network/fixture_test.go @@ -59,7 +59,7 @@ var _ = Describe("JSON RPC tests", func() { "goodcontainer", "8545/tcp", "8546/tcp", - "1.21.0", + "1.21.1", )) Expect(tf).ToNot(BeNil()) client = tf.EthClient() diff --git a/e2e/localnet/network/node_test.go b/e2e/localnet/network/node_test.go index c65f5781f4..0081f76e0e 100644 --- a/e2e/localnet/network/node_test.go +++ b/e2e/localnet/network/node_test.go @@ -49,7 +49,7 @@ var _ = Describe("ContainerizedNode", func() { "8545/tcp", "8546/tcp", []string{ - "GO_VERSION=1.21.0", + "GO_VERSION=1.21.1", "BASE_IMAGE=polard/base:v0.0.0", }, ) diff --git a/e2e/testapp/docker/base.Dockerfile b/e2e/testapp/docker/base.Dockerfile index 849a506334..e62dc3b364 100644 --- a/e2e/testapp/docker/base.Dockerfile +++ b/e2e/testapp/docker/base.Dockerfile @@ -18,7 +18,7 @@ ### Stage 0 - Build Arguments ### ####################################################### -ARG GO_VERSION=1.21.0 +ARG GO_VERSION=1.21.1 ARG GOARCH=amd64 ARG GOOS=linux ARG NAME=polaris-cosmos diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 3a21c4653a..0ee3fb8ec6 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -2,8 +2,6 @@ module pkg.berachain.dev/polaris/e2e/testapp go 1.21 -toolchain go1.21.0 - replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 diff --git a/magefiles/cosmos.go b/magefiles/cosmos.go index 98997faa7c..28010f7f39 100644 --- a/magefiles/cosmos.go +++ b/magefiles/cosmos.go @@ -52,7 +52,7 @@ var ( localDockerPath = baseDockerPath + "local/Dockerfile" seedDockerPath = baseDockerPath + "seed/Dockerfile" valDockerPath = baseDockerPath + "validator/Dockerfile" - goVersion = "1.21.0" + goVersion = "1.21.1" precompileContractsDir = "./contracts" // Localnet. From 7ef4bb8187ce0d84d97e9b3e671c89b50a0619dc Mon Sep 17 00:00:00 2001 From: mmsqe Date: Tue, 19 Sep 2023 08:55:17 +0800 Subject: [PATCH 013/122] test: config preblock (#1097) Signed-off-by: Devon Bear Co-authored-by: Devon Bear --- cosmos/go.mod | 12 +- cosmos/go.sum | 24 +- e2e/localnet/go.mod | 12 +- e2e/localnet/go.sum | 24 +- e2e/testapp/app_config.go | 4 +- e2e/testapp/go.mod | 14 +- e2e/testapp/go.sum | 28 +-- go.work.sum | 502 +------------------------------------- 8 files changed, 71 insertions(+), 549 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index 60ddd82632..5fff8343eb 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -10,7 +10,7 @@ replace ( ) require ( - cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 + cosmossdk.io/api v0.7.1 cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 @@ -24,7 +24,7 @@ require ( github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.12.0 @@ -37,10 +37,10 @@ require ( github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 // indirect - github.com/tidwall/btree v1.6.0 + github.com/tidwall/btree v1.7.0 google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/grpc v1.58.0 + google.golang.org/grpc v1.58.1 google.golang.org/protobuf v1.31.0 pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230830221145-a6c6454d3697 @@ -147,7 +147,7 @@ require ( github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.1 // indirect - github.com/hashicorp/go-plugin v1.5.0 // indirect + github.com/hashicorp/go-plugin v1.5.1 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -249,7 +249,7 @@ require ( golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 80aa125500..c915c9dc1e 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -35,8 +35,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 h1:z1aCAqEXi5fzC5tjanWnkP/zhhuWTX17IiNKxLvXFcw= -cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0/go.mod h1:h4YT2OHIBT/YIwWrc5L+4dY05ZIqvo89zs6m7j4/RSk= +cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= +cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= @@ -235,8 +235,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d h1:cfoI78ri25ZSmqxS45iz3rYsNgxt6MVhFVB3A+KSyEU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d/go.mod h1:LXNFhlvJnxcUddVA+wz9o0rDE9A6Iy3omvtK7UIUY78= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -555,8 +555,8 @@ github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/H github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.5.0 h1:g6Lj3USwF5LaB8HlvCxPjN2X4nFE08ko2BJNVpl7TIE= -github.com/hashicorp/go-plugin v1.5.0/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -959,8 +959,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -1407,8 +1407,8 @@ google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWof google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1435,8 +1435,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 727921364c..ae1739ce9d 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -18,7 +18,7 @@ require ( ) require ( - cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 // indirect + cosmossdk.io/api v0.7.1 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect @@ -53,7 +53,7 @@ require ( github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d // indirect + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect @@ -107,7 +107,7 @@ require ( github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.1 // indirect - github.com/hashicorp/go-plugin v1.5.0 // indirect + github.com/hashicorp/go-plugin v1.5.1 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect @@ -167,7 +167,7 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tidwall/btree v1.6.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect @@ -185,8 +185,8 @@ require ( golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.58.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/grpc v1.58.1 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 9153e7080d..357d98ea81 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -35,8 +35,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 h1:z1aCAqEXi5fzC5tjanWnkP/zhhuWTX17IiNKxLvXFcw= -cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0/go.mod h1:h4YT2OHIBT/YIwWrc5L+4dY05ZIqvo89zs6m7j4/RSk= +cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= +cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= @@ -198,8 +198,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d h1:cfoI78ri25ZSmqxS45iz3rYsNgxt6MVhFVB3A+KSyEU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d/go.mod h1:LXNFhlvJnxcUddVA+wz9o0rDE9A6Iy3omvtK7UIUY78= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -502,8 +502,8 @@ github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/H github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.5.0 h1:g6Lj3USwF5LaB8HlvCxPjN2X4nFE08ko2BJNVpl7TIE= -github.com/hashicorp/go-plugin v1.5.0/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -875,8 +875,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -1314,8 +1314,8 @@ google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWof google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1342,8 +1342,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index 3c384a7921..fab387a3c1 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -127,8 +127,10 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { // there is nothing left over in the validator fee pool, so as to keep the // CanWithdrawInvariant invariant. // NOTE: staking module is required if HistoricalEntries param > 0 - BeginBlockers: []string{ + PreBlockers: []string{ upgradetypes.ModuleName, + }, + BeginBlockers: []string{ minttypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 0ee3fb8ec6..47cf6bfdc9 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -13,14 +13,14 @@ require ( cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 - cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508 + cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619 github.com/stretchr/testify v1.8.4 pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697 pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 ) require ( - cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 + cosmossdk.io/api v0.7.1 cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 @@ -34,7 +34,7 @@ require ( github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect github.com/ethereum/go-ethereum v1.12.0 // indirect @@ -47,10 +47,10 @@ require ( github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 - github.com/tidwall/btree v1.6.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/grpc v1.58.0 // indirect + google.golang.org/grpc v1.58.1 // indirect google.golang.org/protobuf v1.31.0 // indirect ) @@ -162,7 +162,7 @@ require ( github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.1 // indirect - github.com/hashicorp/go-plugin v1.5.0 // indirect + github.com/hashicorp/go-plugin v1.5.1 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect @@ -265,7 +265,7 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.134.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 7ea1e707f1..fe616603bb 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -187,8 +187,8 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0 h1:z1aCAqEXi5fzC5tjanWnkP/zhhuWTX17IiNKxLvXFcw= -cosmossdk.io/api v0.7.1-0.20230820170544-1bd37053e0c0/go.mod h1:h4YT2OHIBT/YIwWrc5L+4dY05ZIqvo89zs6m7j4/RSk= +cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= +cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= @@ -211,8 +211,8 @@ cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6I cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= -cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508 h1:tZ5fSX+ev+QHQ15457Vhxug8BSZJcHeBhU8DpgwlkCc= -cosmossdk.io/x/upgrade v0.0.0-20230818115413-c402c51a1508/go.mod h1:M0JWINHzdN0eFHrWMs082akHHSO5muExS+/tNNIOyP8= +cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619 h1:3wgUsnj/ElYA+B33h6Yn1KxWvB4hPFa+K90fw9gRO9M= +cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619/go.mod h1:bqexnYfkwMCqbXXN4SprKS9N7cTwT1lFholB7UQhoDU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= @@ -398,8 +398,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d h1:cfoI78ri25ZSmqxS45iz3rYsNgxt6MVhFVB3A+KSyEU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230913215410-e5781a9d028d/go.mod h1:LXNFhlvJnxcUddVA+wz9o0rDE9A6Iy3omvtK7UIUY78= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -751,8 +751,8 @@ github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/H github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.5.0 h1:g6Lj3USwF5LaB8HlvCxPjN2X4nFE08ko2BJNVpl7TIE= -github.com/hashicorp/go-plugin v1.5.0/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= @@ -1154,8 +1154,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -1773,8 +1773,8 @@ google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWof google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1816,8 +1816,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/go.work.sum b/go.work.sum index c9f3d23195..6bc5432c80 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,4 +1,7 @@ +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= @@ -26,9 +29,11 @@ cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2 cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= @@ -54,6 +59,7 @@ cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIh cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= @@ -72,6 +78,7 @@ cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= @@ -92,6 +99,7 @@ cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4s cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= @@ -111,6 +119,7 @@ cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6 cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= @@ -129,508 +138,19 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cosmossdk.io/math v1.0.1/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= +cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619 h1:3wgUsnj/ElYA+B33h6Yn1KxWvB4hPFa+K90fw9gRO9M= +cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619/go.mod h1:bqexnYfkwMCqbXXN4SprKS9N7cTwT1lFholB7UQhoDU= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= -github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= -github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= -github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= -github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= -github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= -github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= -github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20220817183557-09c6e030a677/go.mod h1:890yq1fUb9b6dGNwssgeUO5vQV9qfXnCPxAJhBQfXw0= -github.com/cockroachdb/pebble v0.0.0-20230525220056-bb4fc9527b3b/go.mod h1:TkdVsGYRqtULUppt2RbC+YaKtTHnHoWa2apfFrSKABw= -github.com/cockroachdb/pebble v0.0.0-20230817233644-564b068800e0/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230713190037-6a0ab4fd167f/go.mod h1:zhOSfCxf4bY9XMqZDthyyCu1DrDYbgn9oZjxTkaVAbM= -github.com/cosmos/gogoproto v1.4.3/go.mod h1:0hLIG5TR7IvV1fme1HCFKjfzW9X2x0Mo+RooWXCnOWU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= -github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= -github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= -github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/emicklei/dot v1.4.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= -github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/getsentry/sentry-go v0.21.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= -github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= -github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= -github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= -github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e h1:CYRpN206UTHUinz3VJoLaBdy1gEGeJNsqT0mvswDcMw= -github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= -github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= -github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= -github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= -github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linxGnu/grocksdb v1.7.15/go.mod h1:pY55D0o+r8yUYLq70QmhdudxYvoDb9F+9puf4m3/W+U= -github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= -github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= -github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= -github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= -github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= -github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= -github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= -github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= -github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -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.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -pkg.berachain.dev/polaris/contracts v0.0.0-20230818205502-77067cdf29c1/go.mod h1:8zDOkBocmktbCvpmsIhQQJ7TFif1kz6MpYVJMqyDRUU= -pkg.berachain.dev/polaris/contracts v0.0.0-20230821203048-72ca0eaae730/go.mod h1:8zDOkBocmktbCvpmsIhQQJ7TFif1kz6MpYVJMqyDRUU= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230810045725-b6ed353ceb0e/go.mod h1:YIwf8hc7JG0iYlJqGElBdZFiTAJ4pA30Gs2qPf1C83g= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230821203048-72ca0eaae730/go.mod h1:verrB7clt+a5O4QebWFxbNqpwApRNCSND23jpiEn1Bs= -pkg.berachain.dev/polaris/eth v0.0.0-20230810045725-b6ed353ceb0e/go.mod h1:S1qec8Nvb9r4WzKZcfB0bHs7OPcgOtgF3cYfbPJLj+Q= -pkg.berachain.dev/polaris/lib v0.0.0-20230818205502-77067cdf29c1/go.mod h1:JZtndZdLnGavd5b+IiHYew5nMAOoL968nE2cTxk+dEI= -pkg.berachain.dev/polaris/lib v0.0.0-20230821203048-72ca0eaae730/go.mod h1:JZtndZdLnGavd5b+IiHYew5nMAOoL968nE2cTxk+dEI= From 4927ca82e016ff6d0debe4fa7ef67e3153a84325 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 18 Sep 2023 21:08:34 -0400 Subject: [PATCH 014/122] chore(deps): bump `x/upgrade` (#1106) --- e2e/testapp/go.mod | 2 +- e2e/testapp/go.sum | 4 ++-- go.work.sum | 12 ------------ 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 47cf6bfdc9..083eea447a 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -13,7 +13,7 @@ require ( cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 - cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619 + cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697 pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index fe616603bb..7ebe785e8b 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -211,8 +211,8 @@ cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6I cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= -cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619 h1:3wgUsnj/ElYA+B33h6Yn1KxWvB4hPFa+K90fw9gRO9M= -cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619/go.mod h1:bqexnYfkwMCqbXXN4SprKS9N7cTwT1lFholB7UQhoDU= +cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d h1:LH8NPa2+yoMFdCTxCFyQUX5zVDip4YDgtg7e0EecDqo= +cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d/go.mod h1:+5jCm6Lk/CrQhQvtJFy/tmuLfhQKNMn/U0vwrRz/dxQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= diff --git a/go.work.sum b/go.work.sum index 6bc5432c80..cc2dc2dea0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -138,19 +138,7 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619 h1:3wgUsnj/ElYA+B33h6Yn1KxWvB4hPFa+K90fw9gRO9M= -cosmossdk.io/x/upgrade v0.0.0-20230915075604-076dc1ee9619/go.mod h1:bqexnYfkwMCqbXXN4SprKS9N7cTwT1lFholB7UQhoDU= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= From 7ad9c84b4fd1e9258b256c1de6a17e7a7d2f6235 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 11:10:30 -0400 Subject: [PATCH 015/122] fix(hive): Improve stability (#1109) --- .../create-al-multiple-reads.io | 2 +- go.work.sum | 169 ++++++++++++++++++ 2 files changed, 170 insertions(+), 1 deletion(-) diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io b/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io index fc9661c67d..c73c35a748 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_createAccessList","params":[{"from":"0x658bdf435d810c91414ec09147daa6db62406379","to":"0xbb00000000000000000000000000000000000000"},"latest"]} -<< {"jsonrpc":"2.0","id":1,"result":{"accessList":[{"address":"0xbb00000000000000000000000000000000000000","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000003"]}],"gasUsed":"0x6b0e"}} +<< {"jsonrpc":"2.0","id":1,"result":{"accessList":[{"address":"0xbb00000000000000000000000000000000000000","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000001"]}],"gasUsed":"0x6b0e"}} \ No newline at end of file diff --git a/go.work.sum b/go.work.sum index cc2dc2dea0..6f72bc367f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -138,7 +138,176 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= +github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= +github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= +github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= +github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= +github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= +github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= +github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= From 0c53dfe1360a56762275d14b11fa4287385d6e56 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 11:49:05 -0400 Subject: [PATCH 016/122] fix(hive): hmmm (#1110) --- .../tests/eth_createAccessList/create-al-multiple-reads.io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io b/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io index c73c35a748..fc9661c67d 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_createAccessList/create-al-multiple-reads.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_createAccessList","params":[{"from":"0x658bdf435d810c91414ec09147daa6db62406379","to":"0xbb00000000000000000000000000000000000000"},"latest"]} -<< {"jsonrpc":"2.0","id":1,"result":{"accessList":[{"address":"0xbb00000000000000000000000000000000000000","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000001"]}],"gasUsed":"0x6b0e"}} \ No newline at end of file +<< {"jsonrpc":"2.0","id":1,"result":{"accessList":[{"address":"0xbb00000000000000000000000000000000000000","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000003"]}],"gasUsed":"0x6b0e"}} From 66b7e38dfa57984bb28f08245d933791390820d4 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 13:25:15 -0400 Subject: [PATCH 017/122] perf(deps): Improve `go mod tidy` speed and reliability (#1112) --- cosmos/lib/address.go | 6 +- go.work.sum | 9 +++ magefiles/ci.go | 12 ++-- magefiles/constants.go | 104 ++++++++++++++++++++++++++++++++ magefiles/contracts.go | 16 ++--- magefiles/cosmos.go | 77 +++-------------------- magefiles/eth.go | 10 ++- magefiles/helpers.go | 35 +++++++++++ magefiles/hive.go | 29 +++------ magefiles/lint.go | 27 ++++----- magefiles/localnet.go | 4 +- magefiles/proto.go | 8 --- magefiles/tags.go | 11 ++-- magefiles/test.go | 5 -- magefiles/tools.go | 35 +++-------- magefiles/{ => utils}/logger.go | 2 +- 16 files changed, 219 insertions(+), 171 deletions(-) create mode 100644 magefiles/constants.go rename magefiles/{ => utils}/logger.go (99%) diff --git a/cosmos/lib/address.go b/cosmos/lib/address.go index d4c1e35293..275986c13a 100644 --- a/cosmos/lib/address.go +++ b/cosmos/lib/address.go @@ -26,9 +26,9 @@ import ( "pkg.berachain.dev/polaris/eth/common" ) -/////////////////////////////////////////////////////////////////////////////// -// AccAddress, ValAddress, ConsAddress -/////////////////////////////////////////////////////////////////////////////// +/* -------------------------------------------------------------------------- */ +/* AccAddress, ValAddress, ConsAddress */ +/* -------------------------------------------------------------------------- */ // EthAddressFromString converts a Cosmos SDK address string to an Ethereum `Address`. func EthAddressFromString(codec address.Codec, addr string) (common.Address, error) { diff --git a/go.work.sum b/go.work.sum index 6f72bc367f..ecefe96c1d 100644 --- a/go.work.sum +++ b/go.work.sum @@ -146,9 +146,11 @@ github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= @@ -165,6 +167,7 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbE github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= @@ -179,9 +182,11 @@ github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= @@ -193,6 +198,7 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= +github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= @@ -205,6 +211,7 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -223,12 +230,14 @@ github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6B github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= diff --git a/magefiles/ci.go b/magefiles/ci.go index b62b51d129..daa9247636 100644 --- a/magefiles/ci.go +++ b/magefiles/ci.go @@ -27,6 +27,8 @@ package main import ( "github.com/magefile/mage/mg" + + "pkg.berachain.dev/polaris/magefiles/utils" ) type CI mg.Namespace @@ -45,7 +47,7 @@ func TestUnit() error { if err := (Contracts{}).Build(); err != nil { return err } - LogGreen("Running all unit tests...") + utils.LogGreen("Running all unit tests...") return testUnit(".") } @@ -72,7 +74,7 @@ func TestUnitCover() error { args := []string{ "--skip", ".*e2e.*", } - LogGreen("Running all unit tests with coverage...") + utils.LogGreen("Running all unit tests with coverage...") return ginkgoTest(append(coverArgs, args...)...) } @@ -84,7 +86,7 @@ func TestUnitRace() error { args := []string{ "--skip", ".*e2e.*", } - LogGreen("Running all unit tests with --race...") + utils.LogGreen("Running all unit tests with --race...") return ginkgoTest(append(raceArgs, args...)...) } @@ -94,7 +96,7 @@ func TestUnitBenchmark() error { return err } - LogGreen("Running all unit tests with benchmarking...") + utils.LogGreen("Running all unit tests with benchmarking...") return testUnitBenchmark() } @@ -110,7 +112,7 @@ func TestE2E() error { if err := (Contracts{}).Build(); err != nil { return err } - LogGreen("Running all e2e tests") + utils.LogGreen("Running all e2e tests") return testE2E(".") } diff --git a/magefiles/constants.go b/magefiles/constants.go new file mode 100644 index 0000000000..b77b986728 --- /dev/null +++ b/magefiles/constants.go @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2023 Berachain Foundation +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +package main + +import "os" + +/* -------------------------------------------------------------------------- */ +/* Commands */ +/* -------------------------------------------------------------------------- */ + +var ( + // Forge. + forgeBuild = RunCmdV("forge", "build", "--extra-output-files", "bin", "--extra-output-files", "abi", "--silent") + forgeClean = RunCmdV("forge", "clean") + forgeTest = RunCmdV("forge", "test") + forgeFmt = RunCmdV("forge", "fmt") + + // Docker. + dockerBuild = RunCmdV("docker", "build", "--rm=false") + dockerBuildX = RunCmdV("docker", "buildx", "build", "--rm=false") + + // Buf. + bufCommand = RunCmdV("buf") + + // Testing. + goTest = RunCmdV("go", "test", "-mod=readonly") + ginkgoTest = RunCmdV("ginkgo", "-r", "--randomize-all", "--fail-on-pending", "-trace") + + // Toolchain. + goInstall = RunCmdV("go", "install", "-mod=readonly") + goBuild = RunCmdV("go", "build", "-mod=readonly") + goRun = RunCmdV("go", "run") + goGenerate = RunCmdV("go", "generate") + goModTidy = RunCmdV("go", "mod", "tidy") + goWorkSync = RunCmdV("go", "work", "sync") + gitDiff = RunCmdV("git", "diff", "--stat", "--exit-code", ".", + "':(exclude)*.mod' ':(exclude)*.sum'") +) + +/* -------------------------------------------------------------------------- */ +/* Packages & Modules */ +/* --------------------------------------------------------------------------. */ +var ( + repoModuleDirs = readGoModulesFromGoWork("go.work") +) + +const ( + cosmosSDK = "github.com/cosmos/cosmos-sdk" + moq = "github.com/matryer/moq" + golangCi = "github.com/golangci/golangci-lint/cmd/golangci-lint" + golines = "github.com/segmentio/golines" + gosec = "github.com/securego/gosec/v2/cmd/gosec" + addlicense = "github.com/google/addlicense" +) + +/* -------------------------------------------------------------------------- */ +/* Docker */ +/* -------------------------------------------------------------------------- */ + +var ( + baseImageVersion = "polard/base:v0.0.0" + protoImageName = "ghcr.io/cosmos/proto-builder" + protoImageVersion = "0.14.0" + protoDir = "cosmos/proto" +) + +/* -------------------------------------------------------------------------- */ +/* Directories */ +/* -------------------------------------------------------------------------- */ + +const ( + outdir = "./bin" + baseHiveDockerPath = "./e2e/hive/" +) + +var ( + hiveClone = os.Getenv("GOPATH") + "/src/" + clonePath = hiveClone + ".hive-e2e/" + simulatorsPath = clonePath + "simulators/polaris/" + clientsPath = clonePath + "clients/polard/" +) diff --git a/magefiles/contracts.go b/magefiles/contracts.go index f1fb4a33ef..d32d77b13d 100644 --- a/magefiles/contracts.go +++ b/magefiles/contracts.go @@ -31,14 +31,8 @@ import ( "fmt" "github.com/magefile/mage/mg" -) -var ( - // Commands. - forgeBuild = RunCmdV("forge", "build", "--extra-output-files", "bin", "--extra-output-files", "abi", "--silent") - forgeClean = RunCmdV("forge", "clean") - forgeTest = RunCmdV("forge", "test") - forgeFmt = RunCmdV("forge", "fmt") + "pkg.berachain.dev/polaris/magefiles/utils" ) // Compile-time assertion that we implement the interface correctly. @@ -57,7 +51,7 @@ func (Contracts) directory() string { // Runs `forge build` in all smart contract directories. func (Contracts) Build() error { - LogGreen("Building solidity contracts with foundry...") + utils.LogGreen("Building solidity contracts with foundry...") return forgeWrapper(forgeBuild) } @@ -88,18 +82,18 @@ func (c Contracts) Test() error { // Run `forge test` in all smart contract directories. func (Contracts) TestUnit() error { - LogGreen("Running foundry unit tests...") + utils.LogGreen("Running foundry unit tests...") return forgeWrapper(forgeTest) } // Run `forge fmt` in all smart contract directories. func (Contracts) Fmt() error { - LogGreen("Running forge fmt...") + utils.LogGreen("Running forge fmt...") return forgeWrapper(forgeFmt) } func (Contracts) TestE2E() error { - LogGreen("Running foundry e2e tests...") + utils.LogGreen("Running foundry e2e tests...") return forgeWrapper(forgeTest) } diff --git a/magefiles/cosmos.go b/magefiles/cosmos.go index 28010f7f39..79c83db8d7 100644 --- a/magefiles/cosmos.go +++ b/magefiles/cosmos.go @@ -31,6 +31,8 @@ import ( "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" + + "pkg.berachain.dev/polaris/magefiles/utils" ) var ( @@ -38,12 +40,6 @@ var ( production = false statically = false - // Commands. - dockerBuild = RunCmdV("docker", "build", "--rm=false") - - dockerBuildX = RunCmdV("docker", "buildx", "build", "--rm=false") - dockerRun = RunCmdV("docker", "run") - // Variables. imageName = "polard" imageVersion = "v0.0.0" @@ -83,7 +79,7 @@ func Start() error { // Builds the Cosmos SDK chain. func (Cosmos) Build() error { - LogGreen("Building the Cosmos SDK chain...") + utils.LogGreen("Building the Cosmos SDK chain...") cmd := "polard" args := []string{ generateBuildTags(), @@ -94,32 +90,16 @@ func (Cosmos) Build() error { return goBuild(args...) } -// Builds a release version of the Cosmos SDK chain. -func (c Cosmos) BuildRelease() error { - LogGreen("Building release version of the Cosmos SDK chain...") - production = true - statically = false - return c.Build() -} - // =========================================================================== // Docker // =========================================================================== // Builds a release version of the Cosmos SDK chain. func (c Cosmos) Docker(dockerType, arch string) error { - LogGreen("Build a release docker image for the Cosmos SDK chain...") + utils.LogGreen("Build a release docker image for the Cosmos SDK chain...") return c.dockerBuildBeradWith(dockerType, goVersion, arch, false) } -func (c Cosmos) RunDockerLocal() error { - return dockerRun("-p", "8545:8545", "polard/local:v0.0.0") -} - -func (c Cosmos) DockerX(dockerType, arch string) error { - return c.dockerBuildBeradWith(dockerType, goVersion, arch, true) -} - func (c Cosmos) dockerBuildBeradWith(dockerType, goVersion, arch string, withX bool) error { var dockerFilePath string opts := []string{ @@ -128,7 +108,7 @@ func (c Cosmos) dockerBuildBeradWith(dockerType, goVersion, arch string, withX b "--build-arg", "PRECOMPILE_CONTRACTS_DIR=" + precompileContractsDir, "--build-arg", "GOOS=linux", "--build-arg", "GOARCH=" + arch, - "--build-arg", "GO_WORK=" + strings.Join(moduleDirs, " "), + "--build-arg", "GO_WORK=" + strings.Join(repoModuleDirs, " "), } buildContext := "." switch dockerType { @@ -146,7 +126,7 @@ func (c Cosmos) dockerBuildBeradWith(dockerType, goVersion, arch string, withX b dockerFilePath = execDockerPath } tag := imageName + "/" + dockerType + ":" + imageVersion - LogGreen( + utils.LogGreen( "Building a "+dockerType+" polard docker image", "platform", "linux"+"/"+arch, "tag", tag, @@ -157,43 +137,6 @@ func (c Cosmos) dockerBuildBeradWith(dockerType, goVersion, arch string, withX b ) } -// Builds a release version of the Cosmos SDK chain. -func (c Cosmos) DockerDebug() error { - LogGreen("Build a debug docker image for the Cosmos SDK chain...") - return c.dockerBuildNode("debug", execDockerPath, goVersion, version, runtime.GOARCH, false) -} - -// Build a docker image for polard with the supplied arguments. -func (c Cosmos) dockerBuildNode(name, dockerFilePath, goVersion, imageVersion, arch string, withX bool) error { - return dockerBuildFn(withX)( - "--build-arg", "GO_VERSION="+goVersion, - "--build-arg", "FOUNDRY_DIR="+precompileContractsDir, - "--build-arg", "GOARCH="+arch, - "-f", dockerFilePath, - "-t", name+":"+imageVersion, //TODO: do not hardcode, have ability to pass as arg - ".", - ) -} - -// =========================================================================== -// Install -// =========================================================================== - -// Installs a release version of the Cosmos SDK chain. -func (Cosmos) Install() error { - LogGreen("Installing the Cosmos SDK chain...") - production = true - statically = false - - args := []string{ - generateBuildTags(), - generateLinkerFlags(production, statically), - "./e2e/testapp/polard", - } - - return goInstall(args...) -} - // =========================================================================== // Test // =========================================================================== @@ -209,25 +152,25 @@ func (c Cosmos) Test() error { // Runs all unit tests for the Cosmos SDK chain. func (c Cosmos) TestUnit() error { - LogGreen("Running unit tests for the Cosmos SDK chain.") + utils.LogGreen("Running unit tests for the Cosmos SDK chain.") return testUnit(c.directory()) } // Runs all unit tests for the Cosmos SDK chain. func (c Cosmos) TestUnitRace() error { - LogGreen("Running unit tests for the Cosmos SDK chain.") + utils.LogGreen("Running unit tests for the Cosmos SDK chain.") return testUnitRace(c.directory()) } // Runs all e2e tests for the Cosmos SDK chain. func (c Cosmos) TestE2E() error { - LogGreen("Running e2e tests for the Cosmos SDK chain.") + utils.LogGreen("Running e2e tests for the Cosmos SDK chain.") return testE2E(c.directory() + "/testing/e2e") } func (c Cosmos) TestHive(sim string) error { if out, _ := sh.Output("docker", "images", "-q", baseImageVersion); out == "" { - LogGreen("No existing base docker image found, building...") + utils.LogGreen("No existing base docker image found, building...") if err := c.Docker("base", runtime.GOARCH); err != nil { return err } diff --git a/magefiles/eth.go b/magefiles/eth.go index e611fb42d7..42f15de31b 100644 --- a/magefiles/eth.go +++ b/magefiles/eth.go @@ -25,7 +25,11 @@ package main -import "github.com/magefile/mage/mg" +import ( + "github.com/magefile/mage/mg" + + "pkg.berachain.dev/polaris/magefiles/utils" +) type Eth mg.Namespace @@ -43,12 +47,12 @@ func (e Eth) Test() error { // Runs all unit tests for the Cosmos SDK chain. func (e Eth) TestUnit() error { - LogGreen("Running all Polaris Ethereum unit tests...") + utils.LogGreen("Running all Polaris Ethereum unit tests...") return testUnit(e.directory()) } // Runs all e2e tests for the Cosmos SDK chain. func (e Eth) TestE2E() error { - LogGreen("Running all Polaris Ethereum e2e tests...") + utils.LogGreen("Running all Polaris Ethereum e2e tests...") return testE2E(e.directory()) } diff --git a/magefiles/helpers.go b/magefiles/helpers.go index 06a11caf1b..f27caf7333 100644 --- a/magefiles/helpers.go +++ b/magefiles/helpers.go @@ -26,10 +26,14 @@ package main import ( + "bufio" "os" + "regexp" "strings" "github.com/magefile/mage/sh" + + "pkg.berachain.dev/polaris/magefiles/utils" ) var allPkgs, _ = sh.Output("go", "list", "pkg.berachain.dev/polaris/...") @@ -104,3 +108,34 @@ func ExecuteForAllModules(dirs []string, f func(args ...string) error, withArgs } return nil } + +// readGoModulesFromGoWork reads the go.work file and returns a list of modules. +func readGoModulesFromGoWork(filepath string) []string { + // Open the go.work file + file, err := os.Open(filepath) //#nosec: G304 // required. + if err != nil { + utils.LogRed("Error opening file:", err) + return []string{} + } + defer file.Close() + + // Regex pattern to match module paths + pattern := regexp.MustCompile(`\./([\w-/]+)`) + + // Create a scanner to read the file line by line + scanner := bufio.NewScanner(file) + var modules []string + for scanner.Scan() { + line := scanner.Text() + matches := pattern.FindStringSubmatch(line) + if matches != nil { + modules = append(modules, matches[1]) + } + } + + if err = scanner.Err(); err != nil { + utils.LogRed("Error reading file:", err) + } + + return modules +} diff --git a/magefiles/hive.go b/magefiles/hive.go index aedffe2877..a1a0f0ce66 100644 --- a/magefiles/hive.go +++ b/magefiles/hive.go @@ -31,6 +31,8 @@ import ( "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" + + "pkg.berachain.dev/polaris/magefiles/utils" ) // custom tests for Polaris, struct follows {namespace, files_changed} @@ -40,18 +42,7 @@ type tests struct { Files []string } -const ( - baseImageVersion = "polard/base:v0.0.0" - baseHiveDockerPath = "./e2e/hive/" -) - var ( - // Variables. - hiveClone = os.Getenv("GOPATH") + "/src/" - clonePath = hiveClone + ".hive-e2e/" - simulatorsPath = clonePath + "simulators/polaris/" - clientsPath = clonePath + "clients/polard/" - simulations = []tests{ {"rpc", []string{"init/genesis.json", "ethclient.hive"}}, {"rpc-compat", []string{"Dockerfile", "tests"}}, @@ -61,10 +52,10 @@ var ( type Hive mg.Namespace func (h Hive) Setup() error { - LogGreen("Setting up Hive testing environment...") + utils.LogGreen("Setting up Hive testing environment...") if _, err := os.Stat(hiveClone); os.IsNotExist(err) { - LogGreen(hiveClone + " does not exist, creating....") + utils.LogGreen(hiveClone + " does not exist, creating....") err = os.Mkdir(hiveClone, 0755) //#nosec if err != nil { return err @@ -72,14 +63,14 @@ func (h Hive) Setup() error { } if err := ExecuteInDirectory(hiveClone, func(...string) error { - LogGreen("Removing existing files in .hive-e2e...") + utils.LogGreen("Removing existing files in .hive-e2e...") return sh.RunV("rm", "-rf", clonePath) }, false); err != nil { return err } if _, err := os.Stat(clonePath); os.IsNotExist(err) { - LogGreen("Cloning ethereum/hive into " + clonePath + "...") + utils.LogGreen("Cloning ethereum/hive into " + clonePath + "...") err = ExecuteInDirectory(hiveClone, func(...string) error { return sh.RunV("git", "clone", "https://github.com/ethereum/hive", ".hive-e2e", "--depth=1") }, false) @@ -93,7 +84,7 @@ func (h Hive) Setup() error { } return ExecuteInDirectory(clonePath, func(...string) error { - LogGreen("Building Hive...") + utils.LogGreen("Building Hive...") return goBuild(".") }, false) } @@ -112,19 +103,19 @@ func (h Hive) TestV(sim, client string) error { func (h Hive) View() error { if err := ExecuteInDirectory(clonePath, func(...string) error { - LogGreen("Building HiveView...") + utils.LogGreen("Building HiveView...") return sh.RunV("go", "build", "./cmd/hiveview") }, false); err != nil { return err } return ExecuteInDirectory(clonePath, func(...string) error { - LogGreen("Serving HiveView...") + utils.LogGreen("Serving HiveView...") return sh.RunV("./hiveview", "--serve") }, false) } func (h Hive) copyFiles() error { - LogGreen("Copying Polaris Hive setup files...") + utils.LogGreen("Copying Polaris Hive setup files...") if err := sh.RunV("mkdir", simulatorsPath); err != nil { return err } diff --git a/magefiles/lint.go b/magefiles/lint.go index f75df9d069..b4be9c11f3 100644 --- a/magefiles/lint.go +++ b/magefiles/lint.go @@ -25,12 +25,7 @@ package main -const ( - golangCi = "github.com/golangci/golangci-lint/cmd/golangci-lint" - golines = "github.com/segmentio/golines" - gosec = "github.com/securego/gosec/v2/cmd/gosec" - addlicense = "github.com/google/addlicense" -) +import "pkg.berachain.dev/polaris/magefiles/utils" func Lint() error { cmds := []func() error{GolangCiLint, LicenseCheck, Gosec, Proto{}.Lint, Contracts{}.Fmt} @@ -55,8 +50,8 @@ func Format() error { // Run `golangci-lint`. func GolangCiLint() error { - LogGreen("Running golangci-lint...") - for _, dir := range moduleDirs { + utils.LogGreen("Running golangci-lint...") + for _, dir := range repoModuleDirs { if err := goRun(golangCi, "run", "--timeout=10m", "--concurrency", "4", "--config=.golangci.yaml", "-v", "./"+dir+"/"+"...", ); err != nil { @@ -68,8 +63,8 @@ func GolangCiLint() error { // Run `golangci-lint` with --fix. func GolangCiLintFix() error { - LogGreen("Running golangci-lint --fix...") - for _, dir := range moduleDirs { + utils.LogGreen("Running golangci-lint --fix...") + for _, dir := range repoModuleDirs { if err := goRun(golangCi, "run", "--timeout=10m", "--concurrency", "4", "--config=.golangci.yaml", "-v", "--fix", "./"+dir+"/"+"...", ); err != nil { @@ -81,7 +76,7 @@ func GolangCiLintFix() error { // Run `golines`. func Golines() error { - LogGreen("Running golines...") + utils.LogGreen("Running golines...") return goRun(golines, "--reformat-tags", "--shorten-comments", "--write-output", "--max-len=99", "-l", "./.", ) @@ -89,14 +84,14 @@ func Golines() error { // Run `gosec`. func Gosec() error { - LogGreen("Running gosec...") + utils.LogGreen("Running gosec...") return goRun(gosec, "-exclude-generated", "./...") } // Run `addlicense`. func License() error { - LogGreen("Running addlicense...") - return ExecuteForAllModules(moduleDirs, func(args ...string) error { + utils.LogGreen("Running addlicense...") + return ExecuteForAllModules(repoModuleDirs, func(args ...string) error { return goRun(addlicense, "-v", "-f", "./LICENSE.header", "./.", ) @@ -105,8 +100,8 @@ func License() error { // Run `addlicense`. func LicenseCheck() error { - LogGreen("Running addlicense -check...") - return ExecuteForAllModules(moduleDirs, func(args ...string) error { + utils.LogGreen("Running addlicense -check...") + return ExecuteForAllModules(repoModuleDirs, func(args ...string) error { return goRun(addlicense, "-check", "-v", "-f", "./LICENSE.header", "-ignore", "**/*.yml", "./.", ) diff --git a/magefiles/localnet.go b/magefiles/localnet.go index 6da2e8f03c..413fcff75e 100644 --- a/magefiles/localnet.go +++ b/magefiles/localnet.go @@ -27,6 +27,8 @@ package main import ( "github.com/magefile/mage/mg" + + "pkg.berachain.dev/polaris/magefiles/utils" ) type Localnet mg.Namespace @@ -36,7 +38,7 @@ func (Localnet) Test() error { if err := (Contracts{}).Build(); err != nil { return err } - LogGreen("Running all localnet tests") + utils.LogGreen("Running all localnet tests") args := []string{ "-timeout", "30m", "--focus", ".*e2e/localnet.*", diff --git a/magefiles/proto.go b/magefiles/proto.go index 1e5b06a611..634722dede 100644 --- a/magefiles/proto.go +++ b/magefiles/proto.go @@ -32,14 +32,6 @@ import ( "github.com/magefile/mage/sh" ) -var ( - protoImageName = "ghcr.io/cosmos/proto-builder" - protoImageVersion = "0.13.5" - protoDir = "cosmos/proto" - - bufCommand = sh.RunCmd("buf") -) - type Proto mg.Namespace // Run all proto related targets. diff --git a/magefiles/tags.go b/magefiles/tags.go index 7255641d21..d7829ae93b 100644 --- a/magefiles/tags.go +++ b/magefiles/tags.go @@ -32,7 +32,6 @@ import ( ) var ( - sdkRepo = "github.com/cosmos/cosmos-sdk" version = "v0.0.0" commit, _ = sh.Output("git", "log", "-1", "--format='%H'") defaultDB = "pebbledb" @@ -58,13 +57,13 @@ func generateBuildTags() string { // generateLinkerFlags returns the linker flags to be used when building the binary. func generateLinkerFlags(production, statically bool) string { baseFlags := []string{ - "-X ", sdkRepo + "/version.Name=" + executableName, - " -X ", sdkRepo + "/version.AppName=" + appName, - " -X ", sdkRepo + "/version.Version=" + version, - " -X ", sdkRepo + "/version.Commit=" + commit, + "-X ", cosmosSDK + "/version.Name=" + executableName, + " -X ", cosmosSDK + "/version.AppName=" + appName, + " -X ", cosmosSDK + "/version.Version=" + version, + " -X ", cosmosSDK + "/version.Commit=" + commit, // TODO: Refactor versioning more broadly. // " \"-X " + sdkRepo + "/version.BuildTags=" + strings.Join(generateBuildTags(), ",") + - " -X ", sdkRepo + "/version.DBBackend=" + defaultDB, + " -X ", cosmosSDK + "/version.DBBackend=" + defaultDB, } if production { diff --git a/magefiles/test.go b/magefiles/test.go index 5af738fae3..0630c0fda3 100644 --- a/magefiles/test.go +++ b/magefiles/test.go @@ -32,16 +32,11 @@ import ( ) var ( - // Arguments. junitArgs = []string{"--junit-report", "out.xml"} coverArgs = append(junitArgs, []string{"--cover", "--coverprofile", "coverage-testunitcover.txt", "--covermode", "atomic"}...) raceArgs = append(junitArgs, []string{"-race"}...) - - // Commands. - goTest = RunCmdV("go", "test", "-mod=readonly") - ginkgoTest = RunCmdV("ginkgo", "-r", "--randomize-all", "--fail-on-pending", "-trace") ) // Starts a local docs page. diff --git a/magefiles/tools.go b/magefiles/tools.go index 074a542af6..45f98b5323 100644 --- a/magefiles/tools.go +++ b/magefiles/tools.go @@ -29,28 +29,8 @@ import ( "fmt" "github.com/magefile/mage/sh" -) - -var ( - // Commands. - goInstall = RunCmdV("go", "install", "-mod=readonly") - goBuild = RunCmdV("go", "build", "-mod=readonly") - goRun = RunCmdV("go", "run") - goGenerate = RunCmdV("go", "generate") - goModTidy = RunCmdV("go", "mod", "tidy") - goWorkSync = RunCmdV("go", "work", "sync") - - // Directories. - outdir = "./bin" - - // Tools. - gitDiff = sh.RunCmd("git", "diff", "--stat", "--exit-code", ".", - "':(exclude)*.mod' ':(exclude)*.sum'") - - // Dependencies. - moq = "github.com/matryer/moq" - moduleDirs = []string{"contracts", "eth", "cosmos", "magefiles", "lib", "e2e/localnet", "e2e/testapp"} + "pkg.berachain.dev/polaris/magefiles/utils" ) // =========================================================================== @@ -59,18 +39,21 @@ var ( // Runs `go generate` on the entire project. func Generate() error { - LogGreen("Running 'go generate' on the entire project...") + utils.LogGreen("Running 'go generate' on the entire project...") if err := goInstall(moq); err != nil { return err } - return ExecuteForAllModules(moduleDirs, func(...string) error { return goGenerate("./...") }, false) + return ExecuteForAllModules(repoModuleDirs, func(...string) error { return goGenerate("./...") }, false) } // Runs `go generate` on the entire project and verifies that no files were // changed. func GenerateCheck() error { - LogGreen("Running 'go generate' on the entire project and verifying that no files were changed...") - if err := ExecuteForAllModules(moduleDirs, func(...string) error { return goGenerate("./...") }, false); err != nil { + utils.LogGreen( + "Running 'go generate' on project and verifying that no files were changed...") + if err := ExecuteForAllModules( + repoModuleDirs, func(...string) error { return goGenerate("./...") }, false, + ); err != nil { return err } if err := gitDiff(); err != nil { @@ -81,7 +64,7 @@ func GenerateCheck() error { // Runs 'go tidy' on the entire project. func Tidy() error { - return ExecuteForAllModules(moduleDirs, goModTidy, false) + return ExecuteForAllModules(repoModuleDirs, goModTidy, false) } // Runs 'go work sync' on the entire project. diff --git a/magefiles/logger.go b/magefiles/utils/logger.go similarity index 99% rename from magefiles/logger.go rename to magefiles/utils/logger.go index 1c63dae095..d15aa025fe 100644 --- a/magefiles/logger.go +++ b/magefiles/utils/logger.go @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -package main +package utils import ( "fmt" From 8e3f7838191bf50c13a465259ac36b5d79c74b2c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 13:33:31 -0400 Subject: [PATCH 018/122] fix(deps): remove `localnet` as dependency from `cosmos` (#1111) Fix fucked build tags / deps --- cosmos/go.mod | 19 +- cosmos/go.sum | 25 +- e2e/localnet/go.mod | 9 +- e2e/localnet/go.sum | 16 +- e2e/localnet/network/fixture_test.go | 2 +- e2e/precompile/LICENSE | 201 +++ e2e/precompile/LICENSE.header | 24 + .../precompile/contracts}/bank/bank_test.go | 39 +- .../distribution/distribution_test.go | 39 +- .../contracts}/gov/governance_test.go | 39 +- .../misc/precompile_constructor_test.go | 39 +- .../contracts}/staking/staking_test.go | 39 +- e2e/precompile/go.mod | 203 +++ e2e/precompile/go.sum | 1420 +++++++++++++++++ .../e2e => e2e/precompile}/polard/Dockerfile | 0 .../precompile}/polard/config/addrbook.json | 0 .../precompile}/polard/config/app.toml | 0 .../precompile}/polard/config/client.toml | 0 .../precompile}/polard/config/config.toml | 0 .../polard/config/ethkeys/alice.key | 0 .../precompile}/polard/config/ethkeys/bob.key | 0 .../polard/config/ethkeys/charlie.key | 0 .../precompile}/polard/config/genesis.json | 0 ...4a78701907c06155caf2bf230ba7988115799.json | 0 ...3fb1347b8cc9f52ed1679ea978b80aa1f3.address | 0 ...d289b33e39edf3066d8ef9e4bf9e94c047.address | 0 ...3c45e313d7834c197286eb0d669a588169.address | 0 .../polard/config/keyring-test/dev0.info | 0 .../polard/config/keyring-test/dev1.info | 0 .../polard/config/keyring-test/dev2.info | 0 .../precompile}/polard/config/node_key.json | 0 .../precompile}/polard/config/polaris.toml | 0 .../polard/config/priv_validator_key.json | 0 .../polard/config/priv_validator_state.json | 0 .../precompile}/polard/start-node.sh | 0 .../testing/e2e => e2e/precompile}/utils.go | 0 e2e/testapp/docker/base.Dockerfile | 10 +- e2e/testapp/go.mod | 11 +- e2e/testapp/go.sum | 16 +- eth/go.mod | 4 +- eth/go.sum | 8 +- go.work | 1 + go.work.sum | 12 +- magefiles/cosmos.go | 2 +- 44 files changed, 2013 insertions(+), 165 deletions(-) create mode 100644 e2e/precompile/LICENSE create mode 100644 e2e/precompile/LICENSE.header rename {cosmos/testing/e2e/precompile => e2e/precompile/contracts}/bank/bank_test.go (76%) rename {cosmos/testing/e2e/precompile => e2e/precompile/contracts}/distribution/distribution_test.go (82%) rename {cosmos/testing/e2e/precompile => e2e/precompile/contracts}/gov/governance_test.go (83%) rename {cosmos/testing/e2e/precompile => e2e/precompile/contracts}/misc/precompile_constructor_test.go (51%) rename {cosmos/testing/e2e/precompile => e2e/precompile/contracts}/staking/staking_test.go (81%) create mode 100644 e2e/precompile/go.mod create mode 100644 e2e/precompile/go.sum rename {cosmos/testing/e2e => e2e/precompile}/polard/Dockerfile (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/addrbook.json (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/app.toml (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/client.toml (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/config.toml (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/ethkeys/alice.key (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/ethkeys/bob.key (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/ethkeys/charlie.key (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/genesis.json (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/keyring-test/dev0.info (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/keyring-test/dev1.info (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/keyring-test/dev2.info (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/node_key.json (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/polaris.toml (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/priv_validator_key.json (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/config/priv_validator_state.json (100%) rename {cosmos/testing/e2e => e2e/precompile}/polard/start-node.sh (100%) rename {cosmos/testing/e2e => e2e/precompile}/utils.go (100%) diff --git a/cosmos/go.mod b/cosmos/go.mod index 5fff8343eb..666a4e7a7e 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -42,21 +42,18 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect google.golang.org/grpc v1.58.1 google.golang.org/protobuf v1.31.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 + pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a ) require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -65,7 +62,6 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/bytedance/sonic v1.10.0 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -80,7 +76,6 @@ require ( github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.2 // indirect - github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect @@ -97,10 +92,6 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.4+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect @@ -185,7 +176,6 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mtibben/percent v0.2.1 // indirect @@ -193,10 +183,8 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onsi/ginkgo v1.16.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/opencontainers/runc v1.1.5 // indirect - github.com/ory/dockertest v3.3.5+incompatible // indirect github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/peterh/liner v1.2.2 // indirect github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b // indirect @@ -241,7 +229,6 @@ require ( golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index c915c9dc1e..e50faef4ab 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -287,8 +287,6 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -525,8 +523,6 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -729,8 +725,6 @@ github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iP github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -738,8 +732,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= @@ -1223,7 +1215,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1488,8 +1479,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1505,14 +1494,12 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 h1:D51V7Xugl2EOq7c966pjqTYXT7WodBZMiIsqcze/qgo= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697/go.mod h1:ceCUUKQ1GkDJqXjAmeOrjJ/8AEqdUip466n8G4UCgjM= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230830221145-a6c6454d3697 h1:8obXF9sgfUyzCptiV0U/8XzTITUXcnwsnxANsbQcjCQ= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230830221145-a6c6454d3697/go.mod h1:SRAJJuk4J4tNbIupmEm0+72xdriL2via2o+dN6k4gW4= -pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 h1:d+w0G+qOE9s1tYNOdMDaOmNbUCcP0EjUeXXMFT5jg2M= -pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697/go.mod h1:Ry+Ldr32oNPMJVVfDCMYymqA2BlXsL5oyrZTVLxIT1A= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 h1:wgvK5vI7UlQYBs3kB2wZBgsxUjYK1lCV0LFJ4YF2u/4= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index ae1739ce9d..d7f2aa52f4 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -11,10 +11,10 @@ require ( github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible - pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 + pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a ) require ( @@ -133,7 +133,6 @@ require ( github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/term v0.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect github.com/oklog/run v1.1.0 // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 357d98ea81..54a23c5a81 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -1411,14 +1411,14 @@ nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 h1:D51V7Xugl2EOq7c966pjqTYXT7WodBZMiIsqcze/qgo= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697/go.mod h1:ceCUUKQ1GkDJqXjAmeOrjJ/8AEqdUip466n8G4UCgjM= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697 h1:AlcCIDjgTcurCo7xA5lkPcATEgMrqxorZnMzes4gzEY= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697/go.mod h1:U/eSQDbBsNW495y62BB9Pibim056lpZE+4AxfZ0x2OA= -pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 h1:d+w0G+qOE9s1tYNOdMDaOmNbUCcP0EjUeXXMFT5jg2M= -pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697/go.mod h1:Ry+Ldr32oNPMJVVfDCMYymqA2BlXsL5oyrZTVLxIT1A= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 h1:wgvK5vI7UlQYBs3kB2wZBgsxUjYK1lCV0LFJ4YF2u/4= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a h1:QMJRzQpU3/i5WBakrL5V0TE5CcEshC60nw1Ek+bJpJg= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/e2e/localnet/network/fixture_test.go b/e2e/localnet/network/fixture_test.go index fc3500ecff..78301a1b59 100644 --- a/e2e/localnet/network/fixture_test.go +++ b/e2e/localnet/network/fixture_test.go @@ -53,7 +53,7 @@ var _ = Describe("JSON RPC tests", func() { BeforeEach(func() { tf = localnet.NewTestFixture(GinkgoT(), localnet.NewFixtureConfig( - "../../../cosmos/testing/e2e/polard/config/", + "../../../e2e/precompile/polard/config/", "polard/base:v0.0.0", "polard/localnet:v0.0.0", "goodcontainer", diff --git a/e2e/precompile/LICENSE b/e2e/precompile/LICENSE new file mode 100644 index 0000000000..8010fc04f8 --- /dev/null +++ b/e2e/precompile/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 Berachain + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/e2e/precompile/LICENSE.header b/e2e/precompile/LICENSE.header new file mode 100644 index 0000000000..a9bbf9db5e --- /dev/null +++ b/e2e/precompile/LICENSE.header @@ -0,0 +1,24 @@ +SPDX-License-Identifier: Apache-2.0 + +Copyright (c) 2023 Berachain Foundation + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/cosmos/testing/e2e/precompile/bank/bank_test.go b/e2e/precompile/contracts/bank/bank_test.go similarity index 76% rename from cosmos/testing/e2e/precompile/bank/bank_test.go rename to e2e/precompile/contracts/bank/bank_test.go index e2522575a7..98028fac2c 100644 --- a/cosmos/testing/e2e/precompile/bank/bank_test.go +++ b/e2e/precompile/contracts/bank/bank_test.go @@ -1,22 +1,27 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: Apache-2.0 // -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// Copyright (c) 2023 Berachain Foundation // -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: // -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. package bank_test @@ -25,8 +30,8 @@ import ( "testing" bindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" - utils "pkg.berachain.dev/polaris/cosmos/testing/e2e" localnet "pkg.berachain.dev/polaris/e2e/localnet/network" + utils "pkg.berachain.dev/polaris/e2e/precompile" "pkg.berachain.dev/polaris/eth/common" . "github.com/onsi/ginkgo/v2" @@ -36,7 +41,7 @@ import ( func TestCosmosPrecompiles(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/testing/e2e/precompile/bank") + RunSpecs(t, "e2e/precompile/bank") } var _ = Describe("Bank", func() { diff --git a/cosmos/testing/e2e/precompile/distribution/distribution_test.go b/e2e/precompile/contracts/distribution/distribution_test.go similarity index 82% rename from cosmos/testing/e2e/precompile/distribution/distribution_test.go rename to e2e/precompile/contracts/distribution/distribution_test.go index 7ccc2c3501..a79517c974 100644 --- a/cosmos/testing/e2e/precompile/distribution/distribution_test.go +++ b/e2e/precompile/contracts/distribution/distribution_test.go @@ -1,22 +1,27 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: Apache-2.0 // -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// Copyright (c) 2023 Berachain Foundation // -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: // -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. package distribution_test @@ -32,8 +37,8 @@ import ( bindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/distribution" sbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/staking" tbindings "pkg.berachain.dev/polaris/contracts/bindings/testing" - utils "pkg.berachain.dev/polaris/cosmos/testing/e2e" network "pkg.berachain.dev/polaris/e2e/localnet/network" + utils "pkg.berachain.dev/polaris/e2e/precompile" "pkg.berachain.dev/polaris/eth/common" . "github.com/onsi/ginkgo/v2" @@ -43,7 +48,7 @@ import ( func TestDistributionPrecompile(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/testing/e2e/precompile/distribution") + RunSpecs(t, "e2e/precompile/distribution") } var _ = Describe("Distribution Precompile", func() { diff --git a/cosmos/testing/e2e/precompile/gov/governance_test.go b/e2e/precompile/contracts/gov/governance_test.go similarity index 83% rename from cosmos/testing/e2e/precompile/gov/governance_test.go rename to e2e/precompile/contracts/gov/governance_test.go index 5f5e6b3247..8e568abc67 100644 --- a/cosmos/testing/e2e/precompile/gov/governance_test.go +++ b/e2e/precompile/contracts/gov/governance_test.go @@ -1,22 +1,27 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: Apache-2.0 // -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// Copyright (c) 2023 Berachain Foundation // -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: // -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. package governance_test @@ -36,9 +41,9 @@ import ( bindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" tbindings "pkg.berachain.dev/polaris/contracts/bindings/testing/governance" cosmlib "pkg.berachain.dev/polaris/cosmos/lib" - utils "pkg.berachain.dev/polaris/cosmos/testing/e2e" cosmtypes "pkg.berachain.dev/polaris/cosmos/types" network "pkg.berachain.dev/polaris/e2e/localnet/network" + utils "pkg.berachain.dev/polaris/e2e/precompile" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/types" @@ -49,7 +54,7 @@ import ( func TestGovernancePrecompile(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/testing/e2e/precompile/governance") + RunSpecs(t, "e2e/precompile/governance") } var tf *network.TestFixture diff --git a/cosmos/testing/e2e/precompile/misc/precompile_constructor_test.go b/e2e/precompile/contracts/misc/precompile_constructor_test.go similarity index 51% rename from cosmos/testing/e2e/precompile/misc/precompile_constructor_test.go rename to e2e/precompile/contracts/misc/precompile_constructor_test.go index 18485f4f02..74155606be 100644 --- a/cosmos/testing/e2e/precompile/misc/precompile_constructor_test.go +++ b/e2e/precompile/contracts/misc/precompile_constructor_test.go @@ -1,22 +1,27 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: Apache-2.0 // -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// Copyright (c) 2023 Berachain Foundation // -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: // -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. package misc_test @@ -24,8 +29,8 @@ import ( "testing" tbindings "pkg.berachain.dev/polaris/contracts/bindings/testing" - utils "pkg.berachain.dev/polaris/cosmos/testing/e2e" network "pkg.berachain.dev/polaris/e2e/localnet/network" + utils "pkg.berachain.dev/polaris/e2e/precompile" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -34,7 +39,7 @@ import ( func TestMiscellaneousPrecompile(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/testing/e2e/precompile/misc") + RunSpecs(t, "e2e/precompile/misc") } var _ = Describe("Miscellaneous Precompile Tests", func() { diff --git a/cosmos/testing/e2e/precompile/staking/staking_test.go b/e2e/precompile/contracts/staking/staking_test.go similarity index 81% rename from cosmos/testing/e2e/precompile/staking/staking_test.go rename to e2e/precompile/contracts/staking/staking_test.go index fef4548428..7d7ec07dc7 100644 --- a/cosmos/testing/e2e/precompile/staking/staking_test.go +++ b/e2e/precompile/contracts/staking/staking_test.go @@ -1,22 +1,27 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: Apache-2.0 // -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// Copyright (c) 2023 Berachain Foundation // -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: // -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. package staking_test @@ -31,8 +36,8 @@ import ( bbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" bindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/staking" tbindings "pkg.berachain.dev/polaris/contracts/bindings/testing" - utils "pkg.berachain.dev/polaris/cosmos/testing/e2e" network "pkg.berachain.dev/polaris/e2e/localnet/network" + utils "pkg.berachain.dev/polaris/e2e/precompile" "pkg.berachain.dev/polaris/eth/common" . "github.com/onsi/ginkgo/v2" @@ -42,7 +47,7 @@ import ( func TestStakingPrecompile(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/testing/e2e/precompile/staking") + RunSpecs(t, "e2e/precompile/staking") } var _ = Describe("Staking", func() { diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod new file mode 100644 index 0000000000..d46f43eaa4 --- /dev/null +++ b/e2e/precompile/go.mod @@ -0,0 +1,203 @@ +module pkg.berachain.dev/polaris/e2e/precompile + +go 1.21 + +replace ( + // We replace `go-ethereum` with `polaris-geth` in order include our required changes. + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 + // Required at the moment until a bug in the comsos-sdk is fixed. + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) + +require ( + cosmossdk.io/core v0.11.0 + cosmossdk.io/math v1.1.2 + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d + github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/gomega v1.27.10 + pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a +) + +require ( + cosmossdk.io/api v0.7.1 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/depinject v1.0.0-alpha.4 // indirect + cosmossdk.io/errors v1.0.0 // indirect + cosmossdk.io/log v1.2.1 // indirect + cosmossdk.io/store v1.0.0-rc.0 // indirect + cosmossdk.io/x/tx v0.10.0 // indirect + filippo.io/edwards25519 v1.0.0 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect + github.com/cenkalti/backoff/v4 v4.2.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.0 // indirect + github.com/cometbft/cometbft-db v0.8.0 // indirect + github.com/containerd/continuity v0.3.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.0.0 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.4.11 // indirect + github.com/cosmos/iavl v1.0.0-rc.1 // indirect + github.com/cosmos/ics23/go v0.10.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect + github.com/danieljoos/wincred v1.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deckarep/golang-set/v2 v2.3.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v24.0.4+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/emicklei/dot v1.6.0 // indirect + github.com/ethereum/go-ethereum v1.12.0 // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/getsentry/sentry-go v0.23.0 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.1.0 // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/handlers v1.5.1 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.1 // indirect + github.com/hashicorp/go-plugin v1.5.1 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/linxGnu/grocksdb v1.8.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/minio/highwayhash v1.0.2 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect + github.com/opencontainers/runc v1.1.5 // indirect + github.com/ory/dockertest v3.3.5+incompatible // indirect + github.com/pelletier/go-toml/v2 v2.0.9 // indirect + github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rs/cors v1.9.0 // indirect + github.com/rs/zerolog v1.30.0 // indirect + github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.16.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + github.com/zondax/hid v0.9.1 // indirect + github.com/zondax/ledger-go v0.14.1 // indirect + go.etcd.io/bbolt v1.3.7 // indirect + golang.org/x/crypto v0.13.0 // indirect + golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/grpc v1.58.1 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.0 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum new file mode 100644 index 0000000000..0fbc0d021c --- /dev/null +++ b/e2e/precompile/go.sum @@ -0,0 +1,1420 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= +cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= +cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= +cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= +cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= +cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= +cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= +cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= +cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= +cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= +cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= +cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= +cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 h1:WRzIKM4RUH2YwhrpwMQ/VuU0UVbnsfrg+b+PrKkpH0E= +github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05/go.mod h1:sOleKuvS3KgH6rpLX1d100PZWiJMVsGXswyxeCHTplo= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= +github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= +github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= +github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= +github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= +github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= +github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= +github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= +github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= +github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= +github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= +github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= +github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= +github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= +github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= +github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= +github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= +github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +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= +github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= +github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= +github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= +github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= +github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= +github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= +github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= +github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +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/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +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/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= +github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= +github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +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= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +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= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +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= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= +golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +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= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a h1:QMJRzQpU3/i5WBakrL5V0TE5CcEshC60nw1Ek+bJpJg= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a h1:flqfT2k9hTMooU5d/bdaIpQrU9uvTsZ93cUAVXw4JQs= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:TZhwmadAUlnyf450t7suO5sN3AGRNE3qziXldP58rUs= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/cosmos/testing/e2e/polard/Dockerfile b/e2e/precompile/polard/Dockerfile similarity index 100% rename from cosmos/testing/e2e/polard/Dockerfile rename to e2e/precompile/polard/Dockerfile diff --git a/cosmos/testing/e2e/polard/config/addrbook.json b/e2e/precompile/polard/config/addrbook.json similarity index 100% rename from cosmos/testing/e2e/polard/config/addrbook.json rename to e2e/precompile/polard/config/addrbook.json diff --git a/cosmos/testing/e2e/polard/config/app.toml b/e2e/precompile/polard/config/app.toml similarity index 100% rename from cosmos/testing/e2e/polard/config/app.toml rename to e2e/precompile/polard/config/app.toml diff --git a/cosmos/testing/e2e/polard/config/client.toml b/e2e/precompile/polard/config/client.toml similarity index 100% rename from cosmos/testing/e2e/polard/config/client.toml rename to e2e/precompile/polard/config/client.toml diff --git a/cosmos/testing/e2e/polard/config/config.toml b/e2e/precompile/polard/config/config.toml similarity index 100% rename from cosmos/testing/e2e/polard/config/config.toml rename to e2e/precompile/polard/config/config.toml diff --git a/cosmos/testing/e2e/polard/config/ethkeys/alice.key b/e2e/precompile/polard/config/ethkeys/alice.key similarity index 100% rename from cosmos/testing/e2e/polard/config/ethkeys/alice.key rename to e2e/precompile/polard/config/ethkeys/alice.key diff --git a/cosmos/testing/e2e/polard/config/ethkeys/bob.key b/e2e/precompile/polard/config/ethkeys/bob.key similarity index 100% rename from cosmos/testing/e2e/polard/config/ethkeys/bob.key rename to e2e/precompile/polard/config/ethkeys/bob.key diff --git a/cosmos/testing/e2e/polard/config/ethkeys/charlie.key b/e2e/precompile/polard/config/ethkeys/charlie.key similarity index 100% rename from cosmos/testing/e2e/polard/config/ethkeys/charlie.key rename to e2e/precompile/polard/config/ethkeys/charlie.key diff --git a/cosmos/testing/e2e/polard/config/genesis.json b/e2e/precompile/polard/config/genesis.json similarity index 100% rename from cosmos/testing/e2e/polard/config/genesis.json rename to e2e/precompile/polard/config/genesis.json diff --git a/cosmos/testing/e2e/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json b/e2e/precompile/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json similarity index 100% rename from cosmos/testing/e2e/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json rename to e2e/precompile/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json diff --git a/cosmos/testing/e2e/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address b/e2e/precompile/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address similarity index 100% rename from cosmos/testing/e2e/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address rename to e2e/precompile/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address diff --git a/cosmos/testing/e2e/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address b/e2e/precompile/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address similarity index 100% rename from cosmos/testing/e2e/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address rename to e2e/precompile/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address diff --git a/cosmos/testing/e2e/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address b/e2e/precompile/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address similarity index 100% rename from cosmos/testing/e2e/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address rename to e2e/precompile/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address diff --git a/cosmos/testing/e2e/polard/config/keyring-test/dev0.info b/e2e/precompile/polard/config/keyring-test/dev0.info similarity index 100% rename from cosmos/testing/e2e/polard/config/keyring-test/dev0.info rename to e2e/precompile/polard/config/keyring-test/dev0.info diff --git a/cosmos/testing/e2e/polard/config/keyring-test/dev1.info b/e2e/precompile/polard/config/keyring-test/dev1.info similarity index 100% rename from cosmos/testing/e2e/polard/config/keyring-test/dev1.info rename to e2e/precompile/polard/config/keyring-test/dev1.info diff --git a/cosmos/testing/e2e/polard/config/keyring-test/dev2.info b/e2e/precompile/polard/config/keyring-test/dev2.info similarity index 100% rename from cosmos/testing/e2e/polard/config/keyring-test/dev2.info rename to e2e/precompile/polard/config/keyring-test/dev2.info diff --git a/cosmos/testing/e2e/polard/config/node_key.json b/e2e/precompile/polard/config/node_key.json similarity index 100% rename from cosmos/testing/e2e/polard/config/node_key.json rename to e2e/precompile/polard/config/node_key.json diff --git a/cosmos/testing/e2e/polard/config/polaris.toml b/e2e/precompile/polard/config/polaris.toml similarity index 100% rename from cosmos/testing/e2e/polard/config/polaris.toml rename to e2e/precompile/polard/config/polaris.toml diff --git a/cosmos/testing/e2e/polard/config/priv_validator_key.json b/e2e/precompile/polard/config/priv_validator_key.json similarity index 100% rename from cosmos/testing/e2e/polard/config/priv_validator_key.json rename to e2e/precompile/polard/config/priv_validator_key.json diff --git a/cosmos/testing/e2e/polard/config/priv_validator_state.json b/e2e/precompile/polard/config/priv_validator_state.json similarity index 100% rename from cosmos/testing/e2e/polard/config/priv_validator_state.json rename to e2e/precompile/polard/config/priv_validator_state.json diff --git a/cosmos/testing/e2e/polard/start-node.sh b/e2e/precompile/polard/start-node.sh similarity index 100% rename from cosmos/testing/e2e/polard/start-node.sh rename to e2e/precompile/polard/start-node.sh diff --git a/cosmos/testing/e2e/utils.go b/e2e/precompile/utils.go similarity index 100% rename from cosmos/testing/e2e/utils.go rename to e2e/precompile/utils.go diff --git a/e2e/testapp/docker/base.Dockerfile b/e2e/testapp/docker/base.Dockerfile index e62dc3b364..16986eeb0c 100644 --- a/e2e/testapp/docker/base.Dockerfile +++ b/e2e/testapp/docker/base.Dockerfile @@ -41,19 +41,17 @@ RUN set -eux; \ # Set the working directory WORKDIR /workdir -# Copy go.work and go.work.sum files (🔥 upgrade) -# TODO: conditional copy via USE_GOWORK arg. -COPY ./go.work ./go.work.sum ./ - # Copy the go.mod and go.sum files for each module COPY ./contracts/go.sum ./contracts/go.mod ./contracts/ COPY ./cosmos/go.sum ./cosmos/go.mod ./cosmos/ COPY ./eth/go.sum ./eth/go.mod ./eth/ COPY ./lib/go.sum ./lib/go.mod ./lib/ -COPY ./magefiles/go.sum ./magefiles/go.mod ./magefiles/ -COPY ./e2e/localnet/go.sum ./e2e/localnet/go.mod ./e2e/localnet/ COPY ./e2e/testapp/go.sum ./e2e/testapp/go.mod ./e2e/testapp/ +# Link via workspace +RUN go work init +RUN go work use ./contracts ./cosmos ./eth ./lib ./e2e/testapp + # Download the go module dependencies RUN go mod download diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 083eea447a..a9688413b1 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,8 +15,8 @@ require ( cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 - pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 + pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a ) require ( @@ -65,7 +65,6 @@ require ( github.com/99designs/keyring v1.2.1 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.312 // indirect @@ -109,7 +108,6 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/docker/docker v24.0.4+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect @@ -209,7 +207,6 @@ require ( github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect github.com/oklog/run v1.1.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/peterh/liner v1.2.2 // indirect github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b // indirect @@ -274,8 +271,8 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230827184022-e3cec7a2c178 // indirect - pkg.berachain.dev/polaris/lib v0.0.0-20230827184022-e3cec7a2c178 // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 // indirect + pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 7ebe785e8b..55eacd0b3d 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -1887,14 +1887,14 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230827184022-e3cec7a2c178 h1:MGHPDgY930CRmW1UMPICSg73nRfX/lRdXV2h+w0s/zk= -pkg.berachain.dev/polaris/contracts v0.0.0-20230827184022-e3cec7a2c178/go.mod h1:ceCUUKQ1GkDJqXjAmeOrjJ/8AEqdUip466n8G4UCgjM= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697 h1:AlcCIDjgTcurCo7xA5lkPcATEgMrqxorZnMzes4gzEY= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230830221145-a6c6454d3697/go.mod h1:U/eSQDbBsNW495y62BB9Pibim056lpZE+4AxfZ0x2OA= -pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 h1:d+w0G+qOE9s1tYNOdMDaOmNbUCcP0EjUeXXMFT5jg2M= -pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697/go.mod h1:Ry+Ldr32oNPMJVVfDCMYymqA2BlXsL5oyrZTVLxIT1A= -pkg.berachain.dev/polaris/lib v0.0.0-20230827184022-e3cec7a2c178 h1:A+7mk8r9a5jEq3Xp/AZoP6i0mFTJFn/zqSxcDntdak0= -pkg.berachain.dev/polaris/lib v0.0.0-20230827184022-e3cec7a2c178/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 h1:D51V7Xugl2EOq7c966pjqTYXT7WodBZMiIsqcze/qgo= +pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697/go.mod h1:ceCUUKQ1GkDJqXjAmeOrjJ/8AEqdUip466n8G4UCgjM= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a h1:QMJRzQpU3/i5WBakrL5V0TE5CcEshC60nw1Ek+bJpJg= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= +pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 h1:wgvK5vI7UlQYBs3kB2wZBgsxUjYK1lCV0LFJ4YF2u/4= +pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/eth/go.mod b/eth/go.mod index 9544203572..ab416a3a04 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -12,8 +12,8 @@ require ( github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 golang.org/x/text v0.13.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 - pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 + pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a ) require ( diff --git a/eth/go.sum b/eth/go.sum index 577f9a2f7a..677f07c6bf 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -437,10 +437,10 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 h1:D51V7Xugl2EOq7c966pjqTYXT7WodBZMiIsqcze/qgo= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697/go.mod h1:ceCUUKQ1GkDJqXjAmeOrjJ/8AEqdUip466n8G4UCgjM= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 h1:wgvK5vI7UlQYBs3kB2wZBgsxUjYK1lCV0LFJ4YF2u/4= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/go.work b/go.work index e65f0c7aa2..0f8d10b130 100644 --- a/go.work +++ b/go.work @@ -4,6 +4,7 @@ use ( ./contracts ./cosmos ./e2e/localnet + ./e2e/precompile ./e2e/testapp ./eth ./lib diff --git a/go.work.sum b/go.work.sum index ecefe96c1d..b1b20df4d7 100644 --- a/go.work.sum +++ b/go.work.sum @@ -138,15 +138,23 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +cosmossdk.io/api v0.7.0/go.mod h1:kJFAEMLN57y0viszHDPLMmieF0471o5QAwwApa+270M= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= -github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= @@ -167,7 +175,6 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbE github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= @@ -211,7 +218,6 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= diff --git a/magefiles/cosmos.go b/magefiles/cosmos.go index 79c83db8d7..176d01f2fc 100644 --- a/magefiles/cosmos.go +++ b/magefiles/cosmos.go @@ -53,7 +53,7 @@ var ( // Localnet. baseImage = "polard/base:v0.0.0" - localnetClientPath = "./cosmos/testing/e2e/polard" + localnetClientPath = "./e2e/precompile/polard" localnetDockerPath = localnetClientPath + "/Dockerfile" ) From ae59de353b7d78c8e91376e15a2444158fbaf9b7 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 13:34:22 -0400 Subject: [PATCH 019/122] perf(node): Reduce size of `WrappedEthereumResponse` to reduce memory allocs (#1108) Should slighlty reduce memory allocs under high txn load. --- cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go | 350 +++++++------------ cosmos/proto/polaris/evm/v1alpha1/tx.proto | 21 +- cosmos/x/evm/keeper/msg_server.go | 20 +- cosmos/x/evm/types/tx.pb.go | 209 ++++------- go.work.sum | 9 - 5 files changed, 224 insertions(+), 385 deletions(-) diff --git a/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go b/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go index 051d011525..cc7068d1ef 100644 --- a/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go +++ b/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go @@ -436,18 +436,14 @@ func (x *fastReflection_WrappedEthereumTransaction) ProtoMethods() *protoiface.M } var ( - md_WrappedEthereumTransactionResult protoreflect.MessageDescriptor - fd_WrappedEthereumTransactionResult_gas_used protoreflect.FieldDescriptor - fd_WrappedEthereumTransactionResult_vm_error protoreflect.FieldDescriptor - fd_WrappedEthereumTransactionResult_return_data protoreflect.FieldDescriptor + md_WrappedEthereumTransactionResult protoreflect.MessageDescriptor + fd_WrappedEthereumTransactionResult_status protoreflect.FieldDescriptor ) func init() { file_polaris_evm_v1alpha1_tx_proto_init() md_WrappedEthereumTransactionResult = File_polaris_evm_v1alpha1_tx_proto.Messages().ByName("WrappedEthereumTransactionResult") - fd_WrappedEthereumTransactionResult_gas_used = md_WrappedEthereumTransactionResult.Fields().ByName("gas_used") - fd_WrappedEthereumTransactionResult_vm_error = md_WrappedEthereumTransactionResult.Fields().ByName("vm_error") - fd_WrappedEthereumTransactionResult_return_data = md_WrappedEthereumTransactionResult.Fields().ByName("return_data") + fd_WrappedEthereumTransactionResult_status = md_WrappedEthereumTransactionResult.Fields().ByName("status") } var _ protoreflect.Message = (*fastReflection_WrappedEthereumTransactionResult)(nil) @@ -515,21 +511,9 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Interface() protorefle // While iterating, mutating operations may only be performed // on the current field descriptor. func (x *fastReflection_WrappedEthereumTransactionResult) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if x.GasUsed != uint64(0) { - value := protoreflect.ValueOfUint64(x.GasUsed) - if !f(fd_WrappedEthereumTransactionResult_gas_used, value) { - return - } - } - if x.VmError != "" { - value := protoreflect.ValueOfString(x.VmError) - if !f(fd_WrappedEthereumTransactionResult_vm_error, value) { - return - } - } - if len(x.ReturnData) != 0 { - value := protoreflect.ValueOfBytes(x.ReturnData) - if !f(fd_WrappedEthereumTransactionResult_return_data, value) { + if x.Status != 0 { + value := protoreflect.ValueOfEnum((protoreflect.EnumNumber)(x.Status)) + if !f(fd_WrappedEthereumTransactionResult_status, value) { return } } @@ -548,12 +532,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Range(f func(protorefl // a repeated field is populated if it is non-empty. func (x *fastReflection_WrappedEthereumTransactionResult) Has(fd protoreflect.FieldDescriptor) bool { switch fd.FullName() { - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.gas_used": - return x.GasUsed != uint64(0) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.vm_error": - return x.VmError != "" - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.return_data": - return len(x.ReturnData) != 0 + case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status": + return x.Status != 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedEthereumTransactionResult")) @@ -570,12 +550,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Has(fd protoreflect.Fi // Clear is a mutating operation and unsafe for concurrent use. func (x *fastReflection_WrappedEthereumTransactionResult) Clear(fd protoreflect.FieldDescriptor) { switch fd.FullName() { - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.gas_used": - x.GasUsed = uint64(0) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.vm_error": - x.VmError = "" - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.return_data": - x.ReturnData = nil + case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status": + x.Status = 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedEthereumTransactionResult")) @@ -592,15 +568,9 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Clear(fd protoreflect. // of the value; to obtain a mutable reference, use Mutable. func (x *fastReflection_WrappedEthereumTransactionResult) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { switch descriptor.FullName() { - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.gas_used": - value := x.GasUsed - return protoreflect.ValueOfUint64(value) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.vm_error": - value := x.VmError - return protoreflect.ValueOfString(value) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.return_data": - value := x.ReturnData - return protoreflect.ValueOfBytes(value) + case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status": + value := x.Status + return protoreflect.ValueOfEnum((protoreflect.EnumNumber)(value)) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedEthereumTransactionResult")) @@ -621,12 +591,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Get(descriptor protore // Set is a mutating operation and unsafe for concurrent use. func (x *fastReflection_WrappedEthereumTransactionResult) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { switch fd.FullName() { - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.gas_used": - x.GasUsed = value.Uint() - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.vm_error": - x.VmError = value.Interface().(string) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.return_data": - x.ReturnData = value.Bytes() + case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status": + x.Status = (Status)(value.Enum()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedEthereumTransactionResult")) @@ -647,12 +613,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Set(fd protoreflect.Fi // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_WrappedEthereumTransactionResult) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.gas_used": - panic(fmt.Errorf("field gas_used of message polaris.evm.v1alpha1.WrappedEthereumTransactionResult is not mutable")) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.vm_error": - panic(fmt.Errorf("field vm_error of message polaris.evm.v1alpha1.WrappedEthereumTransactionResult is not mutable")) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.return_data": - panic(fmt.Errorf("field return_data of message polaris.evm.v1alpha1.WrappedEthereumTransactionResult is not mutable")) + case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status": + panic(fmt.Errorf("field status of message polaris.evm.v1alpha1.WrappedEthereumTransactionResult is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedEthereumTransactionResult")) @@ -666,12 +628,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) Mutable(fd protoreflec // For lists, maps, and messages, this returns a new, empty, mutable value. func (x *fastReflection_WrappedEthereumTransactionResult) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.gas_used": - return protoreflect.ValueOfUint64(uint64(0)) - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.vm_error": - return protoreflect.ValueOfString("") - case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.return_data": - return protoreflect.ValueOfBytes(nil) + case "polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status": + return protoreflect.ValueOfEnum(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedEthereumTransactionResult")) @@ -741,16 +699,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) ProtoMethods() *protoi var n int var l int _ = l - if x.GasUsed != 0 { - n += 1 + runtime.Sov(uint64(x.GasUsed)) - } - l = len(x.VmError) - if l > 0 { - n += 1 + l + runtime.Sov(uint64(l)) - } - l = len(x.ReturnData) - if l > 0 { - n += 1 + l + runtime.Sov(uint64(l)) + if x.Status != 0 { + n += 1 + runtime.Sov(uint64(x.Status)) } if x.unknownFields != nil { n += len(x.unknownFields) @@ -781,22 +731,8 @@ func (x *fastReflection_WrappedEthereumTransactionResult) ProtoMethods() *protoi i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } - if len(x.ReturnData) > 0 { - i -= len(x.ReturnData) - copy(dAtA[i:], x.ReturnData) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ReturnData))) - i-- - dAtA[i] = 0x1a - } - if len(x.VmError) > 0 { - i -= len(x.VmError) - copy(dAtA[i:], x.VmError) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.VmError))) - i-- - dAtA[i] = 0x12 - } - if x.GasUsed != 0 { - i = runtime.EncodeVarint(dAtA, i, uint64(x.GasUsed)) + if x.Status != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Status)) i-- dAtA[i] = 0x8 } @@ -851,28 +787,9 @@ func (x *fastReflection_WrappedEthereumTransactionResult) ProtoMethods() *protoi switch fieldNum { case 1: if wireType != 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) - } - x.GasUsed = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - x.GasUsed |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - case 2: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field VmError", wireType) - } - var stringLen uint64 + x.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow @@ -882,58 +799,11 @@ func (x *fastReflection_WrappedEthereumTransactionResult) ProtoMethods() *protoi } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + x.Status |= Status(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if postIndex > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - x.VmError = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ReturnData", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if postIndex > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - x.ReturnData = append(x.ReturnData[:0], dAtA[iNdEx:postIndex]...) - if x.ReturnData == nil { - x.ReturnData = []byte{} - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -1002,6 +872,60 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Status represents the status of a transaction. +type Status int32 + +const ( + // STATUS_REVERT_UNSPECIFIED indicates that the transaction reverted. + Status_STATUS_REVERT_UNSPECIFIED Status = 0 + // STATUS_SUCCESS indicates that the transaction completed successfully. + Status_STATUS_SUCCESS Status = 1 + // STATUS_NOT_INCLUDED indicates that the transaction was not included in the + // `evm` block, due to an critical error. + Status_STATUS_NOT_INCLUDED Status = 2 +) + +// Enum value maps for Status. +var ( + Status_name = map[int32]string{ + 0: "STATUS_REVERT_UNSPECIFIED", + 1: "STATUS_SUCCESS", + 2: "STATUS_NOT_INCLUDED", + } + Status_value = map[string]int32{ + "STATUS_REVERT_UNSPECIFIED": 0, + "STATUS_SUCCESS": 1, + "STATUS_NOT_INCLUDED": 2, + } +) + +func (x Status) Enum() *Status { + p := new(Status) + *p = x + return p +} + +func (x Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Status) Descriptor() protoreflect.EnumDescriptor { + return file_polaris_evm_v1alpha1_tx_proto_enumTypes[0].Descriptor() +} + +func (Status) Type() protoreflect.EnumType { + return &file_polaris_evm_v1alpha1_tx_proto_enumTypes[0] +} + +func (x Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Status.Descriptor instead. +func (Status) EnumDescriptor() ([]byte, []int) { + return file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP(), []int{0} +} + // WrappedEthereumTransaction encapsulates an Ethereum transaction as an SDK message. type WrappedEthereumTransaction struct { state protoimpl.MessageState @@ -1045,12 +969,8 @@ type WrappedEthereumTransactionResult struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // `gas_used` represents the gas used by the virtual machine execution. - GasUsed uint64 `protobuf:"varint,1,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` - // `vm_error` contains an error message if the virtual machine execution failed. - VmError string `protobuf:"bytes,2,opt,name=vm_error,json=vmError,proto3" json:"vm_error,omitempty"` - // `return_data` contains the return data of the virtual machine execution. - ReturnData []byte `protobuf:"bytes,3,opt,name=return_data,json=returnData,proto3" json:"return_data,omitempty"` + // `status` represents a transaction's status + Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=polaris.evm.v1alpha1.Status" json:"status,omitempty"` } func (x *WrappedEthereumTransactionResult) Reset() { @@ -1073,25 +993,11 @@ func (*WrappedEthereumTransactionResult) Descriptor() ([]byte, []int) { return file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP(), []int{1} } -func (x *WrappedEthereumTransactionResult) GetGasUsed() uint64 { - if x != nil { - return x.GasUsed - } - return 0 -} - -func (x *WrappedEthereumTransactionResult) GetVmError() string { - if x != nil { - return x.VmError - } - return "" -} - -func (x *WrappedEthereumTransactionResult) GetReturnData() []byte { +func (x *WrappedEthereumTransactionResult) GetStatus() Status { if x != nil { - return x.ReturnData + return x.Status } - return nil + return Status_STATUS_REVERT_UNSPECIFIED } var File_polaris_evm_v1alpha1_tx_proto protoreflect.FileDescriptor @@ -1105,36 +1011,40 @@ var file_polaris_evm_v1alpha1_tx_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x79, 0x0a, 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x22, 0x58, 0x0a, 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x32, 0x8f, 0x01, 0x0a, 0x0a, - 0x4d, 0x73, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7a, 0x0a, 0x0e, 0x45, 0x74, - 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x2e, 0x70, - 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x36, - 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc8, 0x01, - 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, - 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2f, - 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x76, 0x6d, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x45, 0x58, 0xaa, 0x02, - 0x14, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x14, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, - 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x20, 0x50, - 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x16, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x54, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, + 0x45, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, + 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x44, 0x10, 0x02, + 0x32, 0x8f, 0x01, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x7a, 0x0a, 0x0e, 0x45, 0x74, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x36, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x05, 0x80, 0xe7, 0xb0, + 0x2a, 0x01, 0x42, 0xc8, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, + 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, + 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6c, + 0x61, 0x72, 0x69, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x3b, 0x65, 0x76, 0x6d, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, + 0x50, 0x45, 0x58, 0xaa, 0x02, 0x14, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x45, 0x76, + 0x6d, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x14, 0x50, 0x6f, 0x6c, + 0x61, 0x72, 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0xe2, 0x02, 0x20, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x3a, 0x3a, + 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1149,19 +1059,22 @@ func file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP() []byte { return file_polaris_evm_v1alpha1_tx_proto_rawDescData } +var file_polaris_evm_v1alpha1_tx_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_polaris_evm_v1alpha1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_polaris_evm_v1alpha1_tx_proto_goTypes = []interface{}{ - (*WrappedEthereumTransaction)(nil), // 0: polaris.evm.v1alpha1.WrappedEthereumTransaction - (*WrappedEthereumTransactionResult)(nil), // 1: polaris.evm.v1alpha1.WrappedEthereumTransactionResult + (Status)(0), // 0: polaris.evm.v1alpha1.Status + (*WrappedEthereumTransaction)(nil), // 1: polaris.evm.v1alpha1.WrappedEthereumTransaction + (*WrappedEthereumTransactionResult)(nil), // 2: polaris.evm.v1alpha1.WrappedEthereumTransactionResult } var file_polaris_evm_v1alpha1_tx_proto_depIdxs = []int32{ - 0, // 0: polaris.evm.v1alpha1.MsgService.EthTransaction:input_type -> polaris.evm.v1alpha1.WrappedEthereumTransaction - 1, // 1: polaris.evm.v1alpha1.MsgService.EthTransaction:output_type -> polaris.evm.v1alpha1.WrappedEthereumTransactionResult - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 0, // 0: polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status:type_name -> polaris.evm.v1alpha1.Status + 1, // 1: polaris.evm.v1alpha1.MsgService.EthTransaction:input_type -> polaris.evm.v1alpha1.WrappedEthereumTransaction + 2, // 2: polaris.evm.v1alpha1.MsgService.EthTransaction:output_type -> polaris.evm.v1alpha1.WrappedEthereumTransactionResult + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_polaris_evm_v1alpha1_tx_proto_init() } @@ -1200,13 +1113,14 @@ func file_polaris_evm_v1alpha1_tx_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_polaris_evm_v1alpha1_tx_proto_rawDesc, - NumEnums: 0, + NumEnums: 1, NumMessages: 2, NumExtensions: 0, NumServices: 1, }, GoTypes: file_polaris_evm_v1alpha1_tx_proto_goTypes, DependencyIndexes: file_polaris_evm_v1alpha1_tx_proto_depIdxs, + EnumInfos: file_polaris_evm_v1alpha1_tx_proto_enumTypes, MessageInfos: file_polaris_evm_v1alpha1_tx_proto_msgTypes, }.Build() File_polaris_evm_v1alpha1_tx_proto = out.File diff --git a/cosmos/proto/polaris/evm/v1alpha1/tx.proto b/cosmos/proto/polaris/evm/v1alpha1/tx.proto index 7695b81c7a..272ae913f5 100644 --- a/cosmos/proto/polaris/evm/v1alpha1/tx.proto +++ b/cosmos/proto/polaris/evm/v1alpha1/tx.proto @@ -39,14 +39,19 @@ message WrappedEthereumTransaction { bytes data = 1; } +// Status represents the status of a transaction. +enum Status { + // STATUS_REVERT_UNSPECIFIED indicates that the transaction reverted. + STATUS_REVERT_UNSPECIFIED = 0; + // STATUS_SUCCESS indicates that the transaction completed successfully. + STATUS_SUCCESS = 1; + // STATUS_NOT_INCLUDED indicates that the transaction was not included in the + // `evm` block, due to an critical error. + STATUS_NOT_INCLUDED = 2; +} + // WrappedEthereumTransactionResult defines the Msg/EthereumTx response type. message WrappedEthereumTransactionResult { - // `gas_used` represents the gas used by the virtual machine execution. - uint64 gas_used = 1; - - // `vm_error` contains an error message if the virtual machine execution failed. - string vm_error = 2; - - // `return_data` contains the return data of the virtual machine execution. - bytes return_data = 3; + // `status` represents a transaction's status + Status status = 1; } diff --git a/cosmos/x/evm/keeper/msg_server.go b/cosmos/x/evm/keeper/msg_server.go index fa88c4e56c..ee0096c4b6 100644 --- a/cosmos/x/evm/keeper/msg_server.go +++ b/cosmos/x/evm/keeper/msg_server.go @@ -36,21 +36,21 @@ var _ types.MsgServiceServer = &Keeper{} func (k *Keeper) EthTransaction( ctx context.Context, msg *types.WrappedEthereumTransaction, ) (*types.WrappedEthereumTransactionResult, error) { + res := &types.WrappedEthereumTransactionResult{} + // Process the transaction and return the result. result, err := k.ProcessTransaction(ctx, msg.AsTransaction()) if err != nil { - return nil, errorsmod.Wrapf(err, "failed to process transaction") + res.Status = types.Status_STATUS_NOT_INCLUDED + return res, errorsmod.Wrapf(err, "failed to process transaction") } - // Build the response. - vmErr := "" - if result.Err != nil { - vmErr = result.Err.Error() + // Check for a VM error. + if result.Err == nil { + res.Status = types.Status_STATUS_SUCCESS + } else { + res.Status = types.Status_STATUS_REVERT_UNSPECIFIED } - return &types.WrappedEthereumTransactionResult{ - GasUsed: result.UsedGas, - VmError: vmErr, - ReturnData: result.ReturnData, - }, nil + return res, nil } diff --git a/cosmos/x/evm/types/tx.pb.go b/cosmos/x/evm/types/tx.pb.go index b65d3d30cd..008ad571aa 100644 --- a/cosmos/x/evm/types/tx.pb.go +++ b/cosmos/x/evm/types/tx.pb.go @@ -28,6 +28,39 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// Status represents the status of a transaction. +type Status int32 + +const ( + // STATUS_REVERT_UNSPECIFIED indicates that the transaction reverted. + Status_STATUS_REVERT_UNSPECIFIED Status = 0 + // STATUS_SUCCESS indicates that the transaction completed successfully. + Status_STATUS_SUCCESS Status = 1 + // STATUS_NOT_INCLUDED indicates that the transaction was not included in the + // `evm` block, due to an critical error. + Status_STATUS_NOT_INCLUDED Status = 2 +) + +var Status_name = map[int32]string{ + 0: "STATUS_REVERT_UNSPECIFIED", + 1: "STATUS_SUCCESS", + 2: "STATUS_NOT_INCLUDED", +} + +var Status_value = map[string]int32{ + "STATUS_REVERT_UNSPECIFIED": 0, + "STATUS_SUCCESS": 1, + "STATUS_NOT_INCLUDED": 2, +} + +func (x Status) String() string { + return proto.EnumName(Status_name, int32(x)) +} + +func (Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d8b33d2a2c64400f, []int{0} +} + // WrappedEthereumTransaction encapsulates an Ethereum transaction as an SDK message. type WrappedEthereumTransaction struct { // data is inner transaction data of the Ethereum transaction. @@ -76,12 +109,8 @@ func (m *WrappedEthereumTransaction) GetData() []byte { // WrappedEthereumTransactionResult defines the Msg/EthereumTx response type. type WrappedEthereumTransactionResult struct { - // `gas_used` represents the gas used by the virtual machine execution. - GasUsed uint64 `protobuf:"varint,1,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` - // `vm_error` contains an error message if the virtual machine execution failed. - VmError string `protobuf:"bytes,2,opt,name=vm_error,json=vmError,proto3" json:"vm_error,omitempty"` - // `return_data` contains the return data of the virtual machine execution. - ReturnData []byte `protobuf:"bytes,3,opt,name=return_data,json=returnData,proto3" json:"return_data,omitempty"` + // `status` represents a transaction's status + Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=polaris.evm.v1alpha1.Status" json:"status,omitempty"` } func (m *WrappedEthereumTransactionResult) Reset() { *m = WrappedEthereumTransactionResult{} } @@ -117,28 +146,15 @@ func (m *WrappedEthereumTransactionResult) XXX_DiscardUnknown() { var xxx_messageInfo_WrappedEthereumTransactionResult proto.InternalMessageInfo -func (m *WrappedEthereumTransactionResult) GetGasUsed() uint64 { +func (m *WrappedEthereumTransactionResult) GetStatus() Status { if m != nil { - return m.GasUsed + return m.Status } - return 0 -} - -func (m *WrappedEthereumTransactionResult) GetVmError() string { - if m != nil { - return m.VmError - } - return "" -} - -func (m *WrappedEthereumTransactionResult) GetReturnData() []byte { - if m != nil { - return m.ReturnData - } - return nil + return Status_STATUS_REVERT_UNSPECIFIED } func init() { + proto.RegisterEnum("polaris.evm.v1alpha1.Status", Status_name, Status_value) proto.RegisterType((*WrappedEthereumTransaction)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransaction") proto.RegisterType((*WrappedEthereumTransactionResult)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransactionResult") } @@ -146,28 +162,29 @@ func init() { func init() { proto.RegisterFile("polaris/evm/v1alpha1/tx.proto", fileDescriptor_d8b33d2a2c64400f) } var fileDescriptor_d8b33d2a2c64400f = []byte{ - // 321 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0xbd, 0x4a, 0x03, 0x41, - 0x14, 0x85, 0x33, 0x1a, 0x8d, 0x8e, 0x62, 0xb1, 0x08, 0xc6, 0x05, 0xd7, 0x90, 0x2a, 0x88, 0xcc, - 0x26, 0x0a, 0x3e, 0x80, 0x18, 0x3b, 0x9b, 0x55, 0x11, 0x6c, 0xc2, 0xcd, 0xee, 0x65, 0x77, 0x31, - 0xb3, 0x33, 0xcc, 0xcc, 0x0e, 0x89, 0x95, 0x6f, 0xa0, 0x8f, 0xe2, 0x63, 0x58, 0xa6, 0xb4, 0x94, - 0xa4, 0xf0, 0x35, 0x24, 0x93, 0x04, 0x2c, 0x4c, 0x61, 0x35, 0x3f, 0xe7, 0x1e, 0xee, 0x39, 0x7c, - 0xf4, 0x48, 0x8a, 0x01, 0xa8, 0x5c, 0x87, 0x68, 0x79, 0x68, 0x3b, 0x30, 0x90, 0x19, 0x74, 0x42, - 0x33, 0x64, 0x52, 0x09, 0x23, 0xbc, 0xfd, 0x85, 0xcc, 0xd0, 0x72, 0xb6, 0x94, 0xfd, 0x83, 0x58, - 0x68, 0x2e, 0x74, 0xc8, 0x75, 0x1a, 0xda, 0xce, 0xec, 0x98, 0x8f, 0x37, 0xdb, 0xd4, 0x7f, 0x50, - 0x20, 0x25, 0x26, 0x5d, 0x93, 0xa1, 0xc2, 0x92, 0xdf, 0x29, 0x28, 0x34, 0xc4, 0x26, 0x17, 0x85, - 0xe7, 0xd1, 0x6a, 0x02, 0x06, 0xea, 0xa4, 0x41, 0x5a, 0xbb, 0x91, 0xbb, 0x37, 0x47, 0xb4, 0xb1, - 0xda, 0x11, 0xa1, 0x2e, 0x07, 0xc6, 0x3b, 0xa4, 0x5b, 0x29, 0xe8, 0x5e, 0xa9, 0x31, 0x71, 0xde, - 0x6a, 0x54, 0x4b, 0x41, 0xdf, 0x6b, 0x4c, 0x66, 0x92, 0xe5, 0x3d, 0x54, 0x4a, 0xa8, 0xfa, 0x5a, - 0x83, 0xb4, 0xb6, 0xa3, 0x9a, 0xe5, 0xdd, 0xd9, 0xd3, 0x3b, 0xa6, 0x3b, 0x0a, 0x4d, 0xa9, 0x8a, - 0x9e, 0x5b, 0xba, 0xee, 0x96, 0xd2, 0xf9, 0xd7, 0x15, 0x18, 0x38, 0x7b, 0x25, 0x94, 0xde, 0xe8, - 0xf4, 0x16, 0x95, 0xcd, 0x63, 0xf4, 0x9e, 0xe9, 0x5e, 0xd7, 0x64, 0xbf, 0xf3, 0xb6, 0xd9, 0x5f, - 0xed, 0xd9, 0xea, 0xbc, 0xfe, 0xc5, 0x7f, 0x1d, 0xf3, 0x86, 0xfe, 0xc6, 0xcb, 0xf7, 0xfb, 0x09, - 0xb9, 0xbc, 0xfe, 0x98, 0x04, 0x64, 0x3c, 0x09, 0xc8, 0xd7, 0x24, 0x20, 0x6f, 0xd3, 0xa0, 0x32, - 0x9e, 0x06, 0x95, 0xcf, 0x69, 0x50, 0x79, 0x3c, 0x95, 0x4f, 0x29, 0xeb, 0xa3, 0x82, 0x38, 0x83, - 0xbc, 0x60, 0x09, 0xda, 0x70, 0x09, 0x6e, 0xc1, 0x62, 0xe8, 0x08, 0x9a, 0x91, 0x44, 0xdd, 0xdf, - 0x74, 0x34, 0xce, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x0e, 0xd9, 0x14, 0xdd, 0x01, 0x00, - 0x00, + // 351 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0xc8, 0xcf, 0x49, + 0x2c, 0xca, 0x2c, 0xd6, 0x4f, 0x2d, 0xcb, 0xd5, 0x2f, 0x33, 0x4c, 0xcc, 0x29, 0xc8, 0x48, 0x34, + 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0x4a, 0xeb, 0xa5, 0x96, + 0xe5, 0xea, 0xc1, 0xa4, 0xa5, 0xc4, 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, + 0xf5, 0xcb, 0x0c, 0x41, 0x14, 0x44, 0xb9, 0x92, 0x01, 0x97, 0x54, 0x78, 0x51, 0x62, 0x41, 0x41, + 0x6a, 0x8a, 0x6b, 0x49, 0x46, 0x6a, 0x51, 0x6a, 0x69, 0x6e, 0x48, 0x51, 0x62, 0x5e, 0x71, 0x62, + 0x72, 0x49, 0x66, 0x7e, 0x9e, 0x90, 0x10, 0x17, 0x4b, 0x4a, 0x62, 0x49, 0xa2, 0x04, 0xa3, 0x02, + 0xa3, 0x06, 0x4f, 0x10, 0x98, 0xad, 0x14, 0xc1, 0xa5, 0x80, 0x5b, 0x47, 0x50, 0x6a, 0x71, 0x69, + 0x4e, 0x89, 0x90, 0x09, 0x17, 0x5b, 0x71, 0x49, 0x62, 0x49, 0x69, 0x31, 0x58, 0x27, 0x9f, 0x91, + 0x8c, 0x1e, 0x36, 0x57, 0xe9, 0x05, 0x83, 0xd5, 0x04, 0x41, 0xd5, 0x6a, 0x85, 0x70, 0xb1, 0x41, + 0x44, 0x84, 0x64, 0xb9, 0x24, 0x83, 0x43, 0x1c, 0x43, 0x42, 0x83, 0xe3, 0x83, 0x5c, 0xc3, 0x5c, + 0x83, 0x42, 0xe2, 0x43, 0xfd, 0x82, 0x03, 0x5c, 0x9d, 0x3d, 0xdd, 0x3c, 0x5d, 0x5d, 0x04, 0x18, + 0x84, 0x84, 0xb8, 0xf8, 0xa0, 0xd2, 0xc1, 0xa1, 0xce, 0xce, 0xae, 0xc1, 0xc1, 0x02, 0x8c, 0x42, + 0xe2, 0x5c, 0xc2, 0x50, 0x31, 0x3f, 0xff, 0x90, 0x78, 0x4f, 0x3f, 0x67, 0x9f, 0x50, 0x17, 0x57, + 0x17, 0x01, 0x26, 0xa3, 0x7e, 0x46, 0x2e, 0x2e, 0xdf, 0xe2, 0xf4, 0xe0, 0xd4, 0xa2, 0xb2, 0xcc, + 0xe4, 0x54, 0xa1, 0x2a, 0x2e, 0x3e, 0xd7, 0x92, 0x0c, 0x64, 0x4f, 0x1a, 0x60, 0x77, 0x1c, 0x6e, + 0x4f, 0x4a, 0x99, 0x91, 0xaa, 0x03, 0x12, 0x2c, 0x52, 0xac, 0x0d, 0xcf, 0x37, 0x68, 0x31, 0x3a, + 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, + 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x41, 0x76, 0xba, + 0x5e, 0x52, 0x6a, 0x51, 0x62, 0x72, 0x46, 0x62, 0x66, 0x9e, 0x5e, 0x4a, 0x6a, 0x99, 0x3e, 0x2c, + 0xb6, 0xa1, 0x11, 0x58, 0x01, 0x8e, 0xf6, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0x70, 0x14, + 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x62, 0x15, 0x3f, 0x12, 0x12, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -302,22 +319,8 @@ func (m *WrappedEthereumTransactionResult) MarshalToSizedBuffer(dAtA []byte) (in _ = i var l int _ = l - if len(m.ReturnData) > 0 { - i -= len(m.ReturnData) - copy(dAtA[i:], m.ReturnData) - i = encodeVarintTx(dAtA, i, uint64(len(m.ReturnData))) - i-- - dAtA[i] = 0x1a - } - if len(m.VmError) > 0 { - i -= len(m.VmError) - copy(dAtA[i:], m.VmError) - i = encodeVarintTx(dAtA, i, uint64(len(m.VmError))) - i-- - dAtA[i] = 0x12 - } - if m.GasUsed != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.GasUsed)) + if m.Status != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Status)) i-- dAtA[i] = 0x8 } @@ -354,16 +357,8 @@ func (m *WrappedEthereumTransactionResult) Size() (n int) { } var l int _ = l - if m.GasUsed != 0 { - n += 1 + sovTx(uint64(m.GasUsed)) - } - l = len(m.VmError) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.ReturnData) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) + if m.Status != 0 { + n += 1 + sovTx(uint64(m.Status)) } return n } @@ -489,9 +484,9 @@ func (m *WrappedEthereumTransactionResult) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - m.GasUsed = 0 + m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -501,77 +496,11 @@ func (m *WrappedEthereumTransactionResult) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.GasUsed |= uint64(b&0x7F) << shift + m.Status |= Status(b&0x7F) << shift if b < 0x80 { break } } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VmError", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.VmError = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ReturnData", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ReturnData = append(m.ReturnData[:0], dAtA[iNdEx:postIndex]...) - if m.ReturnData == nil { - m.ReturnData = []byte{} - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) diff --git a/go.work.sum b/go.work.sum index b1b20df4d7..07dae4f48a 100644 --- a/go.work.sum +++ b/go.work.sum @@ -138,22 +138,13 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cosmossdk.io/api v0.7.0/go.mod h1:kJFAEMLN57y0viszHDPLMmieF0471o5QAwwApa+270M= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= From 5d31fe2c2a7d066de18c104b184781eed35a9284 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 14:52:14 -0400 Subject: [PATCH 020/122] refactor(eth): `txpool` breakout (#1105) `TxPoolPlugin` shouldn't be on the `blockchain`. --- eth/core/chain.go | 2 -- eth/core/chain_reader.go | 56 ------------------------------------ eth/core/chain_subscriber.go | 5 ---- eth/core/chain_writer.go | 15 +++------- eth/core/txpool/txpool.go | 45 +++++++++++++++++++++++++++++ eth/polar/backend.go | 35 ++++++++++++++-------- eth/polar/mining.go | 8 +++++- eth/polar/polaris.go | 9 ++++-- 8 files changed, 86 insertions(+), 89 deletions(-) create mode 100644 eth/core/txpool/txpool.go diff --git a/eth/core/chain.go b/eth/core/chain.go index ba453074fb..1e4c21e9c2 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -57,7 +57,6 @@ type blockchain struct { hp HistoricalPlugin gp GasPlugin sp StatePlugin - tp TxPoolPlugin // StateProcessor is the canonical, persistent state processor that runs the EVM. processor *StateProcessor @@ -111,7 +110,6 @@ func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used hp: host.GetHistoricalPlugin(), gp: host.GetGasPlugin(), sp: host.GetStatePlugin(), - tp: host.GetTxPoolPlugin(), vmConfig: &vm.Config{}, receiptsCache: lru.NewCache[common.Hash, types.Receipts](defaultCacheSize), blockNumCache: lru.NewCache[uint64, *types.Block](defaultCacheSize), diff --git a/eth/core/chain_reader.go b/eth/core/chain_reader.go index 4b441e1d4c..d28962f91c 100644 --- a/eth/core/chain_reader.go +++ b/eth/core/chain_reader.go @@ -31,7 +31,6 @@ import ( // ChainReader defines methods that are used to read the state and blocks of the chain. type ChainReader interface { ChainBlockReader - ChainTxPoolReader ChainSubscriber } @@ -54,17 +53,6 @@ type ChainBlockReader interface { PendingBlockAndReceipts() (*types.Block, types.Receipts) } -// ChainTxPoolReader defines methods that are used to read information about the state -// of the mempool. -type ChainTxPoolReader interface { - GetPoolTransactions() (types.Transactions, error) - GetPoolTransaction(common.Hash) *types.Transaction - GetPoolNonce(common.Address) (uint64, error) - GetPoolStats() (int, int) - GetPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) - GetPoolContentFrom(addr common.Address) (types.Transactions, types.Transactions) -} - // ========================================================================= // BlockReader // ========================================================================= @@ -324,47 +312,3 @@ func (bc *blockchain) GetTd(hash common.Hash, number uint64) *big.Int { } return block.Difficulty() } - -// ========================================================================= -// TransactionPoolReader -// ========================================================================= - -// GetPoolTransactions returns all of the transactions that are currently in -// the mempool. -func (bc *blockchain) GetPoolTransactions() (types.Transactions, error) { - pending := bc.tp.Pending(false) - txs := make(types.Transactions, len(pending)) - for _, batch := range pending { - txs = append(txs, batch...) - } - return txs, nil -} - -// GetPoolTransaction returns a transaction from the mempool by hash. -func (bc *blockchain) GetPoolTransaction(hash common.Hash) *types.Transaction { - return bc.tp.Get(hash) -} - -// GetPoolNonce returns the pending nonce of addr from the mempool. -func (bc *blockchain) GetPoolNonce(addr common.Address) (uint64, error) { - return bc.tp.Nonce(addr), bc.statedb.Error() -} - -// GetPoolStats returns the number of pending and queued txs in the mempool. -func (bc *blockchain) GetPoolStats() (int, int) { - return bc.tp.Stats() -} - -// GetPoolContent returns the pending and queued txs in the mempool. -func (bc *blockchain) GetPoolContent() ( - map[common.Address]types.Transactions, map[common.Address]types.Transactions, -) { - return bc.tp.Content() -} - -// GetPoolContentFrom returns the pending and queued txs in the mempool for the given address. -func (bc *blockchain) GetPoolContentFrom(addr common.Address) ( - types.Transactions, types.Transactions, -) { - return bc.tp.ContentFrom(addr) -} diff --git a/eth/core/chain_subscriber.go b/eth/core/chain_subscriber.go index 4e918a0673..c410704c8b 100644 --- a/eth/core/chain_subscriber.go +++ b/eth/core/chain_subscriber.go @@ -33,7 +33,6 @@ type ChainSubscriber interface { SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription // currently not used SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription - SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription } // SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. @@ -65,7 +64,3 @@ func (bc *blockchain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscript func (bc *blockchain) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { return bc.scope.Track(bc.pendingLogsFeed.Subscribe(ch)) } - -func (bc *blockchain) SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription { - return bc.tp.SubscribeNewTxsEvent(ch) -} diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 2345c5f3aa..d38d40e2a3 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -34,14 +34,12 @@ import ( type ChainWriter interface { // Prepare prepares the chain for a new block. This method is called before the first tx in // the block. - Prepare(context.Context, uint64) + Prepare(context.Context, uint64) *types.Header // ProcessTransaction processes the given transaction and returns the receipt after applying // the state transition. This method is called for each tx in the block. ProcessTransaction(context.Context, *types.Transaction) (*ExecutionResult, error) // Finalize is called after the last tx in the block. Finalize(context.Context) error - // SendTx sends the given transaction to the tx pool. - SendTx(ctx context.Context, signedTx *types.Transaction) error } // ========================================================================= @@ -49,7 +47,7 @@ type ChainWriter interface { // ========================================================================= // Prepare prepares the blockchain for processing a new block at the given height. -func (bc *blockchain) Prepare(ctx context.Context, number uint64) { +func (bc *blockchain) Prepare(ctx context.Context, number uint64) *types.Header { // Prepare the State, Block, Configuration, Gas, and Historical plugins for the block. bc.sp.Prepare(ctx) bc.bp.Prepare(ctx) @@ -82,14 +80,13 @@ func (bc *blockchain) Prepare(ctx context.Context, number uint64) { bc.logger.Info("preparing evm block", "seal_hash", header.Hash()) - // We update the base fee in the txpool to the next base fee. - bc.tp.SetBaseFee(header.BaseFee) - // Prepare the State Processor, StateDB and the EVM for the block. bc.processor.Prepare( bc.GetEVM(ctx, vm.TxContext{}, bc.statedb, header, bc.vmConfig), header, ) + + return header } // ProcessTransaction processes the given transaction and returns the receipt. @@ -177,7 +174,3 @@ func (bc *blockchain) Finalize(ctx context.Context) error { return nil } - -func (bc *blockchain) SendTx(_ context.Context, signedTx *types.Transaction) error { - return bc.tp.SendTx(signedTx) -} diff --git a/eth/core/txpool/txpool.go b/eth/core/txpool/txpool.go new file mode 100644 index 0000000000..ffd53cb82b --- /dev/null +++ b/eth/core/txpool/txpool.go @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: BUSL-1.1 +// + +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import "pkg.berachain.dev/polaris/eth/core" + +// PolarisTxPool is an interface for the Polaris transaction pool. +type PolarisTxPool interface { + core.TxPoolPlugin +} + +// NewPolarisTxPool creates a new PolarisTxPool instance. +// It takes in a core.TxPoolPlugin to satisfy the interface. +func NewPolarisTxPool(plugin core.TxPoolPlugin) PolarisTxPool { + return &polarisTxPool{ + TxPoolPlugin: plugin, + } +} + +// polarisTxPool implements the PolarisTxPool interface. +// It embeds a core.TxPoolPlugin to satisfy the interface. +type polarisTxPool struct { + core.TxPoolPlugin +} diff --git a/eth/polar/backend.go b/eth/polar/backend.go index e79382d577..1fc6d3eaf2 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -431,28 +431,39 @@ func (b *backend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.S // Transaction Pool API // ============================================================================== -func (b *backend) SendTx(ctx context.Context, signedTx *types.Transaction) error { - return b.polar.blockchain.SendTx(ctx, signedTx) +func (b *backend) SendTx(_ context.Context, signedTx *types.Transaction) error { + return b.polar.txPool.SendTx(signedTx) } func (b *backend) GetPoolTransactions() (types.Transactions, error) { b.logger.Debug("called eth.rpc.backend.GetPoolTransactions") - return b.polar.blockchain.GetPoolTransactions() + pending := b.polar.txPool.Pending(false) + var txs types.Transactions + for _, batch := range pending { + // TODO: Subpools. + // for _, lazy := range batch { + // if tx := lazy.Resolve(); tx != nil { + // txs = append(txs, tx) + // } + // } + txs = append(txs, batch...) + } + return txs, nil } -func (b *backend) GetPoolTransaction(txHash common.Hash) *types.Transaction { - b.logger.Debug("called eth.rpc.backend.GetPoolTransaction", "tx_hash", txHash) - return b.polar.blockchain.GetPoolTransaction(txHash) +func (b *backend) GetPoolTransaction(hash common.Hash) *types.Transaction { + b.logger.Debug("called eth.rpc.backend.GetPoolTransaction", "tx_hash", hash) + return b.polar.txPool.Get(hash) } func (b *backend) GetPoolNonce(_ context.Context, addr common.Address) (uint64, error) { - nonce, err := b.polar.blockchain.GetPoolNonce(addr) + nonce := b.polar.txPool.Nonce(addr) b.logger.Debug("called eth.rpc.backend.GetPoolNonce", "addr", addr, "nonce", nonce) - return nonce, err + return nonce, nil } func (b *backend) Stats() (int, int) { - pending, queued := b.polar.blockchain.GetPoolStats() + pending, queued := b.polar.txPool.Stats() b.logger.Debug("called eth.rpc.backend.Stats", "pending", pending, "queued", queued) return pending, queued } @@ -460,7 +471,7 @@ func (b *backend) Stats() (int, int) { func (b *backend) TxPoolContent() ( map[common.Address]types.Transactions, map[common.Address]types.Transactions, ) { - pending, queued := b.polar.blockchain.GetPoolContent() + pending, queued := b.polar.txPool.Content() b.logger.Debug("called eth.rpc.backend.TxPoolContent", "pending", len(pending), "queued", len(queued)) return pending, queued } @@ -468,14 +479,14 @@ func (b *backend) TxPoolContent() ( func (b *backend) TxPoolContentFrom(addr common.Address) ( types.Transactions, types.Transactions, ) { - pending, queued := b.polar.blockchain.GetPoolContentFrom(addr) + pending, queued := b.polar.txPool.ContentFrom(addr) b.logger.Debug("called eth.rpc.backend.TxPoolContentFrom", "addr", addr, "pending", len(pending), "queued", len(queued)) return pending, queued } func (b *backend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { - return b.polar.blockchain.SubscribeNewTxsEvent(ch) + return b.polar.txPool.SubscribeNewTxsEvent(ch) } func (b *backend) Engine() consensus.Engine { diff --git a/eth/polar/mining.go b/eth/polar/mining.go index 05e6d98373..49b20c47a3 100644 --- a/eth/polar/mining.go +++ b/eth/polar/mining.go @@ -30,7 +30,13 @@ import ( // TODO: replace this file with a proper mining object and use message passing instead of direct calls. // Prepare prepares the Polaris chain for processing a new block at the given height. func (pl *Polaris) Prepare(ctx context.Context, number uint64) { - pl.blockchain.Prepare(ctx, number) + header := pl.blockchain.Prepare(ctx, number) + if header == nil { + panic("blockchain produced nil header") + } + // We update the base fee in the txpool to the next base fee. + // TODO: Move to prepare proposal + pl.txPool.SetBaseFee(header.BaseFee) } // ProcessTransaction processes the given transaction and returns the receipt. diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index fe571d8f57..67b2f0623b 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/eth/filters" "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/core/txpool" "pkg.berachain.dev/polaris/eth/log" polarapi "pkg.berachain.dev/polaris/eth/polar/api" "pkg.berachain.dev/polaris/eth/rpc" @@ -57,6 +58,7 @@ type NetworkingStack interface { // Start starts the networking stack. Start() error + // Close stops the networking stack Close() error } @@ -70,8 +72,9 @@ type Polaris struct { // txPool *txpool.TxPool // blockchain represents the canonical chain. blockchain core.Blockchain + txPool txpool.PolarisTxPool - // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs and the blockchain. + // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs and the core pieces. backend Backend // engine represents the consensus engine for the backend. @@ -105,8 +108,10 @@ func NewWithNetworkingStack( log.Root().SetHandler(logHandler) } - // Build and set the RPC Backend. + // Build and set the RPC Backend and other services. pl.backend = NewBackend(pl, stack.ExtRPCEnabled(), cfg) + pl.txPool = txpool.NewPolarisTxPool(host.GetTxPoolPlugin()) + return pl } From 8ccc9f5f2e563f1faf553a75dc8ff502dea4d946 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 15:43:22 -0400 Subject: [PATCH 021/122] refactor(eth): `miner` breakout (phase 1) (#1107) The first phase of breaking out the `miner` object into a Proper block proposer will be to set up the miner object with the current transaction / block flow. --------- Signed-off-by: Devon Bear --- cosmos/x/evm/keeper/abci.go | 4 +- cosmos/x/evm/keeper/keeper.go | 5 + cosmos/x/evm/keeper/processor.go | 2 +- eth/core/chain.go | 9 +- eth/core/chain_resources.go | 28 ----- eth/core/chain_writer.go | 91 ++------------- eth/core/txpool/handler.go | 28 ----- eth/core/txpool/imported.go | 30 ----- eth/core/txpool/txpool.go | 10 +- eth/core/types/imported.go | 1 + eth/miner/coming_soon_tm.go | 23 ---- eth/miner/miner.go | 192 +++++++++++++++++++++++++++++++ eth/polar/backend.go | 23 ++-- eth/polar/mining.go | 9 +- eth/polar/polaris.go | 28 ++++- go.work.sum | 2 + lib/ds/ds.go | 5 + 17 files changed, 270 insertions(+), 220 deletions(-) delete mode 100644 eth/core/txpool/handler.go delete mode 100644 eth/core/txpool/imported.go delete mode 100644 eth/miner/coming_soon_tm.go create mode 100644 eth/miner/miner.go diff --git a/cosmos/x/evm/keeper/abci.go b/cosmos/x/evm/keeper/abci.go index 5d8c78ba40..b3582cf541 100644 --- a/cosmos/x/evm/keeper/abci.go +++ b/cosmos/x/evm/keeper/abci.go @@ -30,11 +30,11 @@ func (k *Keeper) BeginBlocker(ctx context.Context) error { sCtx := sdk.UnwrapSDKContext(ctx) // Prepare the Polaris Ethereum block. k.lock = false - k.polaris.Prepare(ctx, uint64(sCtx.BlockHeight())) + k.miner.Prepare(ctx, uint64(sCtx.BlockHeight())) return nil } func (k *Keeper) EndBlock(ctx context.Context) error { // Finalize the Polaris Ethereum block. - return k.polaris.Finalize(ctx) + return k.miner.Finalize(ctx) } diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index d768fe752b..3a837dbb9c 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -39,6 +39,7 @@ import ( "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" ethlog "pkg.berachain.dev/polaris/eth/log" + "pkg.berachain.dev/polaris/eth/miner" "pkg.berachain.dev/polaris/eth/polar" ) @@ -47,6 +48,8 @@ type Keeper struct { ak state.AccountKeeper // provider is the struct that houses the Polaris EVM. polaris *polar.Polaris + // miner is used to mine blocks + miner miner.Miner // The (unexposed) key used to access the store from the Context. storeKey storetypes.StoreKey // The host contains various plugins that are are used to implement `core.PolarisHostChain`. @@ -122,6 +125,8 @@ func (k *Keeper) Setup( return nil }), ) + + k.miner = k.polaris.Miner() } // Logger returns a module-specific logger. diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 005cd25149..ce1f3054cf 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -39,7 +39,7 @@ func (k *Keeper) ProcessTransaction(ctx context.Context, tx *coretypes.Transacti "reset gas meter prior to ethereum state transition") // Process the transaction and return the EVM's execution result. - execResult, err := k.polaris.ProcessTransaction(ctx, tx) + execResult, err := k.miner.ProcessTransaction(ctx, tx) if err != nil { return nil, err } diff --git a/eth/core/chain.go b/eth/core/chain.go index 1e4c21e9c2..49bcae0e28 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -55,11 +55,9 @@ type blockchain struct { bp BlockPlugin cp ConfigurationPlugin hp HistoricalPlugin - gp GasPlugin + pp PrecompilePlugin sp StatePlugin - // StateProcessor is the canonical, persistent state processor that runs the EVM. - processor *StateProcessor // statedb is the state database that is used to mange state during transactions. statedb vm.PolarisStateDB // vmConfig is the configuration used to create the EVM. @@ -108,7 +106,7 @@ func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used bp: host.GetBlockPlugin(), cp: host.GetConfigurationPlugin(), hp: host.GetHistoricalPlugin(), - gp: host.GetGasPlugin(), + pp: host.GetPrecompilePlugin(), sp: host.GetStatePlugin(), vmConfig: &vm.Config{}, receiptsCache: lru.NewCache[common.Hash, types.Receipts](defaultCacheSize), @@ -120,9 +118,6 @@ func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used logger: log.Root(), } bc.statedb = state.NewStateDB(bc.sp) - bc.processor = NewStateProcessor( - bc.cp, bc.gp, host.GetPrecompilePlugin(), bc.statedb, bc.vmConfig, - ) bc.currentBlock.Store(nil) bc.finalizedBlock.Store(nil) diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 7ff0f7f740..914ac8b9b7 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -21,11 +21,7 @@ package core import ( - "context" - "math/big" - "pkg.berachain.dev/polaris/eth/core/state" - "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" ) @@ -34,8 +30,6 @@ import ( type ChainResources interface { StateAtBlockNumber(uint64) (vm.GethStateDB, error) GetVMConfig() *vm.Config - GetEVM(context.Context, vm.TxContext, vm.PolarisStateDB, *types.Header, *vm.Config) *vm.GethEVM - NewEVMBlockContext(header *types.Header) *vm.BlockContext } // StateAtBlockNumber returns a statedb configured to read what the state of the blockchain is/was @@ -48,28 +42,6 @@ func (bc *blockchain) StateAtBlockNumber(number uint64) (vm.GethStateDB, error) return state.NewStateDB(sp), nil } -// GetEVM returns an EVM ready to be used for executing transactions. It is used by both the -// StateProcessor to acquire a new EVM at the start of every block. As well as by the backend to -// acquire an EVM for running gas estimations, eth_call etc. -func (bc *blockchain) GetEVM( - _ context.Context, txContext vm.TxContext, state vm.PolarisStateDB, - header *types.Header, vmConfig *vm.Config, -) *vm.GethEVM { - chainCfg := bc.processor.cp.ChainConfig() // TODO: get chain config at height. - return vm.NewGethEVMWithPrecompiles( - *bc.NewEVMBlockContext(header), txContext, state, chainCfg, *vmConfig, bc.processor.pp, - ) -} - -// NewEVMBlockContext creates a new block context for use in the EVM. -func (bc *blockchain) NewEVMBlockContext(header *types.Header) *vm.BlockContext { - if header = types.CopyHeader(header); header.Difficulty == nil { - header.Difficulty = new(big.Int) - } - blockContext := NewEVMBlockContext(header, bc, &header.Coinbase) - return &blockContext -} - // GetVMConfig returns the vm.Config for the current chain. func (bc *blockchain) GetVMConfig() *vm.Config { return bc.vmConfig diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index d38d40e2a3..51588c7ca2 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -21,92 +21,28 @@ package core import ( - "context" - "math/big" - - "github.com/ethereum/go-ethereum/consensus/misc" - "github.com/ethereum/go-ethereum/core/vm" - "pkg.berachain.dev/polaris/eth/core/types" ) // ChainWriter defines methods that are used to perform state and block transitions. type ChainWriter interface { - // Prepare prepares the chain for a new block. This method is called before the first tx in - // the block. - Prepare(context.Context, uint64) *types.Header - // ProcessTransaction processes the given transaction and returns the receipt after applying - // the state transition. This method is called for each tx in the block. - ProcessTransaction(context.Context, *types.Transaction) (*ExecutionResult, error) - // Finalize is called after the last tx in the block. - Finalize(context.Context) error + InsertBlock(block *types.Block, receipts types.Receipts, logs []*types.Log) error } -// ========================================================================= -// Block Processing -// ========================================================================= - -// Prepare prepares the blockchain for processing a new block at the given height. -func (bc *blockchain) Prepare(ctx context.Context, number uint64) *types.Header { - // Prepare the State, Block, Configuration, Gas, and Historical plugins for the block. - bc.sp.Prepare(ctx) - bc.bp.Prepare(ctx) - bc.cp.Prepare(ctx) - bc.gp.Prepare(ctx) - - if bc.hp != nil { - bc.hp.Prepare(ctx) - } - - coinbase, timestamp := bc.bp.GetNewBlockMetadata(number) - - // Build the new block header. - parent := bc.CurrentFinalBlock() - if number >= 1 && parent == nil { - parent = bc.GetHeaderByNumber(number - 1) - } - - // Polaris does not set Ethereum state root (Root), mix hash (MixDigest), extra data (Extra), - // and block nonce (Nonce) on the new header. - header := &types.Header{ - // Used in Polaris. - ParentHash: parent.Hash(), - Coinbase: coinbase, - Number: new(big.Int).SetUint64(number), - GasLimit: bc.gp.BlockGasLimit(), - Time: timestamp, - BaseFee: misc.CalcBaseFee(bc.Config(), parent), - } +// InsertBlock inserts a block into the canonical chain and updates the state of the blockchain. +func (bc *blockchain) InsertBlock(block *types.Block, receipts types.Receipts, logs []*types.Log) error { + var err error - bc.logger.Info("preparing evm block", "seal_hash", header.Hash()) + // TODO: prepare historical plugin here? + // TBH still think we should deprecate it and run in another routine as indexer. - // Prepare the State Processor, StateDB and the EVM for the block. - bc.processor.Prepare( - bc.GetEVM(ctx, vm.TxContext{}, bc.statedb, header, bc.vmConfig), - header, - ) - - return header -} - -// ProcessTransaction processes the given transaction and returns the receipt. -func (bc *blockchain) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*ExecutionResult, error) { - bc.logger.Debug("processing evm transaction", "tx_hash", tx.Hash()) - - // Reset the Gas and State plugins for the tx. - bc.gp.Reset(ctx) // TODO: may not need this. - bc.sp.Reset(ctx) - - return bc.processor.ProcessTransaction(ctx, tx) -} - -// Finalize finalizes the current block. -func (bc *blockchain) Finalize(ctx context.Context) error { - block, receipts, logs, err := bc.processor.Finalize(ctx) - if err != nil { - return err - } + // ***************************************** // + // TODO: add safety check for canonicallness // + // ***************************************** // + // *********************************************** // + // TODO: restructure this function / flow it sucks // + // *********************************************** // blockHash, blockNum := block.Hash(), block.Number().Uint64() bc.logger.Info("finalizing evm block", "block_hash", blockHash.Hex(), "num_txs", len(receipts)) @@ -138,11 +74,9 @@ func (bc *blockchain) Finalize(ctx context.Context) error { bc.currentBlock.Store(block) bc.finalizedBlock.Store(block) - // Todo: nuke these caches. bc.blockNumCache.Add(blockNum, block) bc.blockHashCache.Add(blockHash, block) - // Todo: nuke these caches. for txIndex, tx := range block.Transactions() { bc.txLookupCache.Add( tx.Hash(), @@ -157,7 +91,6 @@ func (bc *blockchain) Finalize(ctx context.Context) error { } if receipts != nil { bc.currentReceipts.Store(receipts) - // Todo: nuke this cache. bc.receiptsCache.Add(blockHash, receipts) } if logs != nil { diff --git a/eth/core/txpool/handler.go b/eth/core/txpool/handler.go deleted file mode 100644 index 0a7bdaa8ff..0000000000 --- a/eth/core/txpool/handler.go +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package txpool - -// Handler is what should broadcast transactions received by the txpool to the host chain network. -type Handler interface { - Start() - Stop() - SetTxPool(txpool *TxPool) -} diff --git a/eth/core/txpool/imported.go b/eth/core/txpool/imported.go deleted file mode 100644 index 32c8a894cf..0000000000 --- a/eth/core/txpool/imported.go +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package txpool - -import "github.com/ethereum/go-ethereum/core/txpool" - -type TxPool = txpool.TxPool - -var ( - NewTxPool = txpool.NewTxPool - DefaultConfig = txpool.DefaultConfig -) diff --git a/eth/core/txpool/txpool.go b/eth/core/txpool/txpool.go index ffd53cb82b..5e1a65bd96 100644 --- a/eth/core/txpool/txpool.go +++ b/eth/core/txpool/txpool.go @@ -25,20 +25,20 @@ package txpool import "pkg.berachain.dev/polaris/eth/core" -// PolarisTxPool is an interface for the Polaris transaction pool. -type PolarisTxPool interface { +// TxPool is an interface for the Polaris transaction pool. +type TxPool interface { core.TxPoolPlugin } -// NewPolarisTxPool creates a new PolarisTxPool instance. +// NewTxPool creates a new TxPool instance. // It takes in a core.TxPoolPlugin to satisfy the interface. -func NewPolarisTxPool(plugin core.TxPoolPlugin) PolarisTxPool { +func NewTxPool(plugin core.TxPoolPlugin) TxPool { return &polarisTxPool{ TxPoolPlugin: plugin, } } -// polarisTxPool implements the PolarisTxPool interface. +// polarisTxPool implements the TxPool interface. // It embeds a core.TxPoolPlugin to satisfy the interface. type polarisTxPool struct { core.TxPoolPlugin diff --git a/eth/core/types/imported.go b/eth/core/types/imported.go index 221c118539..f39f74a1d2 100644 --- a/eth/core/types/imported.go +++ b/eth/core/types/imported.go @@ -28,6 +28,7 @@ type ( AccessList = types.AccessList AccessTuple = types.AccessTuple Block = types.Block + Blocks = types.Blocks Bloom = types.Bloom Body = types.Body Log = types.Log diff --git a/eth/miner/coming_soon_tm.go b/eth/miner/coming_soon_tm.go deleted file mode 100644 index bbdc33f7a5..0000000000 --- a/eth/miner/coming_soon_tm.go +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package miner - -// coming soon tm diff --git a/eth/miner/miner.go b/eth/miner/miner.go new file mode 100644 index 0000000000..29c317d7ed --- /dev/null +++ b/eth/miner/miner.go @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package miner + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum/consensus/misc" + + "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/core/state" + "pkg.berachain.dev/polaris/eth/core/txpool" + "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/core/vm" + "pkg.berachain.dev/polaris/eth/log" +) + +// Backend wraps all methods required for mining. Only full node is capable +// to offer all the functions here. +type Backend interface { + // Blockchain returns the blockchain instance. + Blockchain() core.Blockchain + TxPool() txpool.TxPool + Host() core.PolarisHostChain +} + +// Miner defines the interface for a Polaris miner. +type Miner interface { + // Prepare prepares the miner for a new block. This method is called before the first tx in + // the block. + Prepare(context.Context, uint64) *types.Header + + // ProcessTransaction processes the given transaction and returns the receipt after applying + // the state transition. This method is called for each tx in the block. + ProcessTransaction(context.Context, *types.Transaction) (*core.ExecutionResult, error) + + // Finalize is called after the last tx in the block. + Finalize(context.Context) error +} + +// miner implements the Miner interface. +type miner struct { + backend Backend + chain core.Blockchain + processor *core.StateProcessor + txPool txpool.TxPool + bp core.BlockPlugin + cp core.ConfigurationPlugin + gp core.GasPlugin + + sp core.StatePlugin + logger log.Logger + vmConfig vm.Config + statedb vm.PolarisStateDB + + // TODO: historical plugin has no purpose here in the miner. + // Should be handled async via channel + hp core.HistoricalPlugin +} + +// NewMiner creates a new Miner instance. +func NewMiner(backend Backend) Miner { + chain := backend.Blockchain() + host := backend.Host() + + m := &miner{ + bp: host.GetBlockPlugin(), + cp: host.GetConfigurationPlugin(), + hp: host.GetHistoricalPlugin(), + gp: host.GetGasPlugin(), + sp: host.GetStatePlugin(), + txPool: backend.TxPool(), + chain: chain, + backend: backend, + logger: log.Root(), // todo: fix. + } + + m.statedb = state.NewStateDB(m.sp) + m.processor = core.NewStateProcessor( + m.cp, m.gp, host.GetPrecompilePlugin(), m.statedb, &m.vmConfig, + ) + + return m +} + +// Prepare prepares the blockchain for processing a new block at the given height. +func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { + // Prepare the State, Block, Configuration, Gas, and Historical plugins for the block. + m.sp.Prepare(ctx) + m.bp.Prepare(ctx) + m.cp.Prepare(ctx) + m.gp.Prepare(ctx) + + // TODO: this shouldnt be in the miner. + if m.hp != nil { + m.hp.Prepare(ctx) + } + + coinbase, timestamp := m.bp.GetNewBlockMetadata(number) + chainCfg := m.cp.ChainConfig() + + // Build the new block header. + parent := m.chain.CurrentFinalBlock() + if number >= 1 && parent == nil { + parent = m.chain.GetHeaderByNumber(number - 1) + } + + // Polaris does not set Ethereum state root (Root), mix hash (MixDigest), extra data (Extra), + // and block nonce (Nonce) on the new header. + header := &types.Header{ + // Used in Polaris. + ParentHash: parent.Hash(), + Coinbase: coinbase, + Number: new(big.Int).SetUint64(number), + GasLimit: m.gp.BlockGasLimit(), + Time: timestamp, + BaseFee: misc.CalcBaseFee(chainCfg, parent), + Difficulty: new(big.Int), + } + + // TODO: we need to have header verification setup somewhere. + // if err := misc.VerifyEip1559Header(chainCfg, parent, header); err != nil { + // panic(err) + // } + + // TODO: abstract the evm from the miner, so that the miner is only concerned with txs and blocks. + var ( + // TODO: we are hardcoding author to coinbase, this may be incorrect. + // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. + context = core.NewEVMBlockContext(header, m.chain, &header.Coinbase) + vmenv = vm.NewGethEVMWithPrecompiles(context, + vm.TxContext{}, m.statedb, chainCfg, m.vmConfig, + m.backend.Host().GetPrecompilePlugin()) + ) + + // Prepare the State Processor, StateDB and the EVM for the block. + // TODO: miner should not have a processor. Copy what dydx does in which validators and full nodes + // have different prepare and process proposals. + // + // Heuristic: Validators get miners. Full nodes get processors. + m.processor.Prepare( + vmenv, + header, + ) + + // We update the base fee in the txpool to the next base fee. + // TODO: Move to prepare proposal + m.txPool.SetBaseFee(header.BaseFee) + + return header +} + +// ProcessTransaction processes the given transaction and returns the receipt after applying +// the state transition. This method is called for each tx in the block. +func (m *miner) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*core.ExecutionResult, error) { + m.logger.Debug("processing evm transaction", "tx_hash", tx.Hash()) + + // Reset the Gas and State plugins for the tx. + m.gp.Reset(ctx) // TODO: may not need this. + m.sp.Reset(ctx) + + return m.processor.ProcessTransaction(ctx, tx) +} + +// Finalize is called after the last tx in the block. +func (m *miner) Finalize(ctx context.Context) error { + block, receipts, logs, err := m.processor.Finalize(ctx) + if err != nil { + return err + } + + return m.chain.InsertBlock(block, receipts, logs) +} diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 1fc6d3eaf2..631d63b156 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -44,7 +44,6 @@ import ( "pkg.berachain.dev/polaris/eth/params" polarapi "pkg.berachain.dev/polaris/eth/polar/api" "pkg.berachain.dev/polaris/eth/version" - "pkg.berachain.dev/polaris/lib/utils" ) // Backend represents the backend object for a Polaris chain. It extends the standard @@ -393,23 +392,33 @@ func (b *backend) GetTd(_ context.Context, hash common.Hash) *big.Int { } // GetEVM returns a new EVM to be used for simulating a transaction, estimating gas etc. -func (b *backend) GetEVM(ctx context.Context, msg *core.Message, state vm.GethStateDB, - header *types.Header, vmConfig *vm.Config, _ *vm.BlockContext, +func (b *backend) GetEVM(_ context.Context, msg *core.Message, state vm.GethStateDB, + header *types.Header, vmConfig *vm.Config, blockCtx *vm.BlockContext, ) (*vm.GethEVM, func() error) { if vmConfig == nil { - b.logger.Debug("eth.rpc.backend.GetEVM", "vmConfig", "nil") vmConfig = b.polar.blockchain.GetVMConfig() } txContext := core.NewEVMTxContext(msg) - return b.polar.blockchain.GetEVM(ctx, txContext, - utils.MustGetAs[vm.PolarisStateDB](state), header, vmConfig), state.Error + var context vm.BlockContext + if blockCtx != nil { + context = *blockCtx + } else { + // TODO: we are hardcoding author to coinbase, this may be incorrect. + // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. + context = core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) + } + return vm.NewGethEVMWithPrecompiles(context, txContext, state, b.polar.blockchain.Config(), + *vmConfig, b.polar.Host().GetPrecompilePlugin()), state.Error } // GetBlockContext returns a new block context to be used by a EVM. func (b *backend) GetBlockContext( _ context.Context, header *types.Header, ) *vm.BlockContext { - return b.polar.blockchain.NewEVMBlockContext(header) + // TODO: we are hardcoding author to coinbase, this may be incorrect. + // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. + blockContext := core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) + return &blockContext } func (b *backend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { diff --git a/eth/polar/mining.go b/eth/polar/mining.go index 49b20c47a3..ff1bbbaa47 100644 --- a/eth/polar/mining.go +++ b/eth/polar/mining.go @@ -30,21 +30,18 @@ import ( // TODO: replace this file with a proper mining object and use message passing instead of direct calls. // Prepare prepares the Polaris chain for processing a new block at the given height. func (pl *Polaris) Prepare(ctx context.Context, number uint64) { - header := pl.blockchain.Prepare(ctx, number) + header := pl.miner.Prepare(ctx, number) if header == nil { panic("blockchain produced nil header") } - // We update the base fee in the txpool to the next base fee. - // TODO: Move to prepare proposal - pl.txPool.SetBaseFee(header.BaseFee) } // ProcessTransaction processes the given transaction and returns the receipt. func (pl *Polaris) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*core.ExecutionResult, error) { - return pl.blockchain.ProcessTransaction(ctx, tx) + return pl.miner.ProcessTransaction(ctx, tx) } // Finalize finalizes the current block. func (pl *Polaris) Finalize(ctx context.Context) error { - return pl.blockchain.Finalize(ctx) + return pl.miner.Finalize(ctx) } diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index 67b2f0623b..f5d8afa422 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -31,6 +31,7 @@ import ( "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/txpool" "pkg.berachain.dev/polaris/eth/log" + "pkg.berachain.dev/polaris/eth/miner" polarapi "pkg.berachain.dev/polaris/eth/polar/api" "pkg.berachain.dev/polaris/eth/rpc" ) @@ -69,10 +70,11 @@ type Polaris struct { // Although possible, it does not handle p2p networking like its sibling in geth would. stack NetworkingStack - // txPool *txpool.TxPool - // blockchain represents the canonical chain. + // core pieces of the polaris stack + host core.PolarisHostChain blockchain core.Blockchain - txPool txpool.PolarisTxPool + txPool txpool.TxPool + miner miner.Miner // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs and the core pieces. backend Backend @@ -95,6 +97,7 @@ func NewWithNetworkingStack( cfg: cfg, blockchain: core.NewChain(host), stack: stack, + host: host, engine: host.GetEnginePlugin(), } // When creating a Polaris EVM, we allow the implementing chain @@ -110,7 +113,8 @@ func NewWithNetworkingStack( // Build and set the RPC Backend and other services. pl.backend = NewBackend(pl, stack.ExtRPCEnabled(), cfg) - pl.txPool = txpool.NewPolarisTxPool(host.GetTxPoolPlugin()) + pl.txPool = txpool.NewTxPool(host.GetTxPoolPlugin()) + pl.miner = miner.NewMiner(pl) return pl } @@ -155,3 +159,19 @@ func (pl *Polaris) StartServices() error { func (pl *Polaris) StopServices() error { return pl.stack.Close() } + +func (pl *Polaris) Host() core.PolarisHostChain { + return pl.host +} + +func (pl *Polaris) Miner() miner.Miner { + return pl.miner +} + +func (pl *Polaris) TxPool() txpool.TxPool { + return pl.txPool +} + +func (pl *Polaris) Blockchain() core.Blockchain { + return pl.blockchain +} diff --git a/go.work.sum b/go.work.sum index 07dae4f48a..b6d12e038a 100644 --- a/go.work.sum +++ b/go.work.sum @@ -146,6 +146,7 @@ github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= @@ -166,6 +167,7 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbE github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= diff --git a/lib/ds/ds.go b/lib/ds/ds.go index d22da6ece8..1bf13dd9fc 100644 --- a/lib/ds/ds.go +++ b/lib/ds/ds.go @@ -29,6 +29,11 @@ import ( libtypes "pkg.berachain.dev/polaris/lib/types" ) +type StackFactory[T any] interface { + // NewStack returns a new stack with the given initial capacity. + NewStack() Stack[T] +} + // Stack is an interface represent a FILO data structure. type Stack[Item any] interface { // Peek returns the Item at the top of the stack From e9c1512fb3c2a2958c55f79d1018c606f4986b91 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 19 Sep 2023 19:28:37 -0400 Subject: [PATCH 022/122] chore(deps): Upgrade `geth` to `v1.13.1` (#1102) TODO: `EIP-6780` --------- Signed-off-by: Devon Bear --- contracts/go.mod | 17 +- contracts/go.sum | 44 +- cosmos/go.mod | 12 +- cosmos/go.sum | 26 +- .../evm/plugins/historical/historical_data.go | 7 +- .../plugins/txpool/mempool/mempool_reader.go | 12 +- .../get-account-proof-with-storage.io | 4 +- e2e/localnet/go.mod | 18 +- e2e/localnet/go.sum | 44 +- e2e/precompile/go.mod | 18 +- e2e/precompile/go.sum | 44 +- e2e/testapp/go.mod | 13 +- e2e/testapp/go.sum | 26 +- eth/core/chain_helpers.go | 9 +- eth/core/host.go | 6 +- eth/core/mock/txpool_plugin.mock.go | 18 +- eth/core/state/journal/logs.go | 34 +- eth/core/state/journal/logs_test.go | 32 +- eth/core/state/journal/mock/state_plugin.go | 6 +- .../state/journal/mock/state_plugin.mock.go | 36 +- ...{suicides_test.go => selfdestruct_test.go} | 58 +-- .../journal/{suicides.go => selfdestructs.go} | 77 ++-- eth/core/state/statedb.go | 37 +- eth/core/state/statedb_test.go | 18 +- eth/core/types/receipts.go | 25 ++ eth/core/vm/mock/evm.go | 4 +- eth/core/vm/mock/evm.mock.go | 7 +- eth/core/vm/mock/statedb.go | 8 +- eth/core/vm/mock/statedb.mock.go | 398 +++++++----------- eth/go.mod | 14 +- eth/go.sum | 28 +- eth/miner/miner.go | 53 ++- eth/polar/backend.go | 13 +- eth/polar/node.go | 3 + go.work.sum | 32 +- magefiles/go.mod | 12 +- magefiles/go.sum | 26 +- 37 files changed, 652 insertions(+), 587 deletions(-) rename eth/core/state/journal/{suicides_test.go => selfdestruct_test.go} (60%) rename eth/core/state/journal/{suicides.go => selfdestructs.go} (62%) diff --git a/contracts/go.mod b/contracts/go.mod index 4391fc40fb..457d58105d 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -2,17 +2,22 @@ module pkg.berachain.dev/polaris/contracts go 1.21 -require github.com/ethereum/go-ethereum v1.12.0 +require github.com/ethereum/go-ethereum v1.13.1 require ( github.com/DataDog/zstd v1.5.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect github.com/cockroachdb/redact v1.1.5 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect @@ -21,9 +26,9 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect - github.com/huin/goupnp v1.2.0 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect @@ -32,13 +37,17 @@ require ( github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/stretchr/testify v1.8.4 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect + golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/contracts/go.sum b/contracts/go.sum index 6b3237d57e..80c474c1cc 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -1,10 +1,14 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= +github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -20,12 +24,16 @@ github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZ github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= +github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,8 +43,10 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5il github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/ethereum/go-ethereum v1.12.0 h1:bdnhLPtqETd4m3mS8BGMNvBTf36bO5bx/hxE2zljOa0= -github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -75,6 +85,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -84,8 +95,8 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -97,10 +108,15 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -141,6 +157,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -160,6 +178,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -171,7 +191,6 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -209,6 +228,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= +golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= 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= @@ -226,12 +247,13 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/cosmos/go.mod b/cosmos/go.mod index 666a4e7a7e..2848563395 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) @@ -27,7 +27,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.11 - github.com/ethereum/go-ethereum v1.12.0 + github.com/ethereum/go-ethereum v1.13.1 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -70,9 +70,8 @@ require ( github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.2 // indirect @@ -144,8 +143,9 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/huin/goupnp v1.2.0 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -229,6 +229,7 @@ require ( golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect @@ -239,7 +240,6 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index e50faef4ab..22014cd2fd 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -113,8 +113,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 h1:WRzIKM4RUH2YwhrpwMQ/VuU0UVbnsfrg+b+PrKkpH0E= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05/go.mod h1:sOleKuvS3KgH6rpLX1d100PZWiJMVsGXswyxeCHTplo= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -198,18 +198,16 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= @@ -287,8 +285,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -577,6 +575,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= @@ -587,8 +587,8 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1459,8 +1459,6 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= diff --git a/cosmos/x/evm/plugins/historical/historical_data.go b/cosmos/x/evm/plugins/historical/historical_data.go index cc6d665ba3..4ea28c5630 100644 --- a/cosmos/x/evm/plugins/historical/historical_data.go +++ b/cosmos/x/evm/plugins/historical/historical_data.go @@ -179,11 +179,6 @@ func (p *plugin) GetReceiptsByHash(blockHash common.Hash) (coretypes.Receipts, e if err != nil { return nil, err } - if err = receipts.DeriveFields( - p.cp.ChainConfig(), blockHash, block.NumberU64(), block.Time(), block.BaseFee(), block.Transactions(), - ); err != nil { - return nil, err - } - return receipts, nil + return coretypes.DeriveReceiptsFromBlock(p.cp.ChainConfig(), receipts, block) } diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go index 43180e88cc..bef1ad44e9 100644 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go +++ b/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go @@ -39,9 +39,9 @@ func (etp *EthTxPool) Get(hash common.Hash) *coretypes.Transaction { // Pending is called when txs in the mempool are retrieved. // // NOT THREAD SAFE. -func (etp *EthTxPool) Pending(bool) map[common.Address]coretypes.Transactions { +func (etp *EthTxPool) Pending(bool) map[common.Address][]*coretypes.Transaction { pendingNonces := make(map[common.Address]uint64) - pending := make(map[common.Address]coretypes.Transactions) + pending := make(map[common.Address][]*coretypes.Transaction) etp.mu.RLock() defer etp.mu.RUnlock() @@ -81,9 +81,9 @@ func (etp *EthTxPool) Pending(bool) map[common.Address]coretypes.Transactions { // queued retrieves the content of the mempool. // // NOT THREAD SAFE. -func (etp *EthTxPool) queued() map[common.Address]coretypes.Transactions { +func (etp *EthTxPool) queued() map[common.Address][]*coretypes.Transaction { pendingNonces := make(map[common.Address]uint64) - queued := make(map[common.Address]coretypes.Transactions) + queued := make(map[common.Address][]*coretypes.Transaction) // After the lock is released we can iterate over the mempool. etp.mu.RLock() @@ -185,7 +185,7 @@ func (etp *EthTxPool) Stats() (int, int) { // queued transactions of this address, grouped by nonce. // // NOT THREAD SAFE. -func (etp *EthTxPool) ContentFrom(addr common.Address) (coretypes.Transactions, coretypes.Transactions) { +func (etp *EthTxPool) ContentFrom(addr common.Address) ([]*coretypes.Transaction, []*coretypes.Transaction) { pending, queued := etp.Content() return pending[addr], queued[addr] } @@ -195,7 +195,7 @@ func (etp *EthTxPool) ContentFrom(addr common.Address) (coretypes.Transactions, // // NOT THREAD SAFE. func (etp *EthTxPool) Content() ( - map[common.Address]coretypes.Transactions, map[common.Address]coretypes.Transactions, + map[common.Address][]*coretypes.Transaction, map[common.Address][]*coretypes.Transaction, ) { return etp.Pending(false), etp.queued() } diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io b/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io index df9f7ebf54..d051ce621a 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io @@ -1,2 +1,2 @@ ->> {"jsonrpc":"2.0","id":1,"method":"eth_getProof","params":["0xaa00000000000000000000000000000000000000",["0x01"],"0x3"]} -<< {"jsonrpc":"2.0","id":1,"result":{"address":"0xaa00000000000000000000000000000000000000","accountProof":[],"balance":"0x1","codeHash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","nonce":"0x0","storageHash":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","storageProof":[{"key":"0x01","value":"0x0","proof":[]}]}} +>> {"jsonrpc":"2.0","id":1,"method":"eth_getProof","params":["0xaa00000000000000000000000000000000000000",["0x1"],"0x3"]} +<< {"jsonrpc":"2.0","id":1,"result":{"address":"0xaa00000000000000000000000000000000000000","accountProof":[],"balance":"0x1","codeHash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","nonce":"0x0","storageHash":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","storageProof":[{"key":"0x1","value":"0x0","proof":[]}]}} diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index d7f2aa52f4..87bd6a9276 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -3,11 +3,11 @@ module pkg.berachain.dev/polaris/e2e/localnet go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d require ( - github.com/docker/docker v24.0.4+incompatible - github.com/ethereum/go-ethereum v1.12.0 + github.com/docker/docker v24.0.5+incompatible + github.com/ethereum/go-ethereum v1.13.1 github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible @@ -37,6 +37,7 @@ require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect @@ -44,11 +45,12 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cometbft/cometbft v0.38.0 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.11.2 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect @@ -60,6 +62,7 @@ require ( github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect @@ -74,6 +77,7 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -133,6 +137,7 @@ require ( github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect github.com/oklog/run v1.1.0 // indirect @@ -164,6 +169,7 @@ require ( github.com/spf13/viper v1.16.0 // indirect github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.7.0 // indirect @@ -188,11 +194,11 @@ require ( google.golang.org/grpc v1.58.1 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 54a23c5a81..5a2a2ccf31 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -107,8 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 h1:WRzIKM4RUH2YwhrpwMQ/VuU0UVbnsfrg+b+PrKkpH0E= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05/go.mod h1:sOleKuvS3KgH6rpLX1d100PZWiJMVsGXswyxeCHTplo= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -165,23 +165,25 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= +github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= @@ -218,6 +220,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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= 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/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -245,8 +249,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -273,6 +277,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= @@ -455,6 +461,7 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -528,6 +535,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= @@ -538,8 +547,8 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -596,6 +605,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= @@ -649,6 +660,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -870,6 +884,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= @@ -1375,8 +1391,6 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1422,6 +1436,8 @@ pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/Pm rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index d46f43eaa4..076fa66aa5 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) @@ -39,6 +39,7 @@ require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect @@ -46,11 +47,12 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cometbft/cometbft v0.38.0 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.11.2 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect @@ -61,6 +63,7 @@ require ( github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect @@ -70,13 +73,14 @@ require ( github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.4+incompatible // indirect + github.com/docker/docker v24.0.5+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect - github.com/ethereum/go-ethereum v1.12.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -136,6 +140,7 @@ require ( github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect github.com/oklog/run v1.1.0 // indirect @@ -168,6 +173,7 @@ require ( github.com/spf13/viper v1.16.0 // indirect github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.7.0 // indirect @@ -192,12 +198,12 @@ require ( google.golang.org/grpc v1.58.1 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a // indirect + rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 0fbc0d021c..c0a615ecbb 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -107,8 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 h1:WRzIKM4RUH2YwhrpwMQ/VuU0UVbnsfrg+b+PrKkpH0E= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05/go.mod h1:sOleKuvS3KgH6rpLX1d100PZWiJMVsGXswyxeCHTplo= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -165,23 +165,25 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= +github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= @@ -218,6 +220,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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= 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/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -245,8 +249,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -273,6 +277,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= @@ -452,6 +458,7 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -525,6 +532,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= @@ -535,8 +544,8 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -593,6 +602,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= @@ -646,6 +657,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -864,6 +878,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= 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= @@ -1365,8 +1381,6 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1414,6 +1428,8 @@ pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/Pm rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index a9688413b1..65baa74d8b 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) @@ -37,7 +37,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect - github.com/ethereum/go-ethereum v1.12.0 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect @@ -65,6 +65,7 @@ require ( github.com/99designs/keyring v1.2.1 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.312 // indirect @@ -84,9 +85,8 @@ require ( github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.2 // indirect @@ -167,8 +167,9 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/huin/goupnp v1.2.0 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -251,6 +252,7 @@ require ( golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect golang.org/x/sync v0.3.0 // indirect @@ -265,7 +267,6 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 55eacd0b3d..968057f118 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -276,8 +276,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 h1:WRzIKM4RUH2YwhrpwMQ/VuU0UVbnsfrg+b+PrKkpH0E= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05/go.mod h1:sOleKuvS3KgH6rpLX1d100PZWiJMVsGXswyxeCHTplo= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -363,18 +363,16 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= @@ -453,8 +451,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -781,6 +779,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= @@ -791,8 +791,8 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1852,8 +1852,6 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= diff --git a/eth/core/chain_helpers.go b/eth/core/chain_helpers.go index 1f45e33e46..a60485c8ba 100644 --- a/eth/core/chain_helpers.go +++ b/eth/core/chain_helpers.go @@ -32,12 +32,5 @@ func (bc *blockchain) deriveReceipts(receipts types.Receipts, blockHash common.H if block == nil { return nil, ErrBlockNotFound } - - // Derive receipts from block. - if err := receipts.DeriveFields( - bc.Config(), block.Hash(), block.Number().Uint64(), block.Time(), block.BaseFee(), block.Transactions(), - ); err != nil { - return nil, err - } - return receipts, nil + return types.DeriveReceiptsFromBlock(bc.Config(), receipts, block) } diff --git a/eth/core/host.go b/eth/core/host.go index b42a1e4834..360c1a1098 100644 --- a/eth/core/host.go +++ b/eth/core/host.go @@ -140,7 +140,7 @@ type ( // SendTx submits the tx to the transaction pool. SendTx(tx *types.Transaction) error // Pending returns all pending transactions in the transaction pool. - Pending(bool) map[common.Address]types.Transactions + Pending(bool) map[common.Address][]*types.Transaction // Get returns the transaction from the pool with the given hash. Get(common.Hash) *types.Transaction // Nonce returns the nonce of the given address in the transaction pool. @@ -151,10 +151,10 @@ type ( Stats() (int, int) // Content retrieves the data content of the transaction pool, returning all the pending as // well as queued transactions, grouped by account and nonce. - Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) + Content() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) // ContentFrom retrieves the data content of the transaction pool, returning the pending // as well as queued transactions of this address, grouped by nonce. - ContentFrom(addr common.Address) (types.Transactions, types.Transactions) + ContentFrom(addr common.Address) ([]*types.Transaction, []*types.Transaction) } ) diff --git a/eth/core/mock/txpool_plugin.mock.go b/eth/core/mock/txpool_plugin.mock.go index 4fad857b94..0f4d863af5 100644 --- a/eth/core/mock/txpool_plugin.mock.go +++ b/eth/core/mock/txpool_plugin.mock.go @@ -23,10 +23,10 @@ var _ ethcore.TxPoolPlugin = &TxPoolPluginMock{} // // // make and configure a mocked ethcore.TxPoolPlugin // mockedTxPoolPlugin := &TxPoolPluginMock{ -// ContentFunc: func() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { +// ContentFunc: func() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) { // panic("mock out the Content method") // }, -// ContentFromFunc: func(addr common.Address) (types.Transactions, types.Transactions) { +// ContentFromFunc: func(addr common.Address) ([]*types.Transaction, []*types.Transaction) { // panic("mock out the ContentFrom method") // }, // GetFunc: func(hash common.Hash) *types.Transaction { @@ -35,7 +35,7 @@ var _ ethcore.TxPoolPlugin = &TxPoolPluginMock{} // NonceFunc: func(address common.Address) uint64 { // panic("mock out the Nonce method") // }, -// PendingFunc: func(b bool) map[common.Address]types.Transactions { +// PendingFunc: func(b bool) map[common.Address][]*types.Transaction { // panic("mock out the Pending method") // }, // SendTxFunc: func(tx *types.Transaction) error { @@ -58,10 +58,10 @@ var _ ethcore.TxPoolPlugin = &TxPoolPluginMock{} // } type TxPoolPluginMock struct { // ContentFunc mocks the Content method. - ContentFunc func() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) + ContentFunc func() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) // ContentFromFunc mocks the ContentFrom method. - ContentFromFunc func(addr common.Address) (types.Transactions, types.Transactions) + ContentFromFunc func(addr common.Address) ([]*types.Transaction, []*types.Transaction) // GetFunc mocks the Get method. GetFunc func(hash common.Hash) *types.Transaction @@ -70,7 +70,7 @@ type TxPoolPluginMock struct { NonceFunc func(address common.Address) uint64 // PendingFunc mocks the Pending method. - PendingFunc func(b bool) map[common.Address]types.Transactions + PendingFunc func(b bool) map[common.Address][]*types.Transaction // SendTxFunc mocks the SendTx method. SendTxFunc func(tx *types.Transaction) error @@ -140,7 +140,7 @@ type TxPoolPluginMock struct { } // Content calls ContentFunc. -func (mock *TxPoolPluginMock) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { +func (mock *TxPoolPluginMock) Content() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) { if mock.ContentFunc == nil { panic("TxPoolPluginMock.ContentFunc: method is nil but TxPoolPlugin.Content was just called") } @@ -167,7 +167,7 @@ func (mock *TxPoolPluginMock) ContentCalls() []struct { } // ContentFrom calls ContentFromFunc. -func (mock *TxPoolPluginMock) ContentFrom(addr common.Address) (types.Transactions, types.Transactions) { +func (mock *TxPoolPluginMock) ContentFrom(addr common.Address) ([]*types.Transaction, []*types.Transaction) { if mock.ContentFromFunc == nil { panic("TxPoolPluginMock.ContentFromFunc: method is nil but TxPoolPlugin.ContentFrom was just called") } @@ -263,7 +263,7 @@ func (mock *TxPoolPluginMock) NonceCalls() []struct { } // Pending calls PendingFunc. -func (mock *TxPoolPluginMock) Pending(b bool) map[common.Address]types.Transactions { +func (mock *TxPoolPluginMock) Pending(b bool) map[common.Address][]*types.Transaction { if mock.PendingFunc == nil { panic("TxPoolPluginMock.PendingFunc: method is nil but TxPoolPlugin.Pending was just called") } diff --git a/eth/core/state/journal/logs.go b/eth/core/state/journal/logs.go index 50d32c2a03..18eb788e25 100644 --- a/eth/core/state/journal/logs.go +++ b/eth/core/state/journal/logs.go @@ -26,7 +26,6 @@ import ( "pkg.berachain.dev/polaris/lib/ds" "pkg.berachain.dev/polaris/lib/ds/stack" libtypes "pkg.berachain.dev/polaris/lib/types" - "pkg.berachain.dev/polaris/lib/utils" ) // Log defines the interface for tracking logs created during a state transition. @@ -49,8 +48,7 @@ type Log interface { // logs is a state plugin that tracks Ethereum logs. type logs struct { - ds.Stack[*coretypes.Log] // journal of logs that resets on every tx - + journal ds.Stack[*coretypes.Log] // journal of logs that resets on every tx txHash common.Hash txIndex int } @@ -58,7 +56,7 @@ type logs struct { // NewLogs returns a new `logs` journal. func NewLogs() Log { return &logs{ - Stack: stack.New[*coretypes.Log](initCapacity), + journal: stack.New[*coretypes.Log](initCapacity), } } @@ -69,9 +67,7 @@ func (l *logs) RegistryKey() string { // SetTxContext sets the transaction hash and index for the current transaction. func (l *logs) SetTxContext(thash common.Hash, ti int) { - // Reset the journal for a new transaction. - *l = *utils.MustGetAs[*logs](NewLogs()) - + l.journal = stack.New[*coretypes.Log](initCapacity) // Set the transaction hash and index. l.txHash = thash l.txIndex = ti @@ -86,25 +82,25 @@ func (l *logs) TxIndex() int { func (l *logs) AddLog(log *coretypes.Log) { log.TxHash = l.txHash log.TxIndex = uint(l.txIndex) - l.Push(log) + l.journal.Push(log) } // Logs returns the logs for the current tx with the existing metadata. func (l *logs) Logs() []*coretypes.Log { - size := l.Size() + size := l.journal.Size() buf := make([]*coretypes.Log, size) for i := 0; i < size; i++ { - buf[i] = l.PeekAt(i) + buf[i] = l.journal.PeekAt(i) } return buf } // GetLogs returns the logs for the tx with the given metadata. func (l *logs) GetLogs(_ common.Hash, blockNumber uint64, blockHash common.Hash) []*coretypes.Log { - size := l.Size() + size := l.journal.Size() buf := make([]*coretypes.Log, size) for i := 0; i < size; i++ { - buf[i] = l.PeekAt(i) + buf[i] = l.journal.PeekAt(i) buf[i].BlockHash = blockHash buf[i].BlockNumber = blockNumber } @@ -115,14 +111,14 @@ func (l *logs) GetLogs(_ common.Hash, blockNumber uint64, blockHash common.Hash) // // Snapshot implements `libtypes.Snapshottable`. func (l *logs) Snapshot() int { - return l.Size() + return l.journal.Size() } // RevertToSnapshot reverts the `Logs` store to a given snapshot id. // // RevertToSnapshot implements `libtypes.Snapshottable`. func (l *logs) RevertToSnapshot(id int) { - l.PopToSize(id) + l.journal.PopToSize(id) } // Finalize clears the journal of the tx logs. @@ -132,10 +128,10 @@ func (l *logs) Finalize() {} // Clone implements `libtypes.Cloneable`. func (l *logs) Clone() Log { - capacity := l.Capacity() - size := l.Size() + capacity := l.journal.Capacity() + size := l.journal.Size() clone := &logs{ - Stack: stack.New[*coretypes.Log](capacity), + journal: stack.New[*coretypes.Log](capacity), txHash: l.txHash, txIndex: l.txIndex, } @@ -143,8 +139,8 @@ func (l *logs) Clone() Log { // copy every individual log from the journal for i := 0; i < size; i++ { cpy := new(coretypes.Log) - *cpy = *l.PeekAt(i) - clone.Push(cpy) + *cpy = *l.journal.PeekAt(i) + clone.journal.Push(cpy) } return clone diff --git a/eth/core/state/journal/logs_test.go b/eth/core/state/journal/logs_test.go index 01091bbf9a..165fe15ef0 100644 --- a/eth/core/state/journal/logs_test.go +++ b/eth/core/state/journal/logs_test.go @@ -42,7 +42,7 @@ var _ = Describe("Logs", func() { BeforeEach(func() { l = utils.MustGetAs[*logs](NewLogs()) l.SetTxContext(thash, int(ti)) - Expect(l.Capacity()).To(Equal(32)) + Expect(l.journal.Capacity()).To(Equal(32)) }) It("should have the correct registry key", func() { @@ -52,21 +52,21 @@ var _ = Describe("Logs", func() { When("adding logs", func() { BeforeEach(func() { l.AddLog(&coretypes.Log{Address: a1}) - Expect(l.Size()).To(Equal(1)) - Expect(l.PeekAt(0).Address).To(Equal(a1)) - Expect(l.PeekAt(0).TxHash).To(Equal(thash)) - Expect(l.PeekAt(0).TxIndex).To(Equal(ti)) + Expect(l.journal.Size()).To(Equal(1)) + Expect(l.journal.PeekAt(0).Address).To(Equal(a1)) + Expect(l.journal.PeekAt(0).TxHash).To(Equal(thash)) + Expect(l.journal.PeekAt(0).TxIndex).To(Equal(ti)) }) It("should correctly snapshot and revert", func() { id := l.Snapshot() l.AddLog(&coretypes.Log{Address: a2}) - Expect(l.Size()).To(Equal(2)) - Expect(l.PeekAt(1).Address).To(Equal(a2)) + Expect(l.journal.Size()).To(Equal(2)) + Expect(l.journal.PeekAt(1).Address).To(Equal(a2)) l.RevertToSnapshot(id) - Expect(l.Size()).To(Equal(1)) + Expect(l.journal.Size()).To(Equal(1)) }) It("should correctly get logs", func() { @@ -88,18 +88,18 @@ var _ = Describe("Logs", func() { It("should correctly clone", func() { l.AddLog(&coretypes.Log{Address: a2}) - Expect(l.Size()).To(Equal(2)) - Expect(l.PeekAt(1).Address).To(Equal(a2)) + Expect(l.journal.Size()).To(Equal(2)) + Expect(l.journal.PeekAt(1).Address).To(Equal(a2)) l2 := utils.MustGetAs[*logs](l.Clone()) - Expect(l2.Size()).To(Equal(2)) - Expect(l2.PeekAt(0).Address).To(Equal(a1)) - Expect(l2.PeekAt(1).Address).To(Equal(a2)) + Expect(l2.journal.Size()).To(Equal(2)) + Expect(l2.journal.PeekAt(0).Address).To(Equal(a1)) + Expect(l2.journal.PeekAt(1).Address).To(Equal(a2)) l2.AddLog(&coretypes.Log{Address: a3}) - Expect(l2.Size()).To(Equal(3)) - Expect(l2.PeekAt(2).Address).To(Equal(a3)) - Expect(l.Size()).To(Equal(2)) + Expect(l2.journal.Size()).To(Equal(3)) + Expect(l2.journal.PeekAt(2).Address).To(Equal(a3)) + Expect(l.journal.Size()).To(Equal(2)) }) }) }) diff --git a/eth/core/state/journal/mock/state_plugin.go b/eth/core/state/journal/mock/state_plugin.go index aef54d0d34..72e69ac1c1 100644 --- a/eth/core/state/journal/mock/state_plugin.go +++ b/eth/core/state/journal/mock/state_plugin.go @@ -26,7 +26,7 @@ import ( "pkg.berachain.dev/polaris/eth/common" ) -//go:generate moq -out ./state_plugin.mock.go -skip-ensure -pkg mock ../ suicideStatePlugin +//go:generate moq -out ./state_plugin.mock.go -skip-ensure -pkg mock ../ selfDestructStatePlugin var ( a1 = common.HexToAddress("0x1") @@ -34,8 +34,8 @@ var ( a4 = common.HexToAddress("0x4") ) -func NewSuicidesStatePluginMock() *suicideStatePluginMock { - return &suicideStatePluginMock{ +func NewSelfDestructsStatePluginMock() *selfDestructStatePluginMock { + return &selfDestructStatePluginMock{ GetCodeHashFunc: func(address common.Address) common.Hash { if address == a1 || address == a3 || address == a4 { return common.Hash{0x1} diff --git a/eth/core/state/journal/mock/state_plugin.mock.go b/eth/core/state/journal/mock/state_plugin.mock.go index e97e365104..be63bd5d2e 100644 --- a/eth/core/state/journal/mock/state_plugin.mock.go +++ b/eth/core/state/journal/mock/state_plugin.mock.go @@ -9,12 +9,12 @@ import ( "sync" ) -// suicideStatePluginMock is a mock implementation of journal.suicideStatePlugin. +// selfDestructStatePluginMock is a mock implementation of journal.selfDestructStatePlugin. // -// func TestSomethingThatUsessuicideStatePlugin(t *testing.T) { +// func TestSomethingThatUsesselfDestructStatePlugin(t *testing.T) { // -// // make and configure a mocked journal.suicideStatePlugin -// mockedsuicideStatePlugin := &suicideStatePluginMock{ +// // make and configure a mocked journal.selfDestructStatePlugin +// mockedselfDestructStatePlugin := &selfDestructStatePluginMock{ // GetBalanceFunc: func(address common.Address) *big.Int { // panic("mock out the GetBalance method") // }, @@ -26,11 +26,11 @@ import ( // }, // } // -// // use mockedsuicideStatePlugin in code that requires journal.suicideStatePlugin +// // use mockedselfDestructStatePlugin in code that requires journal.selfDestructStatePlugin // // and then make assertions. // // } -type suicideStatePluginMock struct { +type selfDestructStatePluginMock struct { // GetBalanceFunc mocks the GetBalance method. GetBalanceFunc func(address common.Address) *big.Int @@ -66,9 +66,9 @@ type suicideStatePluginMock struct { } // GetBalance calls GetBalanceFunc. -func (mock *suicideStatePluginMock) GetBalance(address common.Address) *big.Int { +func (mock *selfDestructStatePluginMock) GetBalance(address common.Address) *big.Int { if mock.GetBalanceFunc == nil { - panic("suicideStatePluginMock.GetBalanceFunc: method is nil but suicideStatePlugin.GetBalance was just called") + panic("selfDestructStatePluginMock.GetBalanceFunc: method is nil but selfDestructStatePlugin.GetBalance was just called") } callInfo := struct { Address common.Address @@ -84,8 +84,8 @@ func (mock *suicideStatePluginMock) GetBalance(address common.Address) *big.Int // GetBalanceCalls gets all the calls that were made to GetBalance. // Check the length with: // -// len(mockedsuicideStatePlugin.GetBalanceCalls()) -func (mock *suicideStatePluginMock) GetBalanceCalls() []struct { +// len(mockedselfDestructStatePlugin.GetBalanceCalls()) +func (mock *selfDestructStatePluginMock) GetBalanceCalls() []struct { Address common.Address } { var calls []struct { @@ -98,9 +98,9 @@ func (mock *suicideStatePluginMock) GetBalanceCalls() []struct { } // GetCodeHash calls GetCodeHashFunc. -func (mock *suicideStatePluginMock) GetCodeHash(address common.Address) common.Hash { +func (mock *selfDestructStatePluginMock) GetCodeHash(address common.Address) common.Hash { if mock.GetCodeHashFunc == nil { - panic("suicideStatePluginMock.GetCodeHashFunc: method is nil but suicideStatePlugin.GetCodeHash was just called") + panic("selfDestructStatePluginMock.GetCodeHashFunc: method is nil but selfDestructStatePlugin.GetCodeHash was just called") } callInfo := struct { Address common.Address @@ -116,8 +116,8 @@ func (mock *suicideStatePluginMock) GetCodeHash(address common.Address) common.H // GetCodeHashCalls gets all the calls that were made to GetCodeHash. // Check the length with: // -// len(mockedsuicideStatePlugin.GetCodeHashCalls()) -func (mock *suicideStatePluginMock) GetCodeHashCalls() []struct { +// len(mockedselfDestructStatePlugin.GetCodeHashCalls()) +func (mock *selfDestructStatePluginMock) GetCodeHashCalls() []struct { Address common.Address } { var calls []struct { @@ -130,9 +130,9 @@ func (mock *suicideStatePluginMock) GetCodeHashCalls() []struct { } // SubBalance calls SubBalanceFunc. -func (mock *suicideStatePluginMock) SubBalance(address common.Address, intMoqParam *big.Int) { +func (mock *selfDestructStatePluginMock) SubBalance(address common.Address, intMoqParam *big.Int) { if mock.SubBalanceFunc == nil { - panic("suicideStatePluginMock.SubBalanceFunc: method is nil but suicideStatePlugin.SubBalance was just called") + panic("selfDestructStatePluginMock.SubBalanceFunc: method is nil but selfDestructStatePlugin.SubBalance was just called") } callInfo := struct { Address common.Address @@ -150,8 +150,8 @@ func (mock *suicideStatePluginMock) SubBalance(address common.Address, intMoqPar // SubBalanceCalls gets all the calls that were made to SubBalance. // Check the length with: // -// len(mockedsuicideStatePlugin.SubBalanceCalls()) -func (mock *suicideStatePluginMock) SubBalanceCalls() []struct { +// len(mockedselfDestructStatePlugin.SubBalanceCalls()) +func (mock *selfDestructStatePluginMock) SubBalanceCalls() []struct { Address common.Address IntMoqParam *big.Int } { diff --git a/eth/core/state/journal/suicides_test.go b/eth/core/state/journal/selfdestruct_test.go similarity index 60% rename from eth/core/state/journal/suicides_test.go rename to eth/core/state/journal/selfdestruct_test.go index bbb14be2fa..564f1ceba6 100644 --- a/eth/core/state/journal/suicides_test.go +++ b/eth/core/state/journal/selfdestruct_test.go @@ -29,15 +29,15 @@ import ( . "github.com/onsi/gomega" ) -var _ = Describe("Suicides", func() { - var s *suicides +var _ = Describe("SelfDestructs", func() { + var s *selfDestructs var a1 = common.HexToAddress("0x1") var a2 = common.HexToAddress("0x2") var a3 = common.HexToAddress("0x3") var a4 = common.HexToAddress("0x4") BeforeEach(func() { - s = utils.MustGetAs[*suicides](NewSuicides(mock.NewSuicidesStatePluginMock())) + s = utils.MustGetAs[*selfDestructs](NewSelfDestructs(mock.NewSelfDestructsStatePluginMock())) }) It("should have the correct registry key", func() { @@ -45,24 +45,24 @@ var _ = Describe("Suicides", func() { }) It("should work correctly in the scope of a tx", func() { - Expect(s.GetSuicides()).To(BeEmpty()) + Expect(s.GetSelfDestructs()).To(BeEmpty()) s.Snapshot() - Expect(s.Suicide(a2)).To(BeFalse()) // 0x2 doesn't have a valid code hash - Expect(s.Suicide(a1)).To(BeTrue()) - Expect(s.HasSuicided(a2)).To(BeFalse()) - Expect(s.HasSuicided(a1)).To(BeTrue()) + s.SelfDestruct(a2) + s.SelfDestruct(a1) + Expect(s.HasSelfDestructed(a2)).To(BeFalse()) + Expect(s.HasSelfDestructed(a1)).To(BeTrue()) snap2 := s.Snapshot() - Expect(s.Suicide(a3)).To(BeTrue()) - Expect(s.HasSuicided(a3)).To(BeTrue()) - Expect(s.HasSuicided(a1)).To(BeTrue()) - Expect(s.GetSuicides()).To(HaveLen(2)) + s.SelfDestruct(a3) + Expect(s.HasSelfDestructed(a3)).To(BeTrue()) + Expect(s.HasSelfDestructed(a1)).To(BeTrue()) + Expect(s.GetSelfDestructs()).To(HaveLen(2)) s.RevertToSnapshot(snap2) - Expect(s.HasSuicided(a1)).To(BeTrue()) - Expect(s.HasSuicided(a3)).To(BeFalse()) - Expect(s.GetSuicides()).To(HaveLen(1)) + Expect(s.HasSelfDestructed(a1)).To(BeTrue()) + Expect(s.HasSelfDestructed(a3)).To(BeFalse()) + Expect(s.GetSelfDestructs()).To(HaveLen(1)) s.Finalize() Expect(s.lastSnapshot).To(Equal(-1)) @@ -70,30 +70,30 @@ var _ = Describe("Suicides", func() { }) It("should not suicide when snapshot is not called", func() { - Expect(s.Suicide(a1)).To(BeFalse()) - Expect(s.HasSuicided(a1)).To(BeFalse()) + s.SelfDestruct(a1) + Expect(s.HasSelfDestructed(a1)).To(BeFalse()) }) It("should clone correctly", func() { s.Snapshot() - Expect(s.Suicide(a1)).To(BeTrue()) - Expect(s.HasSuicided(a1)).To(BeTrue()) + s.SelfDestruct(a1) + Expect(s.HasSelfDestructed(a1)).To(BeTrue()) s.Snapshot() - Expect(s.Suicide(a3)).To(BeTrue()) - Expect(s.HasSuicided(a3)).To(BeTrue()) - Expect(s.HasSuicided(a1)).To(BeTrue()) - Expect(s.GetSuicides()).To(HaveLen(2)) + s.SelfDestruct(a3) + Expect(s.HasSelfDestructed(a3)).To(BeTrue()) + Expect(s.HasSelfDestructed(a1)).To(BeTrue()) + Expect(s.GetSelfDestructs()).To(HaveLen(2)) - s2 := utils.MustGetAs[*suicides](s.Clone()) - Expect(s.HasSuicided(a3)).To(BeTrue()) - Expect(s.HasSuicided(a1)).To(BeTrue()) - Expect(s2.GetSuicides()).To(HaveLen(2)) + s2 := utils.MustGetAs[*selfDestructs](s.Clone()) + Expect(s.HasSelfDestructed(a3)).To(BeTrue()) + Expect(s.HasSelfDestructed(a1)).To(BeTrue()) + Expect(s2.GetSelfDestructs()).To(HaveLen(2)) s.Snapshot() s2.Snapshot() - Expect(s2.Suicide(a4)).To(BeTrue()) - Expect(s.HasSuicided(a4)).To(BeFalse()) + s2.SelfDestruct(a4) + Expect(s.HasSelfDestructed(a4)).To(BeFalse()) }) }) diff --git a/eth/core/state/journal/suicides.go b/eth/core/state/journal/selfdestructs.go similarity index 62% rename from eth/core/state/journal/suicides.go rename to eth/core/state/journal/selfdestructs.go index d6af52dfd5..0d3e9d3c30 100644 --- a/eth/core/state/journal/suicides.go +++ b/eth/core/state/journal/selfdestructs.go @@ -35,8 +35,8 @@ import ( // 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470. var emptyCodeHash = crypto.Keccak256Hash(nil) -// `suicideStatePlugin` defines the required funtions from the StatePlugin for the suicide journal. -type suicideStatePlugin interface { +// `selfDestructStatePlugin` defines the required funtions from the StatePlugin for the suicide journal. +type selfDestructStatePlugin interface { // GetCodeHash returns the code hash of the given account. GetCodeHash(common.Address) common.Hash // GetBalance returns the balance of the given account. @@ -45,33 +45,35 @@ type suicideStatePlugin interface { SubBalance(common.Address, *big.Int) } -type Suicides interface { - // Suicides implements `libtypes.Controllable`. +type SelfDestructs interface { + // SelfDestructs implements `libtypes.Controllable`. libtypes.Controllable[string] - // Suicides implements `libtypes.Cloneable`. - libtypes.Cloneable[Suicides] - // Suicides marks the given address as suicided. - Suicide(common.Address) bool - // HasSuicided returns whether the address is suicided. - HasSuicided(common.Address) bool - // GetSuicides returns all suicided addresses from the tx. - GetSuicides() []common.Address + // SelfDestructs implements `libtypes.Cloneable`. + libtypes.Cloneable[SelfDestructs] + // SelfDestruct marks the given address as self destructed . + SelfDestruct(common.Address) + // Selfdestruct6780 marks the given address as self destructed post eip-6780 + Selfdestruct6780(common.Address) + // HasSelfDestructed returns whether the address is self destructed . + HasSelfDestructed(common.Address) bool + // GetSelfDestructs returns all self destructed addresses from the tx. + GetSelfDestructs() []common.Address } -// Dirty tracking of suicided accounts, we have to keep track of these manually, in order for the +// Dirty tracking of self destructed accounts, we have to keep track of these manually, in order for the // code and state to still be accessible even after the account has been deleted. -// NOTE: we are only supporting one suicided address per EVM call (and consequently per snapshot). -type suicides struct { +// NOTE: we are only supporting one self destructed address per EVM call (and consequently per snapshot). +type selfDestructs struct { // journal of suicide address per call, very rare to suicide so we alloc only 1 address journal ds.Stack[*common.Address] - ssp suicideStatePlugin - // lastSnapshot ensures that only 1 address is being suicided per snapshot + ssp selfDestructStatePlugin + // lastSnapshot ensures that only 1 address is being self destructed per snapshot lastSnapshot int } -// NewSuicides returns a new suicides journal. -func NewSuicides(ssp suicideStatePlugin) Suicides { - return &suicides{ +// NewSelfDestructs returns a new selfDestructs journal. +func NewSelfDestructs(ssp selfDestructStatePlugin) SelfDestructs { + return &selfDestructs{ journal: stack.New[*common.Address](initCapacity), ssp: ssp, lastSnapshot: -1, @@ -79,24 +81,24 @@ func NewSuicides(ssp suicideStatePlugin) Suicides { } // RegistryKey implements libtypes.Registrable. -func (s *suicides) RegistryKey() string { +func (s *selfDestructs) RegistryKey() string { return suicidesRegistryKey } -// Suicide implements the PolarisStateDB interface by marking the given address as suicided. +// SelfDestruct implements the PolarisStateDB interface by marking the given address as self destructed . // This clears the account balance, but the code and state of the address remains available // until after Commit is called. -func (s *suicides) Suicide(addr common.Address) bool { +func (s *selfDestructs) SelfDestruct(addr common.Address) { // ensure only one suicide per snapshot call if s.journal.Size() > s.lastSnapshot { // pushed one suicide for this contract call, can do no more - return false + return } // only smart contracts can commit suicide ch := s.ssp.GetCodeHash(addr) if (ch == common.Hash{}) || ch == emptyCodeHash { - return false + return } // Reduce it's balance to 0. @@ -104,12 +106,15 @@ func (s *suicides) Suicide(addr common.Address) bool { // add to journal. s.journal.Push(&addr) - return true } -// HasSuicided implements the PolarisStateDB interface by returning if the contract was suicided +func (s *selfDestructs) Selfdestruct6780(_ common.Address) { + // TODO: IMPLEMENT EIP-6780 +} + +// HasSelfDestructed implements the PolarisStateDB interface by returning if the contract was self destructed // in current transaction. -func (s *suicides) HasSuicided(addr common.Address) bool { +func (s *selfDestructs) HasSelfDestructed(addr common.Address) bool { for i := s.journal.Size() - 1; i >= 0; i-- { if *s.journal.PeekAt(i) == addr { return true @@ -118,8 +123,8 @@ func (s *suicides) HasSuicided(addr common.Address) bool { return false } -// GetSuicides implements state.SuicidesJournal. -func (s *suicides) GetSuicides() []common.Address { +// GetSelfDestructs implements state.SelfDestructsJournal. +func (s *selfDestructs) GetSelfDestructs() []common.Address { var suicidalAddrs []common.Address for i := 0; i < s.journal.Size(); i++ { suicidalAddrs = append(suicidalAddrs, *s.journal.PeekAt(i)) @@ -128,25 +133,25 @@ func (s *suicides) GetSuicides() []common.Address { } // Snapshot implements libtypes.Controllable. -func (s *suicides) Snapshot() int { +func (s *selfDestructs) Snapshot() int { s.lastSnapshot = s.journal.Size() return s.lastSnapshot } // RevertToSnapshot implements libtypes.Controllable. -func (s *suicides) RevertToSnapshot(id int) { +func (s *selfDestructs) RevertToSnapshot(id int) { s.journal.PopToSize(id) } // Finalize implements libtypes.Controllable. -func (s *suicides) Finalize() { - *s = *utils.MustGetAs[*suicides](NewSuicides(s.ssp)) +func (s *selfDestructs) Finalize() { + *s = *utils.MustGetAs[*selfDestructs](NewSelfDestructs(s.ssp)) } // Clone implements libtypes.Cloneable. -func (s *suicides) Clone() Suicides { +func (s *selfDestructs) Clone() SelfDestructs { size := s.journal.Size() - clone := &suicides{ + clone := &selfDestructs{ journal: stack.New[*common.Address](size), ssp: s.ssp, lastSnapshot: s.lastSnapshot, diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index b85008ed50..0ab9d3077b 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -21,6 +21,8 @@ package state import ( + "fmt" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state/journal" coretypes "pkg.berachain.dev/polaris/eth/core/types" @@ -39,7 +41,7 @@ type stateDB struct { journal.Log journal.Refund journal.Accesslist - journal.Suicides + journal.SelfDestructs journal.TransientStorage // ctrl is used to manage snapshots and reverts across plugins and journals. @@ -50,14 +52,14 @@ type stateDB struct { func NewStateDB(sp Plugin) vm.PolarisStateDB { return newStateDBWithJournals( sp, journal.NewLogs(), journal.NewRefund(), journal.NewAccesslist(), - journal.NewSuicides(sp), journal.NewTransientStorage(), + journal.NewSelfDestructs(sp), journal.NewTransientStorage(), ) } // newStateDBWithJournals returns a vm.PolarisStateDB with the given StatePlugin and journals. func newStateDBWithJournals( sp Plugin, lj journal.Log, rj journal.Refund, aj journal.Accesslist, - sj journal.Suicides, tj journal.TransientStorage, + sj journal.SelfDestructs, tj journal.TransientStorage, ) vm.PolarisStateDB { // Build the controller and register the plugins and journals ctrl := snapshot.NewController[string, libtypes.Controllable[string]]() @@ -73,7 +75,7 @@ func newStateDBWithJournals( Log: lj, Refund: rj, Accesslist: aj, - Suicides: sj, + SelfDestructs: sj, TransientStorage: tj, ctrl: ctrl, } @@ -97,14 +99,15 @@ func (sdb *stateDB) RevertToSnapshot(id int) { // Commit state // ============================================================================= -// Finalise deletes the suicided accounts and finalizes all plugins, preparing the statedb for the +// Finalise deletes the SelfDestructd accounts and finalizes all plugins, preparing the statedb for the // next transaction. func (sdb *stateDB) Finalise(bool) { - sdb.DeleteAccounts(sdb.GetSuicides()) + sdb.DeleteAccounts(sdb.GetSelfDestructs()) sdb.ctrl.Finalize() } -func (sdb *stateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { +func (sdb *stateDB) Commit(block uint64, deleteEmptyObjects bool) (common.Hash, error) { + _ = block // todo figure out what to do here. sdb.Finalise(deleteEmptyObjects) return common.Hash{}, nil } @@ -172,10 +175,18 @@ func (sdb *stateDB) GetCodeSize(addr common.Address) int { // Copy returns a new statedb with cloned plugin and journals. func (sdb *stateDB) Copy() StateDBI { - return newStateDBWithJournals( - sdb.Plugin.Clone(), sdb.Log.Clone(), sdb.Refund.Clone(), - sdb.Accesslist.Clone(), sdb.Suicides.Clone(), sdb.TransientStorage.Clone(), - ) + logs := sdb.Log.Clone() + if logs == nil { + panic("failed to clone logs") + } + statedb, ok := newStateDBWithJournals( + sdb.Plugin.Clone(), logs, sdb.Refund.Clone(), + sdb.Accesslist.Clone(), sdb.SelfDestructs.Clone(), sdb.TransientStorage.Clone(), + ).(StateDBI) + if !ok { + panic(fmt.Sprintf("failed to clone stateDB: %T", sdb.Plugin)) + } + return statedb } func (sdb *stateDB) DumpToCollector(_ DumpCollector, _ *DumpConfig) []byte { @@ -221,3 +232,7 @@ func (sdb *stateDB) GetProof(_ common.Address) ([][]byte, error) { func (sdb *stateDB) GetOrNewStateObject(_ common.Address) *StateObject { return nil } + +func (sdb *stateDB) GetStorageRoot(_ common.Address) common.Hash { + return common.Hash{} +} diff --git a/eth/core/state/statedb_test.go b/eth/core/state/statedb_test.go index e836d446c5..2aae048a97 100644 --- a/eth/core/state/statedb_test.go +++ b/eth/core/state/statedb_test.go @@ -50,19 +50,19 @@ var _ = Describe("StateDB", func() { sdb = state.NewStateDB(sp) }) - It("Should suicide correctly", func() { + It("Should SelfDestruct correctly", func() { sdb.Snapshot() sdb.CreateAccount(alice) - Expect(sdb.Suicide(alice)).To(BeFalse()) - Expect(sdb.HasSuicided(alice)).To(BeFalse()) + sdb.SelfDestruct(alice) + Expect(sdb.HasSelfDestructed(alice)).To(BeFalse()) sdb.CreateAccount(bob) sdb.SetCode(bob, []byte{1, 2, 3}) sdb.AddBalance(bob, big.NewInt(10)) - Expect(sdb.Suicide(bob)).To(BeTrue()) + sdb.SelfDestruct(bob) Expect(sdb.GetBalance(bob).Uint64()).To(Equal(uint64(0))) - Expect(sdb.HasSuicided(bob)).To(BeTrue()) + Expect(sdb.HasSelfDestructed(bob)).To(BeTrue()) }) It("should snapshot/revert", func() { @@ -102,19 +102,19 @@ var _ = Describe("StateDB", func() { Expect(sp).To(BeTrue()) }) - It("should delete suicides on finalize", func() { + It("should delete SelfDestructs on finalize", func() { sdb.Snapshot() sdb.SetTxContext(common.Hash{}, 0) sdb.CreateAccount(bob) sdb.SetCode(bob, []byte{1, 2, 3}) sdb.AddBalance(bob, big.NewInt(10)) - Expect(sdb.Suicide(bob)).To(BeTrue()) + sdb.SelfDestruct(bob) Expect(sdb.GetBalance(bob).Uint64()).To(Equal(uint64(0))) - Expect(sdb.HasSuicided(bob)).To(BeTrue()) + Expect(sdb.HasSelfDestructed(bob)).To(BeTrue()) sdb.Finalise(true) - Expect(sdb.HasSuicided(bob)).To(BeFalse()) + Expect(sdb.HasSelfDestructed(bob)).To(BeFalse()) }) It("should handle saved errors", func() { diff --git a/eth/core/types/receipts.go b/eth/core/types/receipts.go index 818af2f894..45731531e1 100644 --- a/eth/core/types/receipts.go +++ b/eth/core/types/receipts.go @@ -21,11 +21,36 @@ package types import ( + "math/big" "unsafe" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" + + "pkg.berachain.dev/polaris/eth/params" ) +// DeriveReceiptsFromBlock is a helper function for deriving receipts from a block. +func DeriveReceiptsFromBlock( + chainConfig *params.ChainConfig, receipts types.Receipts, block *types.Block, +) (types.Receipts, error) { + // calculate the blobGasPrice according to the excess blob gas. + var blobGasPrice = new(big.Int) + if chainConfig.IsCancun(block.Number(), block.Time()) { + blobGasPrice = eip4844.CalcBlobFee(*block.ExcessBlobGas()) + } + + // Derive receipts from block. + if err := receipts.DeriveFields( + chainConfig, block.Hash(), block.Number().Uint64(), block.Time(), + block.BaseFee(), blobGasPrice, block.Transactions(), + ); err != nil { + return nil, err + } + return receipts, nil +} + // MarshalReceipts marshals `Receipts`, as type `[]*ReceiptForStorage`, to bytes using rlp // encoding. func MarshalReceipts(receipts Receipts) ([]byte, error) { diff --git a/eth/core/vm/mock/evm.go b/eth/core/vm/mock/evm.go index 2dbc8540a6..6d5d1ee7cf 100644 --- a/eth/core/vm/mock/evm.go +++ b/eth/core/vm/mock/evm.go @@ -23,8 +23,6 @@ package mock import ( "math/big" - "github.com/ethereum/go-ethereum/core/state" - "pkg.berachain.dev/polaris/eth/core/vm" ) @@ -33,7 +31,7 @@ import ( func NewEVM() *PrecompileEVMMock { mockSDB := NewEmptyStateDB() return &PrecompileEVMMock{ - GetStateDBFunc: func() state.StateDBI { + GetStateDBFunc: func() vm.GethStateDB { return mockSDB }, GetContextFunc: func() *vm.BlockContext { diff --git a/eth/core/vm/mock/evm.mock.go b/eth/core/vm/mock/evm.mock.go index 511cde7fd5..3fb6e9ac92 100644 --- a/eth/core/vm/mock/evm.mock.go +++ b/eth/core/vm/mock/evm.mock.go @@ -5,7 +5,6 @@ package mock import ( "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/holiman/uint256" "math/big" @@ -30,7 +29,7 @@ import ( // GetContextFunc: func() *vm.BlockContext { // panic("mock out the GetContext method") // }, -// GetStateDBFunc: func() state.StateDBI { +// GetStateDBFunc: func() vm.StateDB { // panic("mock out the GetStateDB method") // }, // StaticCallFunc: func(caller vm.ContractRef, addr common.Address, input []byte, gas uint64) ([]byte, uint64, error) { @@ -56,7 +55,7 @@ type PrecompileEVMMock struct { GetContextFunc func() *vm.BlockContext // GetStateDBFunc mocks the GetStateDB method. - GetStateDBFunc func() state.StateDBI + GetStateDBFunc func() vm.StateDB // StaticCallFunc mocks the StaticCall method. StaticCallFunc func(caller vm.ContractRef, addr common.Address, input []byte, gas uint64) ([]byte, uint64, error) @@ -294,7 +293,7 @@ func (mock *PrecompileEVMMock) GetContextCalls() []struct { } // GetStateDB calls GetStateDBFunc. -func (mock *PrecompileEVMMock) GetStateDB() state.StateDBI { +func (mock *PrecompileEVMMock) GetStateDB() vm.StateDB { if mock.GetStateDBFunc == nil { panic("PrecompileEVMMock.GetStateDBFunc: method is nil but PrecompileEVM.GetStateDB was just called") } diff --git a/eth/core/vm/mock/statedb.go b/eth/core/vm/mock/statedb.go index feabadf6d7..fc12baee80 100644 --- a/eth/core/vm/mock/statedb.go +++ b/eth/core/vm/mock/statedb.go @@ -70,9 +70,6 @@ func NewEmptyStateDB() *PolarisStateDBMock { FinaliseFunc: func(bool) { // no-op }, - ForEachStorageFunc: func(address common.Address, fn func(common.Hash, common.Hash) bool) error { - panic("mock out the ForEachStorage method") - }, GetBalanceFunc: func(address common.Address) *big.Int { return big.NewInt(0) }, @@ -100,7 +97,7 @@ func NewEmptyStateDB() *PolarisStateDBMock { GetStateFunc: func(address common.Address, hash common.Hash) common.Hash { return common.Hash{} }, - HasSuicidedFunc: func(address common.Address) bool { + HasSelfDestructedFunc: func(address common.Address) bool { return false }, PrepareFunc: func(rules params.Rules, sender common.Address, @@ -132,8 +129,7 @@ func NewEmptyStateDB() *PolarisStateDBMock { SubRefundFunc: func(v uint64) { }, - SuicideFunc: func(address common.Address) bool { - return false + SelfDestructFunc: func(address common.Address) { }, } mockedPolarisStateDB.LogsFunc = func() []*types.Log { diff --git a/eth/core/vm/mock/statedb.mock.go b/eth/core/vm/mock/statedb.mock.go index fdd9fb0bd1..1b2a0a8392 100644 --- a/eth/core/vm/mock/statedb.mock.go +++ b/eth/core/vm/mock/statedb.mock.go @@ -45,7 +45,7 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // AddressInAccessListFunc: func(addr common.Address) bool { // panic("mock out the AddressInAccessList method") // }, -// CommitFunc: func(deleteEmptyObjects bool) (common.Hash, error) { +// CommitFunc: func(v uint64, b bool) (common.Hash, error) { // panic("mock out the Commit method") // }, // CopyFunc: func() state.StateDBI { @@ -75,9 +75,6 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // FinaliseFunc: func(deleteEmptyObjects bool) { // panic("mock out the Finalise method") // }, -// ForEachStorageFunc: func(address common.Address, fn func(common.Hash, common.Hash) bool) error { -// panic("mock out the ForEachStorage method") -// }, // GetBalanceFunc: func(address common.Address) *big.Int { // panic("mock out the GetBalance method") // }, @@ -105,23 +102,20 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // GetOrNewStateObjectFunc: func(addr common.Address) *state.StateObject { // panic("mock out the GetOrNewStateObject method") // }, -// GetProofFunc: func(addr common.Address) ([][]byte, error) { -// panic("mock out the GetProof method") -// }, // GetRefundFunc: func() uint64 { // panic("mock out the GetRefund method") // }, // GetStateFunc: func(address common.Address, hash common.Hash) common.Hash { // panic("mock out the GetState method") // }, -// GetStorageProofFunc: func(a common.Address, key common.Hash) ([][]byte, error) { -// panic("mock out the GetStorageProof method") +// GetStorageRootFunc: func(addr common.Address) common.Hash { +// panic("mock out the GetStorageRoot method") // }, // GetTransientStateFunc: func(addr common.Address, key common.Hash) common.Hash { // panic("mock out the GetTransientState method") // }, -// HasSuicidedFunc: func(address common.Address) bool { -// panic("mock out the HasSuicided method") +// HasSelfDestructedFunc: func(address common.Address) bool { +// panic("mock out the HasSelfDestructed method") // }, // IntermediateRootFunc: func(deleteEmptyObjects bool) common.Hash { // panic("mock out the IntermediateRoot method") @@ -144,6 +138,12 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // RevertToSnapshotFunc: func(n int) { // panic("mock out the RevertToSnapshot method") // }, +// SelfDestructFunc: func(address common.Address) { +// panic("mock out the SelfDestruct method") +// }, +// Selfdestruct6780Func: func(address common.Address) { +// panic("mock out the Selfdestruct6780 method") +// }, // SetBalanceFunc: func(addr common.Address, amount *big.Int) { // panic("mock out the SetBalance method") // }, @@ -177,18 +177,12 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // StopPrefetcherFunc: func() { // panic("mock out the StopPrefetcher method") // }, -// StorageTrieFunc: func(addr common.Address) (state.Trie, error) { -// panic("mock out the StorageTrie method") -// }, // SubBalanceFunc: func(address common.Address, intMoqParam *big.Int) { // panic("mock out the SubBalance method") // }, // SubRefundFunc: func(v uint64) { // panic("mock out the SubRefund method") // }, -// SuicideFunc: func(address common.Address) bool { -// panic("mock out the Suicide method") -// }, // TxIndexFunc: func() int { // panic("mock out the TxIndex method") // }, @@ -221,7 +215,7 @@ type PolarisStateDBMock struct { AddressInAccessListFunc func(addr common.Address) bool // CommitFunc mocks the Commit method. - CommitFunc func(deleteEmptyObjects bool) (common.Hash, error) + CommitFunc func(v uint64, b bool) (common.Hash, error) // CopyFunc mocks the Copy method. CopyFunc func() state.StateDBI @@ -250,9 +244,6 @@ type PolarisStateDBMock struct { // FinaliseFunc mocks the Finalise method. FinaliseFunc func(deleteEmptyObjects bool) - // ForEachStorageFunc mocks the ForEachStorage method. - ForEachStorageFunc func(address common.Address, fn func(common.Hash, common.Hash) bool) error - // GetBalanceFunc mocks the GetBalance method. GetBalanceFunc func(address common.Address) *big.Int @@ -280,23 +271,20 @@ type PolarisStateDBMock struct { // GetOrNewStateObjectFunc mocks the GetOrNewStateObject method. GetOrNewStateObjectFunc func(addr common.Address) *state.StateObject - // GetProofFunc mocks the GetProof method. - GetProofFunc func(addr common.Address) ([][]byte, error) - // GetRefundFunc mocks the GetRefund method. GetRefundFunc func() uint64 // GetStateFunc mocks the GetState method. GetStateFunc func(address common.Address, hash common.Hash) common.Hash - // GetStorageProofFunc mocks the GetStorageProof method. - GetStorageProofFunc func(a common.Address, key common.Hash) ([][]byte, error) + // GetStorageRootFunc mocks the GetStorageRoot method. + GetStorageRootFunc func(addr common.Address) common.Hash // GetTransientStateFunc mocks the GetTransientState method. GetTransientStateFunc func(addr common.Address, key common.Hash) common.Hash - // HasSuicidedFunc mocks the HasSuicided method. - HasSuicidedFunc func(address common.Address) bool + // HasSelfDestructedFunc mocks the HasSelfDestructed method. + HasSelfDestructedFunc func(address common.Address) bool // IntermediateRootFunc mocks the IntermediateRoot method. IntermediateRootFunc func(deleteEmptyObjects bool) common.Hash @@ -319,6 +307,12 @@ type PolarisStateDBMock struct { // RevertToSnapshotFunc mocks the RevertToSnapshot method. RevertToSnapshotFunc func(n int) + // SelfDestructFunc mocks the SelfDestruct method. + SelfDestructFunc func(address common.Address) + + // Selfdestruct6780Func mocks the Selfdestruct6780 method. + Selfdestruct6780Func func(address common.Address) + // SetBalanceFunc mocks the SetBalance method. SetBalanceFunc func(addr common.Address, amount *big.Int) @@ -352,18 +346,12 @@ type PolarisStateDBMock struct { // StopPrefetcherFunc mocks the StopPrefetcher method. StopPrefetcherFunc func() - // StorageTrieFunc mocks the StorageTrie method. - StorageTrieFunc func(addr common.Address) (state.Trie, error) - // SubBalanceFunc mocks the SubBalance method. SubBalanceFunc func(address common.Address, intMoqParam *big.Int) // SubRefundFunc mocks the SubRefund method. SubRefundFunc func(v uint64) - // SuicideFunc mocks the Suicide method. - SuicideFunc func(address common.Address) bool - // TxIndexFunc mocks the TxIndex method. TxIndexFunc func() int @@ -412,8 +400,10 @@ type PolarisStateDBMock struct { } // Commit holds details about calls to the Commit method. Commit []struct { - // DeleteEmptyObjects is the deleteEmptyObjects argument value. - DeleteEmptyObjects bool + // V is the v argument value. + V uint64 + // B is the b argument value. + B bool } // Copy holds details about calls to the Copy method. Copy []struct { @@ -456,13 +446,6 @@ type PolarisStateDBMock struct { // DeleteEmptyObjects is the deleteEmptyObjects argument value. DeleteEmptyObjects bool } - // ForEachStorage holds details about calls to the ForEachStorage method. - ForEachStorage []struct { - // Address is the address argument value. - Address common.Address - // Fn is the fn argument value. - Fn func(common.Hash, common.Hash) bool - } // GetBalance holds details about calls to the GetBalance method. GetBalance []struct { // Address is the address argument value. @@ -512,11 +495,6 @@ type PolarisStateDBMock struct { // Addr is the addr argument value. Addr common.Address } - // GetProof holds details about calls to the GetProof method. - GetProof []struct { - // Addr is the addr argument value. - Addr common.Address - } // GetRefund holds details about calls to the GetRefund method. GetRefund []struct { } @@ -527,12 +505,10 @@ type PolarisStateDBMock struct { // Hash is the hash argument value. Hash common.Hash } - // GetStorageProof holds details about calls to the GetStorageProof method. - GetStorageProof []struct { - // A is the a argument value. - A common.Address - // Key is the key argument value. - Key common.Hash + // GetStorageRoot holds details about calls to the GetStorageRoot method. + GetStorageRoot []struct { + // Addr is the addr argument value. + Addr common.Address } // GetTransientState holds details about calls to the GetTransientState method. GetTransientState []struct { @@ -541,8 +517,8 @@ type PolarisStateDBMock struct { // Key is the key argument value. Key common.Hash } - // HasSuicided holds details about calls to the HasSuicided method. - HasSuicided []struct { + // HasSelfDestructed holds details about calls to the HasSelfDestructed method. + HasSelfDestructed []struct { // Address is the address argument value. Address common.Address } @@ -587,6 +563,16 @@ type PolarisStateDBMock struct { // N is the n argument value. N int } + // SelfDestruct holds details about calls to the SelfDestruct method. + SelfDestruct []struct { + // Address is the address argument value. + Address common.Address + } + // Selfdestruct6780 holds details about calls to the Selfdestruct6780 method. + Selfdestruct6780 []struct { + // Address is the address argument value. + Address common.Address + } // SetBalance holds details about calls to the SetBalance method. SetBalance []struct { // Addr is the addr argument value. @@ -658,11 +644,6 @@ type PolarisStateDBMock struct { // StopPrefetcher holds details about calls to the StopPrefetcher method. StopPrefetcher []struct { } - // StorageTrie holds details about calls to the StorageTrie method. - StorageTrie []struct { - // Addr is the addr argument value. - Addr common.Address - } // SubBalance holds details about calls to the SubBalance method. SubBalance []struct { // Address is the address argument value. @@ -675,11 +656,6 @@ type PolarisStateDBMock struct { // V is the v argument value. V uint64 } - // Suicide holds details about calls to the Suicide method. - Suicide []struct { - // Address is the address argument value. - Address common.Address - } // TxIndex holds details about calls to the TxIndex method. TxIndex []struct { } @@ -701,7 +677,6 @@ type PolarisStateDBMock struct { lockError sync.RWMutex lockExist sync.RWMutex lockFinalise sync.RWMutex - lockForEachStorage sync.RWMutex lockGetBalance sync.RWMutex lockGetCode sync.RWMutex lockGetCodeHash sync.RWMutex @@ -711,12 +686,11 @@ type PolarisStateDBMock struct { lockGetLogs sync.RWMutex lockGetNonce sync.RWMutex lockGetOrNewStateObject sync.RWMutex - lockGetProof sync.RWMutex lockGetRefund sync.RWMutex lockGetState sync.RWMutex - lockGetStorageProof sync.RWMutex + lockGetStorageRoot sync.RWMutex lockGetTransientState sync.RWMutex - lockHasSuicided sync.RWMutex + lockHasSelfDestructed sync.RWMutex lockIntermediateRoot sync.RWMutex lockIteratorDump sync.RWMutex lockLogs sync.RWMutex @@ -724,6 +698,8 @@ type PolarisStateDBMock struct { lockPrepare sync.RWMutex lockRawDump sync.RWMutex lockRevertToSnapshot sync.RWMutex + lockSelfDestruct sync.RWMutex + lockSelfdestruct6780 sync.RWMutex lockSetBalance sync.RWMutex lockSetCode sync.RWMutex lockSetNonce sync.RWMutex @@ -735,10 +711,8 @@ type PolarisStateDBMock struct { lockSnapshot sync.RWMutex lockStartPrefetcher sync.RWMutex lockStopPrefetcher sync.RWMutex - lockStorageTrie sync.RWMutex lockSubBalance sync.RWMutex lockSubRefund sync.RWMutex - lockSuicide sync.RWMutex lockTxIndex sync.RWMutex } @@ -979,19 +953,21 @@ func (mock *PolarisStateDBMock) AddressInAccessListCalls() []struct { } // Commit calls CommitFunc. -func (mock *PolarisStateDBMock) Commit(deleteEmptyObjects bool) (common.Hash, error) { +func (mock *PolarisStateDBMock) Commit(v uint64, b bool) (common.Hash, error) { if mock.CommitFunc == nil { panic("PolarisStateDBMock.CommitFunc: method is nil but PolarisStateDB.Commit was just called") } callInfo := struct { - DeleteEmptyObjects bool + V uint64 + B bool }{ - DeleteEmptyObjects: deleteEmptyObjects, + V: v, + B: b, } mock.lockCommit.Lock() mock.calls.Commit = append(mock.calls.Commit, callInfo) mock.lockCommit.Unlock() - return mock.CommitFunc(deleteEmptyObjects) + return mock.CommitFunc(v, b) } // CommitCalls gets all the calls that were made to Commit. @@ -999,10 +975,12 @@ func (mock *PolarisStateDBMock) Commit(deleteEmptyObjects bool) (common.Hash, er // // len(mockedPolarisStateDB.CommitCalls()) func (mock *PolarisStateDBMock) CommitCalls() []struct { - DeleteEmptyObjects bool + V uint64 + B bool } { var calls []struct { - DeleteEmptyObjects bool + V uint64 + B bool } mock.lockCommit.RLock() calls = mock.calls.Commit @@ -1287,42 +1265,6 @@ func (mock *PolarisStateDBMock) FinaliseCalls() []struct { return calls } -// ForEachStorage calls ForEachStorageFunc. -func (mock *PolarisStateDBMock) ForEachStorage(address common.Address, fn func(common.Hash, common.Hash) bool) error { - if mock.ForEachStorageFunc == nil { - panic("PolarisStateDBMock.ForEachStorageFunc: method is nil but PolarisStateDB.ForEachStorage was just called") - } - callInfo := struct { - Address common.Address - Fn func(common.Hash, common.Hash) bool - }{ - Address: address, - Fn: fn, - } - mock.lockForEachStorage.Lock() - mock.calls.ForEachStorage = append(mock.calls.ForEachStorage, callInfo) - mock.lockForEachStorage.Unlock() - return mock.ForEachStorageFunc(address, fn) -} - -// ForEachStorageCalls gets all the calls that were made to ForEachStorage. -// Check the length with: -// -// len(mockedPolarisStateDB.ForEachStorageCalls()) -func (mock *PolarisStateDBMock) ForEachStorageCalls() []struct { - Address common.Address - Fn func(common.Hash, common.Hash) bool -} { - var calls []struct { - Address common.Address - Fn func(common.Hash, common.Hash) bool - } - mock.lockForEachStorage.RLock() - calls = mock.calls.ForEachStorage - mock.lockForEachStorage.RUnlock() - return calls -} - // GetBalance calls GetBalanceFunc. func (mock *PolarisStateDBMock) GetBalance(address common.Address) *big.Int { if mock.GetBalanceFunc == nil { @@ -1618,38 +1560,6 @@ func (mock *PolarisStateDBMock) GetOrNewStateObjectCalls() []struct { return calls } -// GetProof calls GetProofFunc. -func (mock *PolarisStateDBMock) GetProof(addr common.Address) ([][]byte, error) { - if mock.GetProofFunc == nil { - panic("PolarisStateDBMock.GetProofFunc: method is nil but PolarisStateDB.GetProof was just called") - } - callInfo := struct { - Addr common.Address - }{ - Addr: addr, - } - mock.lockGetProof.Lock() - mock.calls.GetProof = append(mock.calls.GetProof, callInfo) - mock.lockGetProof.Unlock() - return mock.GetProofFunc(addr) -} - -// GetProofCalls gets all the calls that were made to GetProof. -// Check the length with: -// -// len(mockedPolarisStateDB.GetProofCalls()) -func (mock *PolarisStateDBMock) GetProofCalls() []struct { - Addr common.Address -} { - var calls []struct { - Addr common.Address - } - mock.lockGetProof.RLock() - calls = mock.calls.GetProof - mock.lockGetProof.RUnlock() - return calls -} - // GetRefund calls GetRefundFunc. func (mock *PolarisStateDBMock) GetRefund() uint64 { if mock.GetRefundFunc == nil { @@ -1713,39 +1623,35 @@ func (mock *PolarisStateDBMock) GetStateCalls() []struct { return calls } -// GetStorageProof calls GetStorageProofFunc. -func (mock *PolarisStateDBMock) GetStorageProof(a common.Address, key common.Hash) ([][]byte, error) { - if mock.GetStorageProofFunc == nil { - panic("PolarisStateDBMock.GetStorageProofFunc: method is nil but PolarisStateDB.GetStorageProof was just called") +// GetStorageRoot calls GetStorageRootFunc. +func (mock *PolarisStateDBMock) GetStorageRoot(addr common.Address) common.Hash { + if mock.GetStorageRootFunc == nil { + panic("PolarisStateDBMock.GetStorageRootFunc: method is nil but PolarisStateDB.GetStorageRoot was just called") } callInfo := struct { - A common.Address - Key common.Hash + Addr common.Address }{ - A: a, - Key: key, + Addr: addr, } - mock.lockGetStorageProof.Lock() - mock.calls.GetStorageProof = append(mock.calls.GetStorageProof, callInfo) - mock.lockGetStorageProof.Unlock() - return mock.GetStorageProofFunc(a, key) + mock.lockGetStorageRoot.Lock() + mock.calls.GetStorageRoot = append(mock.calls.GetStorageRoot, callInfo) + mock.lockGetStorageRoot.Unlock() + return mock.GetStorageRootFunc(addr) } -// GetStorageProofCalls gets all the calls that were made to GetStorageProof. +// GetStorageRootCalls gets all the calls that were made to GetStorageRoot. // Check the length with: // -// len(mockedPolarisStateDB.GetStorageProofCalls()) -func (mock *PolarisStateDBMock) GetStorageProofCalls() []struct { - A common.Address - Key common.Hash +// len(mockedPolarisStateDB.GetStorageRootCalls()) +func (mock *PolarisStateDBMock) GetStorageRootCalls() []struct { + Addr common.Address } { var calls []struct { - A common.Address - Key common.Hash + Addr common.Address } - mock.lockGetStorageProof.RLock() - calls = mock.calls.GetStorageProof - mock.lockGetStorageProof.RUnlock() + mock.lockGetStorageRoot.RLock() + calls = mock.calls.GetStorageRoot + mock.lockGetStorageRoot.RUnlock() return calls } @@ -1785,35 +1691,35 @@ func (mock *PolarisStateDBMock) GetTransientStateCalls() []struct { return calls } -// HasSuicided calls HasSuicidedFunc. -func (mock *PolarisStateDBMock) HasSuicided(address common.Address) bool { - if mock.HasSuicidedFunc == nil { - panic("PolarisStateDBMock.HasSuicidedFunc: method is nil but PolarisStateDB.HasSuicided was just called") +// HasSelfDestructed calls HasSelfDestructedFunc. +func (mock *PolarisStateDBMock) HasSelfDestructed(address common.Address) bool { + if mock.HasSelfDestructedFunc == nil { + panic("PolarisStateDBMock.HasSelfDestructedFunc: method is nil but PolarisStateDB.HasSelfDestructed was just called") } callInfo := struct { Address common.Address }{ Address: address, } - mock.lockHasSuicided.Lock() - mock.calls.HasSuicided = append(mock.calls.HasSuicided, callInfo) - mock.lockHasSuicided.Unlock() - return mock.HasSuicidedFunc(address) + mock.lockHasSelfDestructed.Lock() + mock.calls.HasSelfDestructed = append(mock.calls.HasSelfDestructed, callInfo) + mock.lockHasSelfDestructed.Unlock() + return mock.HasSelfDestructedFunc(address) } -// HasSuicidedCalls gets all the calls that were made to HasSuicided. +// HasSelfDestructedCalls gets all the calls that were made to HasSelfDestructed. // Check the length with: // -// len(mockedPolarisStateDB.HasSuicidedCalls()) -func (mock *PolarisStateDBMock) HasSuicidedCalls() []struct { +// len(mockedPolarisStateDB.HasSelfDestructedCalls()) +func (mock *PolarisStateDBMock) HasSelfDestructedCalls() []struct { Address common.Address } { var calls []struct { Address common.Address } - mock.lockHasSuicided.RLock() - calls = mock.calls.HasSuicided - mock.lockHasSuicided.RUnlock() + mock.lockHasSelfDestructed.RLock() + calls = mock.calls.HasSelfDestructed + mock.lockHasSelfDestructed.RUnlock() return calls } @@ -2051,6 +1957,70 @@ func (mock *PolarisStateDBMock) RevertToSnapshotCalls() []struct { return calls } +// SelfDestruct calls SelfDestructFunc. +func (mock *PolarisStateDBMock) SelfDestruct(address common.Address) { + if mock.SelfDestructFunc == nil { + panic("PolarisStateDBMock.SelfDestructFunc: method is nil but PolarisStateDB.SelfDestruct was just called") + } + callInfo := struct { + Address common.Address + }{ + Address: address, + } + mock.lockSelfDestruct.Lock() + mock.calls.SelfDestruct = append(mock.calls.SelfDestruct, callInfo) + mock.lockSelfDestruct.Unlock() + mock.SelfDestructFunc(address) +} + +// SelfDestructCalls gets all the calls that were made to SelfDestruct. +// Check the length with: +// +// len(mockedPolarisStateDB.SelfDestructCalls()) +func (mock *PolarisStateDBMock) SelfDestructCalls() []struct { + Address common.Address +} { + var calls []struct { + Address common.Address + } + mock.lockSelfDestruct.RLock() + calls = mock.calls.SelfDestruct + mock.lockSelfDestruct.RUnlock() + return calls +} + +// Selfdestruct6780 calls Selfdestruct6780Func. +func (mock *PolarisStateDBMock) Selfdestruct6780(address common.Address) { + if mock.Selfdestruct6780Func == nil { + panic("PolarisStateDBMock.Selfdestruct6780Func: method is nil but PolarisStateDB.Selfdestruct6780 was just called") + } + callInfo := struct { + Address common.Address + }{ + Address: address, + } + mock.lockSelfdestruct6780.Lock() + mock.calls.Selfdestruct6780 = append(mock.calls.Selfdestruct6780, callInfo) + mock.lockSelfdestruct6780.Unlock() + mock.Selfdestruct6780Func(address) +} + +// Selfdestruct6780Calls gets all the calls that were made to Selfdestruct6780. +// Check the length with: +// +// len(mockedPolarisStateDB.Selfdestruct6780Calls()) +func (mock *PolarisStateDBMock) Selfdestruct6780Calls() []struct { + Address common.Address +} { + var calls []struct { + Address common.Address + } + mock.lockSelfdestruct6780.RLock() + calls = mock.calls.Selfdestruct6780 + mock.lockSelfdestruct6780.RUnlock() + return calls +} + // SetBalance calls SetBalanceFunc. func (mock *PolarisStateDBMock) SetBalance(addr common.Address, amount *big.Int) { if mock.SetBalanceFunc == nil { @@ -2433,38 +2403,6 @@ func (mock *PolarisStateDBMock) StopPrefetcherCalls() []struct { return calls } -// StorageTrie calls StorageTrieFunc. -func (mock *PolarisStateDBMock) StorageTrie(addr common.Address) (state.Trie, error) { - if mock.StorageTrieFunc == nil { - panic("PolarisStateDBMock.StorageTrieFunc: method is nil but PolarisStateDB.StorageTrie was just called") - } - callInfo := struct { - Addr common.Address - }{ - Addr: addr, - } - mock.lockStorageTrie.Lock() - mock.calls.StorageTrie = append(mock.calls.StorageTrie, callInfo) - mock.lockStorageTrie.Unlock() - return mock.StorageTrieFunc(addr) -} - -// StorageTrieCalls gets all the calls that were made to StorageTrie. -// Check the length with: -// -// len(mockedPolarisStateDB.StorageTrieCalls()) -func (mock *PolarisStateDBMock) StorageTrieCalls() []struct { - Addr common.Address -} { - var calls []struct { - Addr common.Address - } - mock.lockStorageTrie.RLock() - calls = mock.calls.StorageTrie - mock.lockStorageTrie.RUnlock() - return calls -} - // SubBalance calls SubBalanceFunc. func (mock *PolarisStateDBMock) SubBalance(address common.Address, intMoqParam *big.Int) { if mock.SubBalanceFunc == nil { @@ -2533,38 +2471,6 @@ func (mock *PolarisStateDBMock) SubRefundCalls() []struct { return calls } -// Suicide calls SuicideFunc. -func (mock *PolarisStateDBMock) Suicide(address common.Address) bool { - if mock.SuicideFunc == nil { - panic("PolarisStateDBMock.SuicideFunc: method is nil but PolarisStateDB.Suicide was just called") - } - callInfo := struct { - Address common.Address - }{ - Address: address, - } - mock.lockSuicide.Lock() - mock.calls.Suicide = append(mock.calls.Suicide, callInfo) - mock.lockSuicide.Unlock() - return mock.SuicideFunc(address) -} - -// SuicideCalls gets all the calls that were made to Suicide. -// Check the length with: -// -// len(mockedPolarisStateDB.SuicideCalls()) -func (mock *PolarisStateDBMock) SuicideCalls() []struct { - Address common.Address -} { - var calls []struct { - Address common.Address - } - mock.lockSuicide.RLock() - calls = mock.calls.Suicide - mock.lockSuicide.RUnlock() - return calls -} - // TxIndex calls TxIndexFunc. func (mock *PolarisStateDBMock) TxIndex() int { if mock.TxIndexFunc == nil { diff --git a/eth/go.mod b/eth/go.mod index ab416a3a04..a6719d4740 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,11 +3,11 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d require ( github.com/BurntSushi/toml v1.3.2 - github.com/ethereum/go-ethereum v1.12.0 + github.com/ethereum/go-ethereum v1.13.1 github.com/holiman/uint256 v1.2.3 github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 @@ -18,6 +18,7 @@ require ( require ( github.com/DataDog/zstd v1.5.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect @@ -30,9 +31,8 @@ require ( github.com/chenzhuoyu/iasm v0.9.0 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect @@ -41,7 +41,6 @@ require ( github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/deepmap/oapi-codegen v1.13.4 // indirect - github.com/docker/docker v24.0.4+incompatible // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -69,8 +68,9 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.12 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/huin/goupnp v1.2.0 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.3 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect @@ -121,6 +121,7 @@ require ( golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect @@ -128,7 +129,6 @@ require ( golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/eth/go.sum b/eth/go.sum index 677f07c6bf..fe135b3a86 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -2,6 +2,8 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -12,8 +14,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05 h1:WRzIKM4RUH2YwhrpwMQ/VuU0UVbnsfrg+b+PrKkpH0E= -github.com/berachain/polaris-geth v0.0.0-20230824153638-497f3de05c05/go.mod h1:sOleKuvS3KgH6rpLX1d100PZWiJMVsGXswyxeCHTplo= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= +github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= @@ -38,18 +40,16 @@ github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLI github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= @@ -70,8 +70,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etly github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -156,13 +156,15 @@ github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMN github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= @@ -423,8 +425,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/eth/miner/miner.go b/eth/miner/miner.go index 29c317d7ed..02f53c60ff 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -24,8 +24,10 @@ import ( "context" "math/big" - "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/consensus/misc/eip1559" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/txpool" @@ -103,6 +105,8 @@ func NewMiner(backend Backend) Miner { } // Prepare prepares the blockchain for processing a new block at the given height. +// +//nolint:funlen // todo:fix func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // Prepare the State, Block, Configuration, Gas, and Historical plugins for the block. m.sp.Prepare(ctx) @@ -116,7 +120,7 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { } coinbase, timestamp := m.bp.GetNewBlockMetadata(number) - chainCfg := m.cp.ChainConfig() + chainConfig := m.cp.ChainConfig() // Build the new block header. parent := m.chain.CurrentFinalBlock() @@ -133,22 +137,63 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { Number: new(big.Int).SetUint64(number), GasLimit: m.gp.BlockGasLimit(), Time: timestamp, - BaseFee: misc.CalcBaseFee(chainCfg, parent), Difficulty: new(big.Int), } + // TODO: Settable in PrepareProposal. + // Set the extra field. + if /*len(w.extra) != 0*/ true { + header.Extra = nil + } + + // Set the randomness field from the beacon chain if it's available. + // TODO: Settable in PrepareProposal. + if /*genParams.random != (common.Hash{})*/ true { + // header.MixDigest = genParams.random + header.MixDigest = common.Hash{} + } + // TODO: we need to have header verification setup somewhere. // if err := misc.VerifyEip1559Header(chainCfg, parent, header); err != nil { // panic(err) // } + // Apply EIP-1559. + // TODO: Move to PrepareProposal. + if chainConfig.IsLondon(header.Number) { + header.BaseFee = eip1559.CalcBaseFee(chainConfig, parent) + // On switchover. + // TODO: implement. + // if !chainConfig.IsLondon(parent.Number) { + // parentGasLimit := parent.GasLimit * chainConfig.ElasticityMultiplier() + // header.GasLimit = core.CalcGasLimit(parentGasLimit, bc.gp.BlockGasLimit()) + // } + } + + // Apply EIP-4844, EIP-4788. + // TODO: Move to PrepareProposal. + if chainConfig.IsCancun(header.Number, header.Time) { + var excessBlobGas uint64 + if chainConfig.IsCancun(parent.Number, parent.Time) { + excessBlobGas = eip4844.CalcExcessBlobGas(*parent.ExcessBlobGas, *parent.BlobGasUsed) + } else { + // For the first post-fork block, both parent.data_gas_used and parent.excess_data_gas are evaluated as 0 + excessBlobGas = eip4844.CalcExcessBlobGas(0, 0) + } + header.BlobGasUsed = new(uint64) + header.ExcessBlobGas = &excessBlobGas + header.ParentBeaconRoot = &common.Hash{} + } + + m.logger.Info("preparing evm block", "seal_hash", header.Hash()) + // TODO: abstract the evm from the miner, so that the miner is only concerned with txs and blocks. var ( // TODO: we are hardcoding author to coinbase, this may be incorrect. // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. context = core.NewEVMBlockContext(header, m.chain, &header.Coinbase) vmenv = vm.NewGethEVMWithPrecompiles(context, - vm.TxContext{}, m.statedb, chainCfg, m.vmConfig, + vm.TxContext{}, m.statedb, chainConfig, m.vmConfig, m.backend.Host().GetPrecompilePlugin()) ) diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 631d63b156..1fb91018dc 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -38,6 +38,7 @@ import ( "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/common/hexutil" "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/log" @@ -283,7 +284,7 @@ func (b *backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Blo func (b *backend) StateAndHeaderByNumber( ctx context.Context, number rpc.BlockNumber, -) (vm.GethStateDB, *types.Header, error) { +) (state.StateDBI, *types.Header, error) { // TODO: handling pending better // // Pending state is only known by the miner // if number == rpc.PendingBlockNumber { @@ -314,7 +315,7 @@ func (b *backend) StateAndHeaderByNumber( func (b *backend) StateAndHeaderByNumberOrHash( ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, -) (vm.GethStateDB, *types.Header, error) { +) (state.StateDBI, *types.Header, error) { if blockNr, ok := blockNrOrHash.Number(); ok { return b.StateAndHeaderByNumber(ctx, blockNr) } @@ -392,7 +393,7 @@ func (b *backend) GetTd(_ context.Context, hash common.Hash) *big.Int { } // GetEVM returns a new EVM to be used for simulating a transaction, estimating gas etc. -func (b *backend) GetEVM(_ context.Context, msg *core.Message, state vm.GethStateDB, +func (b *backend) GetEVM(_ context.Context, msg *core.Message, state state.StateDBI, header *types.Header, vmConfig *vm.Config, blockCtx *vm.BlockContext, ) (*vm.GethEVM, func() error) { if vmConfig == nil { @@ -477,16 +478,14 @@ func (b *backend) Stats() (int, int) { return pending, queued } -func (b *backend) TxPoolContent() ( - map[common.Address]types.Transactions, map[common.Address]types.Transactions, -) { +func (b *backend) TxPoolContent() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) { pending, queued := b.polar.txPool.Content() b.logger.Debug("called eth.rpc.backend.TxPoolContent", "pending", len(pending), "queued", len(queued)) return pending, queued } func (b *backend) TxPoolContentFrom(addr common.Address) ( - types.Transactions, types.Transactions, + []*types.Transaction, []*types.Transaction, ) { pending, queued := b.polar.txPool.ContentFrom(addr) b.logger.Debug("called eth.rpc.backend.TxPoolContentFrom", diff --git a/eth/polar/node.go b/eth/polar/node.go index 202535b8af..2e0f173969 100644 --- a/eth/polar/node.go +++ b/eth/polar/node.go @@ -37,6 +37,9 @@ func NewGethNetworkingStack(config *node.Config) (NetworkingStack, error) { return nil, err } + // In Polaris we don't use P2P at the geth level. + node.SetP2PDisabled(true) + return &Node{ Node: node, }, nil diff --git a/go.work.sum b/go.work.sum index b6d12e038a..29348f92d8 100644 --- a/go.work.sum +++ b/go.work.sum @@ -138,24 +138,41 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= @@ -165,6 +182,7 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45M github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= @@ -180,13 +198,15 @@ github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3h github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= +github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= @@ -198,7 +218,7 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= -github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= +github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= @@ -229,14 +249,14 @@ github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6B github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= @@ -315,7 +335,9 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4 go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= diff --git a/magefiles/go.mod b/magefiles/go.mod index ec676f23c9..ad2c39986d 100644 --- a/magefiles/go.mod +++ b/magefiles/go.mod @@ -6,7 +6,7 @@ require ( github.com/bufbuild/buf v1.26.1 github.com/carolynvs/magex v0.9.0 github.com/cosmos/gosec/v2 v2.0.0-20230124142343-bf28a33fadf2 - github.com/ethereum/go-ethereum v1.12.0 + github.com/ethereum/go-ethereum v1.13.1 github.com/golangci/golangci-lint v1.54.2 github.com/google/addlicense v1.1.1 github.com/magefile/mage v1.15.0 @@ -65,9 +65,8 @@ require ( github.com/chenzhuoyu/iasm v0.9.0 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.2 // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect @@ -83,7 +82,7 @@ require ( github.com/denis-tingaikin/go-header v0.4.3 // indirect github.com/docker/cli v24.0.4+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.4+incompatible // indirect + github.com/docker/docker v24.0.5+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect @@ -155,9 +154,10 @@ require ( github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect - github.com/huin/goupnp v1.2.0 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.3 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect @@ -316,10 +316,8 @@ require ( gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.0 // indirect honnef.co/go/tools v0.4.5 // indirect mvdan.cc/gofumpt v0.5.0 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect diff --git a/magefiles/go.sum b/magefiles/go.sum index 93ecc16e75..113bdc0097 100644 --- a/magefiles/go.sum +++ b/magefiles/go.sum @@ -167,18 +167,16 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= @@ -219,8 +217,8 @@ github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAA github.com/docker/cli v24.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -239,8 +237,8 @@ github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStB github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.12.0 h1:bdnhLPtqETd4m3mS8BGMNvBTf36bO5bx/hxE2zljOa0= -github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= @@ -479,13 +477,15 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -1358,8 +1358,6 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From a6b99f647b384b8787b510e57f65ad4044754534 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 20 Sep 2023 11:09:03 -0400 Subject: [PATCH 023/122] refactor(gas): Restructure gas consumption (#1117) attempt at fixing potential gas issues in consensus: https://github.com/cosmos/cosmos-sdk/issues/12583 --------- Signed-off-by: Devon Bear --- cosmos/x/evm/keeper/msg_server.go | 21 +++---- cosmos/x/evm/keeper/processor.go | 47 ++++++++------- cosmos/x/evm/keeper/processor_test.go | 45 +++++++++++++-- cosmos/x/evm/plugins/gas/plugin.go | 1 + eth/core/imported.go | 2 +- eth/core/processor.go | 34 +++-------- eth/core/processor_test.go | 32 +++++------ eth/miner/miner.go | 82 ++++++++++++++++++--------- eth/polar/mining.go | 3 +- 9 files changed, 154 insertions(+), 113 deletions(-) diff --git a/cosmos/x/evm/keeper/msg_server.go b/cosmos/x/evm/keeper/msg_server.go index ee0096c4b6..8a471d753d 100644 --- a/cosmos/x/evm/keeper/msg_server.go +++ b/cosmos/x/evm/keeper/msg_server.go @@ -36,21 +36,16 @@ var _ types.MsgServiceServer = &Keeper{} func (k *Keeper) EthTransaction( ctx context.Context, msg *types.WrappedEthereumTransaction, ) (*types.WrappedEthereumTransactionResult, error) { - res := &types.WrappedEthereumTransactionResult{} - // Process the transaction and return the result. - result, err := k.ProcessTransaction(ctx, msg.AsTransaction()) + receipt, err := k.ProcessTransaction(ctx, msg.AsTransaction()) if err != nil { - res.Status = types.Status_STATUS_NOT_INCLUDED - return res, errorsmod.Wrapf(err, "failed to process transaction") - } - - // Check for a VM error. - if result.Err == nil { - res.Status = types.Status_STATUS_SUCCESS - } else { - res.Status = types.Status_STATUS_REVERT_UNSPECIFIED + return &types.WrappedEthereumTransactionResult{ + Status: types.Status_STATUS_NOT_INCLUDED, + }, errorsmod.Wrapf(err, "failed to process transaction") } - return res, nil + // Included the receipt status code in the response. + return &types.WrappedEthereumTransactionResult{ + Status: types.Status(receipt.Status), + }, nil } diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index ce1f3054cf..4da3dd2de6 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -22,45 +22,52 @@ package keeper import ( "context" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" ) // ProcessTransaction is called during the DeliverTx processing of the ABCI lifecycle. -func (k *Keeper) ProcessTransaction(ctx context.Context, tx *coretypes.Transaction) (*core.ExecutionResult, error) { +func (k *Keeper) ProcessTransaction(ctx context.Context, tx *coretypes.Transaction) (*coretypes.Receipt, error) { sCtx := sdk.UnwrapSDKContext(ctx) + gasMeter := sCtx.GasMeter() // We zero-out the gas meter prior to evm execution in order to ensure that the receipt output // from the EVM is correct. In the future, we will revisit this to allow gas metering for more // complex operations prior to entering the EVM. - sCtx.GasMeter().RefundGas(sCtx.GasMeter().GasConsumed(), + gasMeter.RefundGas(gasMeter.GasConsumed(), "reset gas meter prior to ethereum state transition") // Process the transaction and return the EVM's execution result. - execResult, err := k.miner.ProcessTransaction(ctx, tx) + receipt, err := k.miner.ProcessTransaction(ctx, tx) if err != nil { + k.Logger(sCtx).Error("failed to process transaction", "err", err) return nil, err } - // We don't want the cosmos transaction to be marked as failed if the EVM reverts. But - // its not the worst idea to log the error. - if execResult.Err != nil { - k.Logger(sdk.UnwrapSDKContext(ctx)).Error( - "evm execution", - "tx_hash", tx.Hash(), - "error", execResult.Err, - "gas_consumed", sCtx.GasMeter().GasConsumed(), - ) - } else { - k.Logger(sdk.UnwrapSDKContext(ctx)).Debug( - "evm execution", - "tx_hash", tx.Hash(), - "gas_consumed", sCtx.GasMeter().GasConsumed(), - ) + // Add some safety checks. + // TODO: we can probably do these once at the end of the block? + if receipt.GasUsed != gasMeter.GasConsumed() { + panic(fmt.Sprintf( + "receipt gas used and ctx gas used differ. receipt: %d, ctx: %d", + receipt.GasUsed, gasMeter.GasConsumed(), + )) + } else if receipt.CumulativeGasUsed != sCtx.BlockGasMeter().GasConsumed()+receipt.GasUsed { + panic(fmt.Sprintf( + "receipt cumulative gas used and block gas used differ. receipt: %d, ctx: %d", + receipt.CumulativeGasUsed, sCtx.BlockGasMeter().GasConsumed()+receipt.GasUsed, + )) } + // Log the receipt. + k.Logger(sCtx).Debug( + "evm execution completed", + "tx_hash", receipt.TxHash, + "gas_consumed", receipt.GasUsed, + "status", receipt.Status, + ) + // Return the execution result. - return execResult, err + return receipt, err } diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index e64a3595d8..ba372359ce 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -160,13 +160,27 @@ var _ = Describe("Processor", func() { Expect(err).ToNot(HaveOccurred()) k.GetHost().GetStatePlugin().Reset(ctx) k.GetHost().GetStatePlugin().CreateAccount(addr) - k.GetHost().GetStatePlugin().AddBalance(addr, (&big.Int{}).Mul(big.NewInt(9000000000000000000), big.NewInt(999))) + k.GetHost().GetStatePlugin().AddBalance(addr, + (&big.Int{}).Mul(big.NewInt(9000000000000000000), big.NewInt(999))) k.GetHost().GetStatePlugin().Finalize() // create the contract + // Zero out the meters. + ctx.BlockGasMeter().RefundGas( + ctx.BlockGasMeter().GasConsumed(), "reset gas meter prior to ethereum state transition") + Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal(uint64(0))) + + // Execute state transition. result, err := k.ProcessTransaction(ctx, tx) Expect(err).ToNot(HaveOccurred()) - Expect(result.Err).ToNot(HaveOccurred()) + Expect(result.Status).To(Equal(uint64(1))) + + // Confirm gas usage is correct. + Expect(ctx.GasMeter().GasConsumed()).To(Equal((result.GasUsed))) + // After the tx is fully processed. + ctx.BlockGasMeter().ConsumeGas(result.GasUsed, "consume gas") + Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed))) + // call the contract non-view function deployAddress := crypto.CreateAddress(crypto.PubkeyToAddress(key.PublicKey), 0) legacyTxData.To = &deployAddress @@ -178,17 +192,36 @@ var _ = Describe("Processor", func() { legacyTxData.Data = input legacyTxData.Nonce++ tx = coretypes.MustSignNewTx(key, signer, legacyTxData) - result, err = k.ProcessTransaction(ctx, tx) + + // Nothing should've changed here. + Expect(ctx.GasMeter().GasConsumed()).To(Equal((result.GasUsed))) + Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed))) + + // Execute another transaction. + var result2 *coretypes.Receipt + result2, err = k.ProcessTransaction(ctx, tx) Expect(err).ToNot(HaveOccurred()) - Expect(result.Err).ToNot(HaveOccurred()) + Expect(result.Status).To(Equal(uint64(1))) + + // Confirm gas usage is correct. + Expect(ctx.GasMeter().GasConsumed()).To(Equal((result2.GasUsed))) + // After the tx is fully processed. + ctx.BlockGasMeter().ConsumeGas(result2.GasUsed, "consume gas") + Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed + result2.GasUsed))) // call the contract view function legacyTxData.Data = crypto.Keccak256Hash([]byte("totalSupply()")).Bytes()[:4] legacyTxData.Nonce++ tx = coretypes.MustSignNewTx(key, signer, legacyTxData) - result, err = k.ProcessTransaction(ctx, tx) + var result3 *coretypes.Receipt + result3, err = k.ProcessTransaction(ctx, tx) Expect(err).ToNot(HaveOccurred()) - Expect(result.Err).ToNot(HaveOccurred()) + Expect(result.Status).To(Equal(uint64(1))) + // Confirm gas usage is correct. + Expect(ctx.GasMeter().GasConsumed()).To(Equal((result3.GasUsed))) + // After the tx is fully processed. + ctx.BlockGasMeter().ConsumeGas(result3.GasUsed, "consume gas") + Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed + result2.GasUsed + result3.GasUsed))) }) }) }) diff --git a/cosmos/x/evm/plugins/gas/plugin.go b/cosmos/x/evm/plugins/gas/plugin.go index 4df0e1894e..793c9a8e72 100644 --- a/cosmos/x/evm/plugins/gas/plugin.go +++ b/cosmos/x/evm/plugins/gas/plugin.go @@ -88,6 +88,7 @@ func (p *plugin) ConsumeTxGas(amount uint64) error { } else if newConsumed > p.gasMeter.Limit() { return vm.ErrOutOfGas } else if p.blockGasMeter.GasConsumed()+newConsumed > p.blockGasMeter.Limit() { + // TODO: revisit when the miner is fully ready. return core.ErrBlockOutOfGas } diff --git a/eth/core/imported.go b/eth/core/imported.go index e08bfc432d..23ec404711 100644 --- a/eth/core/imported.go +++ b/eth/core/imported.go @@ -47,7 +47,7 @@ type ( var ( // ApplyTransactionWithEVM applies a transaction to the current state of the blockchain. - ApplyTransactionWithEVMWithResult = core.ApplyTransactionWithEVMWithResult + ApplyTransactionWithEVM = core.ApplyTransactionWithEVM // NewEVMTxContext creates a new context for use in the EVM. NewEVMTxContext = core.NewEVMTxContext // NewEVMBlockContext creates a new block context for a given header. diff --git a/eth/core/processor.go b/eth/core/processor.go index aa51ddf4ea..12fc731a0d 100644 --- a/eth/core/processor.go +++ b/eth/core/processor.go @@ -46,8 +46,6 @@ type StateProcessor struct { // cp provides configuration functions from the underlying chain the EVM is running on. cp ConfigurationPlugin - // gp provides gas functions from the underlying chain the EVM is running on. - gp GasPlugin // pp is responsible for keeping track of the stateful precompile containers that are // available to the EVM and executing them. pp PrecompilePlugin @@ -77,7 +75,6 @@ type StateProcessor struct { // commit flag. func NewStateProcessor( cp ConfigurationPlugin, - gp GasPlugin, pp PrecompilePlugin, statedb vm.PolarisStateDB, vmConfig *vm.Config, @@ -85,7 +82,6 @@ func NewStateProcessor( sp := &StateProcessor{ mtx: sync.Mutex{}, cp: cp, - gp: gp, pp: pp, vmConfig: vmConfig, statedb: statedb, @@ -116,11 +112,6 @@ func (sp *StateProcessor) Prepare(evm *vm.GethEVM, header *types.Header) { sp.txs = make(types.Transactions, 0, initialTxsCapacity) sp.receipts = make(types.Receipts, 0, initialTxsCapacity) - // Ensure that the gas plugin and header are in sync. - if sp.header.GasLimit != sp.gp.BlockGasLimit() { - panic(fmt.Sprintf("block gas limit mismatch: have %d, want %d", sp.header.GasLimit, sp.gp.BlockGasLimit())) - } - // We must re-create the signer since we are processing a new block and the block number has // increased. chainConfig := sp.cp.ChainConfig() @@ -138,39 +129,28 @@ func (sp *StateProcessor) Prepare(evm *vm.GethEVM, header *types.Header) { // ProcessTransaction applies a transaction to the current state of the blockchain. func (sp *StateProcessor) ProcessTransaction( - _ context.Context, tx *types.Transaction, -) (*ExecutionResult, error) { - // We set the gasPool = gasLimit - gasUsed. - gasPool := new(GasPool).AddGas(sp.header.GasLimit - sp.gp.BlockGasConsumed()) - + _ context.Context, gasPool *GasPool, tx *types.Transaction, +) (*types.Receipt, error) { // Set the transaction context in the state database. // This clears the logs and sets the transaction info. sp.statedb.SetTxContext(tx.Hash(), len(sp.txs)) // Inshallah we will be able to apply the transaction. - receipt, result, err := ApplyTransactionWithEVMWithResult( - sp.evm, sp.cp.ChainConfig(), gasPool, sp.statedb, sp.header.BaseFee, - sp.header.Number, sp.sealhash, sp.header.Time, tx, &sp.header.GasUsed, + receipt, err := ApplyTransactionWithEVM( + sp.evm, sp.cp.ChainConfig(), gasPool, sp.statedb, + sp.header, tx, &sp.header.GasUsed, ) + if err != nil { return nil, errorslib.Wrapf(err, "could not apply transaction [%s]", tx.Hash().Hex()) } - // Consume the gas used by the state transition. In both the out of block gas as well as out of - // gas on the plugin cases, the line below will consume the remaining gas for the block and - // transaction respectively. - if err = sp.gp.ConsumeTxGas(receipt.GasUsed); err != nil { - return nil, errorslib.Wrapf( - err, "could not consume gas used %d [%s]", len(sp.txs), tx.Hash().Hex(), - ) - } - // Update the block information. sp.txs = append(sp.txs, tx) sp.receipts = append(sp.receipts, receipt) // Return the execution result to the caller. - return result, nil + return receipt, nil } // Finalize finalizes the block in the state processor and returns the receipts and bloom filter to diff --git a/eth/core/processor_test.go b/eth/core/processor_test.go index de5901d4dd..500f952bb4 100644 --- a/eth/core/processor_test.go +++ b/eth/core/processor_test.go @@ -63,7 +63,6 @@ var _ = Describe("StateProcessor", func() { var ( sdb *vmmock.PolarisStateDBMock bp *mock.BlockPluginMock - gp *mock.GasPluginMock cp *mock.ConfigurationPluginMock pp *mock.PrecompilePluginMock sp *core.StateProcessor @@ -72,17 +71,16 @@ var _ = Describe("StateProcessor", func() { BeforeEach(func() { sdb = vmmock.NewEmptyStateDB() - _, bp, cp, gp, _, pp, _, _ = mock.NewMockHostAndPlugins() + _, bp, cp, _, _, pp, _, _ = mock.NewMockHostAndPlugins() bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) } pp.HasFunc = func(addr common.Address) bool { return false } - gp.SetBlockGasLimit(uint64(blockGasLimit)) sdb.SetTxContextFunc = func(thash common.Hash, ti int) {} sdb.TxIndexFunc = func() int { return 0 } - sp = core.NewStateProcessor(cp, gp, pp, sdb, &vm.Config{}) + sp = core.NewStateProcessor(cp, pp, sdb, &vm.Config{}) Expect(sp).ToNot(BeNil()) evm = vm.NewGethEVMWithPrecompiles( vm.BlockContext{ @@ -111,8 +109,8 @@ var _ = Describe("StateProcessor", func() { }) It("should error on an unsigned transaction", func() { - Expect(gp.SetTxGasLimit(1000002)).ToNot(HaveOccurred()) - receipt, err := sp.ProcessTransaction(context.Background(), types.NewTx(legacyTxData)) + gasPool := new(core.GasPool).AddGas(1000002) + receipt, err := sp.ProcessTransaction(context.Background(), gasPool, types.NewTx(legacyTxData)) Expect(err).To(HaveOccurred()) Expect(receipt).To(BeNil()) block, receipts, logs, err := sp.Finalize(context.Background()) @@ -128,12 +126,12 @@ var _ = Describe("StateProcessor", func() { return big.NewInt(1000001) } sdb.FinaliseFunc = func(bool) {} - Expect(gp.SetTxGasLimit(1000002)).ToNot(HaveOccurred()) - result, err := sp.ProcessTransaction(context.Background(), signedTx) + gasPool := new(core.GasPool).AddGas(1000002) + result, err := sp.ProcessTransaction(context.Background(), gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) Expect(result).ToNot(BeNil()) - Expect(result.Err).ToNot(HaveOccurred()) - Expect(result.UsedGas).ToNot(BeZero()) + Expect(result.Status).To(Equal(uint64(1))) + Expect(result.GasUsed).ToNot(BeZero()) block, receipts, logs, err := sp.Finalize(context.Background()) Expect(err).ToNot(HaveOccurred()) Expect(block).ToNot(BeNil()) @@ -164,20 +162,20 @@ var _ = Describe("StateProcessor", func() { legacyTxData.To = nil legacyTxData.Value = new(big.Int) signedTx := types.MustSignNewTx(key, signer, legacyTxData) - Expect(gp.SetTxGasLimit(1000002)).ToNot(HaveOccurred()) - result, err := sp.ProcessTransaction(context.Background(), signedTx) + gasPool := new(core.GasPool).AddGas(1000002) + result, err := sp.ProcessTransaction(context.Background(), gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) Expect(result).ToNot(BeNil()) - Expect(result.Err).ToNot(HaveOccurred()) + Expect(result.Status).To(Equal(uint64(1))) // Now try calling the contract legacyTxData.To = &dummyContract signedTx = types.MustSignNewTx(key, signer, legacyTxData) - Expect(gp.SetTxGasLimit(1000002)).ToNot(HaveOccurred()) - result, err = sp.ProcessTransaction(context.Background(), signedTx) + gasPool = new(core.GasPool).AddGas(1000002) + result, err = sp.ProcessTransaction(context.Background(), gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) Expect(result).ToNot(BeNil()) - Expect(result.Err).ToNot(HaveOccurred()) + Expect(result.Status).To(Equal(uint64(1))) block, receipts, logs, err := sp.Finalize(context.Background()) Expect(err).ToNot(HaveOccurred()) Expect(block).ToNot(BeNil()) @@ -194,7 +192,7 @@ var _ = Describe("No precompile plugin provided", func() { bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) } - sp := core.NewStateProcessor(cp, gp, nil, vmmock.NewEmptyStateDB(), &vm.Config{}) + sp := core.NewStateProcessor(cp, nil, vmmock.NewEmptyStateDB(), &vm.Config{}) Expect(func() { sp.Prepare(nil, &types.Header{ GasLimit: uint64(blockGasLimit), diff --git a/eth/miner/miner.go b/eth/miner/miner.go index 02f53c60ff..d527c5179d 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -34,6 +34,7 @@ import ( "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/log" + errorslib "pkg.berachain.dev/polaris/lib/errors" ) // Backend wraps all methods required for mining. Only full node is capable @@ -53,7 +54,7 @@ type Miner interface { // ProcessTransaction processes the given transaction and returns the receipt after applying // the state transition. This method is called for each tx in the block. - ProcessTransaction(context.Context, *types.Transaction) (*core.ExecutionResult, error) + ProcessTransaction(context.Context, *types.Transaction) (*types.Receipt, error) // Finalize is called after the last tx in the block. Finalize(context.Context) error @@ -68,15 +69,18 @@ type miner struct { bp core.BlockPlugin cp core.ConfigurationPlugin gp core.GasPlugin - - sp core.StatePlugin - logger log.Logger - vmConfig vm.Config - statedb vm.PolarisStateDB + sp core.StatePlugin + logger log.Logger + vmConfig vm.Config + statedb vm.PolarisStateDB // TODO: historical plugin has no purpose here in the miner. // Should be handled async via channel hp core.HistoricalPlugin + + // workspace + pendingHeader *types.Header + gasPool *core.GasPool } // NewMiner creates a new Miner instance. @@ -98,7 +102,7 @@ func NewMiner(backend Backend) Miner { m.statedb = state.NewStateDB(m.sp) m.processor = core.NewStateProcessor( - m.cp, m.gp, host.GetPrecompilePlugin(), m.statedb, &m.vmConfig, + m.cp, host.GetPrecompilePlugin(), m.statedb, &m.vmConfig, ) return m @@ -122,15 +126,15 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { coinbase, timestamp := m.bp.GetNewBlockMetadata(number) chainConfig := m.cp.ChainConfig() - // Build the new block header. + // Build the new block m.pendingHeader. parent := m.chain.CurrentFinalBlock() if number >= 1 && parent == nil { parent = m.chain.GetHeaderByNumber(number - 1) } // Polaris does not set Ethereum state root (Root), mix hash (MixDigest), extra data (Extra), - // and block nonce (Nonce) on the new header. - header := &types.Header{ + // and block nonce (Nonce) on the new m.pendingHeader. + m.pendingHeader = &types.Header{ // Used in Polaris. ParentHash: parent.Hash(), Coinbase: coinbase, @@ -143,14 +147,14 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // TODO: Settable in PrepareProposal. // Set the extra field. if /*len(w.extra) != 0*/ true { - header.Extra = nil + m.pendingHeader.Extra = nil } // Set the randomness field from the beacon chain if it's available. // TODO: Settable in PrepareProposal. if /*genParams.random != (common.Hash{})*/ true { - // header.MixDigest = genParams.random - header.MixDigest = common.Hash{} + // m.pendingHeader.MixDigest = genParams.random + m.pendingHeader.MixDigest = common.Hash{} } // TODO: we need to have header verification setup somewhere. @@ -160,19 +164,19 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // Apply EIP-1559. // TODO: Move to PrepareProposal. - if chainConfig.IsLondon(header.Number) { - header.BaseFee = eip1559.CalcBaseFee(chainConfig, parent) + if chainConfig.IsLondon(m.pendingHeader.Number) { + m.pendingHeader.BaseFee = eip1559.CalcBaseFee(chainConfig, parent) // On switchover. // TODO: implement. // if !chainConfig.IsLondon(parent.Number) { // parentGasLimit := parent.GasLimit * chainConfig.ElasticityMultiplier() - // header.GasLimit = core.CalcGasLimit(parentGasLimit, bc.gp.BlockGasLimit()) + // m.pendingHeader.GasLimit = core.CalcGasLimit(parentGasLimit, bc.gp.BlockGasLimit()) // } } // Apply EIP-4844, EIP-4788. // TODO: Move to PrepareProposal. - if chainConfig.IsCancun(header.Number, header.Time) { + if chainConfig.IsCancun(m.pendingHeader.Number, m.pendingHeader.Time) { var excessBlobGas uint64 if chainConfig.IsCancun(parent.Number, parent.Time) { excessBlobGas = eip4844.CalcExcessBlobGas(*parent.ExcessBlobGas, *parent.BlobGasUsed) @@ -180,18 +184,18 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // For the first post-fork block, both parent.data_gas_used and parent.excess_data_gas are evaluated as 0 excessBlobGas = eip4844.CalcExcessBlobGas(0, 0) } - header.BlobGasUsed = new(uint64) - header.ExcessBlobGas = &excessBlobGas - header.ParentBeaconRoot = &common.Hash{} + m.pendingHeader.BlobGasUsed = new(uint64) + m.pendingHeader.ExcessBlobGas = &excessBlobGas + m.pendingHeader.ParentBeaconRoot = &common.Hash{} } - m.logger.Info("preparing evm block", "seal_hash", header.Hash()) + m.logger.Info("preparing evm block", "seal_hash", m.pendingHeader.Hash()) // TODO: abstract the evm from the miner, so that the miner is only concerned with txs and blocks. var ( // TODO: we are hardcoding author to coinbase, this may be incorrect. // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. - context = core.NewEVMBlockContext(header, m.chain, &header.Coinbase) + context = core.NewEVMBlockContext(m.pendingHeader, m.chain, &m.pendingHeader.Coinbase) vmenv = vm.NewGethEVMWithPrecompiles(context, vm.TxContext{}, m.statedb, chainConfig, m.vmConfig, m.backend.Host().GetPrecompilePlugin()) @@ -204,26 +208,50 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // Heuristic: Validators get miners. Full nodes get processors. m.processor.Prepare( vmenv, - header, + m.pendingHeader, ) // We update the base fee in the txpool to the next base fee. // TODO: Move to prepare proposal - m.txPool.SetBaseFee(header.BaseFee) + m.txPool.SetBaseFee(m.pendingHeader.BaseFee) - return header + return m.pendingHeader } // ProcessTransaction processes the given transaction and returns the receipt after applying // the state transition. This method is called for each tx in the block. -func (m *miner) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*core.ExecutionResult, error) { +func (m *miner) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*types.Receipt, error) { m.logger.Debug("processing evm transaction", "tx_hash", tx.Hash()) // Reset the Gas and State plugins for the tx. m.gp.Reset(ctx) // TODO: may not need this. m.sp.Reset(ctx) - return m.processor.ProcessTransaction(ctx, tx) + // We set the gasPool = gasLimit - gasUsed. + m.gasPool = new(core.GasPool).AddGas(m.pendingHeader.GasLimit - m.gp.BlockGasConsumed()) + + // Header is out of sync with block plugin. + // TODO: the miner will handle this systemically when properly done is PrepareProposal. + if m.gp.BlockGasConsumed() != m.pendingHeader.GasUsed { + panic("gas consumed mismatch") + } + + receipt, err := m.processor.ProcessTransaction(ctx, m.gasPool, tx) + if err != nil { + return nil, errorslib.Wrapf( + err, "could not process transaction [%s]", tx.Hash().Hex(), + ) + } + + // Consume the gas used by the state transition. In both the out of block gas as well as out of + // gas on the plugin cases, the line below will consume the remaining gas for the block and + // transaction respectively. + if err = m.gp.ConsumeTxGas(receipt.GasUsed); err != nil { + return nil, errorslib.Wrapf( + err, "could not consume gas used [%s] %d", tx.Hash().Hex(), receipt.GasUsed, + ) + } + return receipt, nil } // Finalize is called after the last tx in the block. diff --git a/eth/polar/mining.go b/eth/polar/mining.go index ff1bbbaa47..94bf981df3 100644 --- a/eth/polar/mining.go +++ b/eth/polar/mining.go @@ -23,7 +23,6 @@ package polar import ( "context" - "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/types" ) @@ -37,7 +36,7 @@ func (pl *Polaris) Prepare(ctx context.Context, number uint64) { } // ProcessTransaction processes the given transaction and returns the receipt. -func (pl *Polaris) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*core.ExecutionResult, error) { +func (pl *Polaris) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*types.Receipt, error) { return pl.miner.ProcessTransaction(ctx, tx) } From ef653013e96f3f803809811481b98f40dbd5dc35 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 20 Sep 2023 14:59:46 -0400 Subject: [PATCH 024/122] refactor(config): remove `polaris.toml` to simplify infra for brick (#1130) --- cosmos/config/config.go | 229 +++++++++++++++++++ cosmos/config/flags.go | 73 ++++++ cosmos/config/template.go | 183 +++++++++++++++ cosmos/go.mod | 3 +- cosmos/x/evm/genesis_test.go | 6 +- cosmos/x/evm/keeper/keeper.go | 21 +- cosmos/x/evm/keeper/processor_test.go | 6 +- e2e/hive/clients/polard/config/app.toml | 158 +++++++++++++ e2e/hive/clients/polard/config/polaris.toml | 33 --- e2e/hive/clients/polard/hive-init.sh | 1 - e2e/precompile/polard/config/app.toml | 158 +++++++++++++ e2e/precompile/polard/config/polaris.toml | 33 --- e2e/testapp/app.go | 25 +- e2e/testapp/docker/local/config/app.toml | 179 ++++++++++++++- e2e/testapp/docker/local/config/client.toml | 21 ++ e2e/testapp/docker/local/config/config.toml | 80 +++---- e2e/testapp/docker/local/config/polaris.toml | 33 --- e2e/testapp/docker/local/docker-init.sh | 1 - e2e/testapp/entrypoint.sh | 2 - e2e/testapp/polard/cmd/root.go | 36 ++- eth/polar/.polaris.example.toml | 37 --- eth/polar/backend.go | 2 +- eth/polar/config.go | 4 +- eth/polar/node.go | 1 - 24 files changed, 1088 insertions(+), 237 deletions(-) create mode 100644 cosmos/config/config.go create mode 100644 cosmos/config/flags.go create mode 100644 cosmos/config/template.go delete mode 100644 e2e/hive/clients/polard/config/polaris.toml delete mode 100644 e2e/precompile/polard/config/polaris.toml create mode 100644 e2e/testapp/docker/local/config/client.toml delete mode 100644 e2e/testapp/docker/local/config/polaris.toml delete mode 100644 eth/polar/.polaris.example.toml diff --git a/cosmos/config/config.go b/cosmos/config/config.go new file mode 100644 index 0000000000..94d6c0cfd2 --- /dev/null +++ b/cosmos/config/config.go @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package config + +import ( + "fmt" + "math/big" + "time" + + "github.com/spf13/cast" + + servertypes "github.com/cosmos/cosmos-sdk/server/types" + + "github.com/ethereum/go-ethereum/node" + + "pkg.berachain.dev/polaris/eth/polar" +) + +// DefaultConfig returns the default configuration for a polaris chain. +func DefaultConfig() *Config { + return &Config{ + Polar: *polar.DefaultConfig(), + Node: *polar.DefaultGethNodeConfig(), + } +} + +type Config struct { + Polar polar.Config + Node node.Config +} + +//nolint:funlen,gocognit,gocyclo,cyclop // TODO break up later. +func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { + var err error + var val int64 + conf := &Config{} + + // Define little error handler. + var handleError = func(err error) error { + if err != nil { + return fmt.Errorf("error while reading configuration: %w", err) + } + return nil + } + + // Wrapping casting functions to return both value and error + getString := func(key string) (string, error) { return cast.ToStringE(opts.Get(key)) } + getInt := func(key string) (int, error) { return cast.ToIntE(opts.Get(key)) } + getInt64 := func(key string) (int64, error) { return cast.ToInt64E(opts.Get(key)) } + getUint64 := func(key string) (uint64, error) { return cast.ToUint64E(opts.Get(key)) } + getFloat64 := func(key string) (float64, error) { return cast.ToFloat64E(opts.Get(key)) } + getBool := func(key string) (bool, error) { return cast.ToBoolE(opts.Get(key)) } + getStringSlice := func(key string) ([]string, error) { return cast.ToStringSliceE(opts.Get(key)) } + getTimeDuration := func(key string) (time.Duration, error) { return cast.ToDurationE(opts.Get(key)) } + + // Polar settings + if conf.Polar.RPCGasCap, err = getUint64(flagRPCGasCap); err != nil { + return nil, handleError(err) + } + if conf.Polar.RPCEVMTimeout, err = getTimeDuration(flagRPCEvmTimeout); err != nil { + return nil, handleError(err) + } + if conf.Polar.RPCTxFeeCap, err = getFloat64(flagRPCTxFeeCap); err != nil { + return nil, handleError(err) + } + + // Polar.GPO settings + if conf.Polar.GPO.Blocks, err = getInt(flagBlocks); err != nil { + return nil, handleError(err) + } + if conf.Polar.GPO.Percentile, err = getInt(flagPercentile); err != nil { + return nil, handleError(err) + } + if conf.Polar.GPO.MaxHeaderHistory, err = getUint64(flagMaxHeaderHistory); err != nil { + return nil, handleError(err) + } + if conf.Polar.GPO.MaxBlockHistory, err = getUint64(flagMaxBlockHistory); err != nil { + return nil, handleError(err) + } + if val, err = getInt64(flagDefault); err != nil { + return nil, handleError(err) + } + conf.Polar.GPO.Default = big.NewInt(val) + + if val, err = getInt64(flagDefault); err != nil { + return nil, handleError(err) + } + conf.Polar.GPO.MaxPrice = big.NewInt(val) + + if val, err = getInt64(flagDefault); err != nil { + return nil, handleError(err) + } + conf.Polar.GPO.IgnorePrice = big.NewInt(val) + + // Node settings + if conf.Node.Name, err = getString(flagName); err != nil { + return nil, handleError(err) + } + if conf.Node.UserIdent, err = getString(flagUserIdent); err != nil { + return nil, handleError(err) + } + if conf.Node.Version, err = getString(flagVersion); err != nil { + return nil, handleError(err) + } + if conf.Node.DataDir, err = getString(flagDataDir); err != nil { + return nil, handleError(err) + } + if conf.Node.KeyStoreDir, err = getString(flagKeyStoreDir); err != nil { + return nil, handleError(err) + } + if conf.Node.ExternalSigner, err = getString(flagExternalSigner); err != nil { + return nil, handleError(err) + } + if conf.Node.UseLightweightKDF, err = getBool(flagUseLightweightKdf); err != nil { + return nil, handleError(err) + } + if conf.Node.InsecureUnlockAllowed, err = getBool(flagInsecureUnlockAllowed); err != nil { + return nil, handleError(err) + } + if conf.Node.USB, err = getBool(flagUsb); err != nil { + return nil, handleError(err) + } + if conf.Node.SmartCardDaemonPath, err = getString(flagSmartCardDaemonPath); err != nil { + return nil, handleError(err) + } + if conf.Node.IPCPath, err = getString(flagIpcPath); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPHost, err = getString(flagHTTPHost); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPPort, err = getInt(flagHTTPPort); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPCors, err = getStringSlice(flagHTTPCors); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPVirtualHosts, err = getStringSlice(flagHTTPVirtualHosts); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPModules, err = getStringSlice(flagHTTPModules); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPPathPrefix, err = getString(flagHTTPPathPrefix); err != nil { + return nil, handleError(err) + } + if conf.Node.AuthAddr, err = getString(flagAuthAddr); err != nil { + return nil, handleError(err) + } + if conf.Node.AuthPort, err = getInt(flagAuthPort); err != nil { + return nil, handleError(err) + } + if conf.Node.AuthVirtualHosts, err = getStringSlice(flagAuthVirtualHosts); err != nil { + return nil, handleError(err) + } + if conf.Node.WSHost, err = getString(flagWsHost); err != nil { + return nil, handleError(err) + } + if conf.Node.WSPort, err = getInt(flagWsPort); err != nil { + return nil, handleError(err) + } + if conf.Node.WSPathPrefix, err = getString(flagWsPathPrefix); err != nil { + return nil, handleError(err) + } + if conf.Node.WSOrigins, err = getStringSlice(flagWsOrigins); err != nil { + return nil, handleError(err) + } + if conf.Node.WSModules, err = getStringSlice(flagWsModules); err != nil { + return nil, handleError(err) + } + if conf.Node.WSExposeAll, err = getBool(flagWsExposeAll); err != nil { + return nil, handleError(err) + } + if conf.Node.GraphQLCors, err = getStringSlice(flagGraphqlCors); err != nil { + return nil, handleError(err) + } + if conf.Node.GraphQLVirtualHosts, err = getStringSlice(flagGraphqlVirtualHosts); err != nil { + return nil, handleError(err) + } + if conf.Node.AllowUnprotectedTxs, err = getBool(flagAllowUnprotectedTxs); err != nil { + return nil, handleError(err) + } + if conf.Node.BatchRequestLimit, err = getInt(flagBatchRequestLimit); err != nil { + return nil, handleError(err) + } + if conf.Node.BatchResponseMaxSize, err = getInt(flagBatchResponseMaxSize); err != nil { + return nil, handleError(err) + } + if conf.Node.JWTSecret, err = getString(flagJwtSecret); err != nil { + return nil, handleError(err) + } + if conf.Node.DBEngine, err = getString(flagDBEngine); err != nil { + return nil, handleError(err) + } + + // Node.HTTPTimeouts settings + if conf.Node.HTTPTimeouts.ReadTimeout, err = getTimeDuration(flagReadTimeout); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = getTimeDuration(flagReadHeaderTimeout); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPTimeouts.WriteTimeout, err = getTimeDuration(flagWriteTimeout); err != nil { + return nil, handleError(err) + } + if conf.Node.HTTPTimeouts.IdleTimeout, err = getTimeDuration(flagIdleTimeout); err != nil { + return nil, handleError(err) + } + + return conf, nil +} diff --git a/cosmos/config/flags.go b/cosmos/config/flags.go new file mode 100644 index 0000000000..3b9758bd91 --- /dev/null +++ b/cosmos/config/flags.go @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package config + +const ( + flagGraphqlVirtualHosts = "polaris.node.graphql-virtual-hosts" + flagIpcPath = "polaris.node.ipc-path" + + //#nosec: G101 // not a secret. + flagJwtSecret = "polaris.node.jwt-secret" + flagWsPort = "polaris.node.ws-port" + flagBatchRequestLimit = "polaris.node.batch-request-limit" + flagKeyStoreDir = "polaris.node.key-store-dir" + flagDBEngine = "polaris.node.db-engine" + flagReadTimeout = "polaris.node.http-timeouts.read-timeout" + flagDataDir = "polaris.node.data-dir" + flagUserIdent = "polaris.node.user-ident" + flagBlocks = "polaris.polar.gpo.blocks" + flagGraphqlCors = "polaris.node.graphql-cors" + flagSmartCardDaemonPath = "polaris.node.smart-card-daemon-path" + flagWsModules = "polaris.node.ws-modules" + flagHTTPCors = "polaris.node.http-cors" + flagIdleTimeout = "polaris.node.http-timeouts.idle-timeout" + flagAuthAddr = "polaris.node.auth-addr" + flagAllowUnprotectedTxs = "polaris.node.allow-unprotected-txs" + flagHTTPHost = "polaris.node.http-host" + flagUseLightweightKdf = "polaris.node.use-lightweight-kdf" + flagWsExposeAll = "polaris.node.ws-expose-all" + flagMaxBlockHistory = "polaris.polar.gpo.max-block-history" + flagPercentile = "polaris.polar.gpo.percentile" + flagInsecureUnlockAllowed = "polaris.node.insecure-unlock-allowed" + flagWsPathPrefix = "polaris.node.ws-path-prefix" + flagWsHost = "polaris.node.ws-host" + flagName = "polaris.node.name" + flagRPCEvmTimeout = "polaris.polar.rpc-evm-timeout" + flagAuthVirtualHosts = "polaris.node.auth-virtual-hosts" + flagAuthPort = "polaris.node.auth-port" + flagUsb = "polaris.node.usb" + flagHTTPPort = "polaris.node.http-port" + flagBatchResponseMaxSize = "polaris.node.batch-response-max-size" + flagVersion = "polaris.node.version" + flagHTTPVirtualHosts = "polaris.node.http-virtual-hosts" + flagRPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" + flagMaxHeaderHistory = "polaris.polar.gpo.max-header-history" + flagExternalSigner = "polaris.node.external-signer" + flagHTTPPathPrefix = "polaris.node.http-path-prefix" + flagWriteTimeout = "polaris.node.http-timeouts.write-timeout" + flagReadHeaderTimeout = "polaris.node.http-timeouts.read-header-timeout" + flagHTTPModules = "polaris.node.http-modules" + flagRPCGasCap = "polaris.polar.rpc-gas-cap" + flagWsOrigins = "polaris.node.ws-origins" + flagDefault = "polaris.node.http-timeouts.default" + flagMaxPrice = "polaris.node.http-timeouts.max-price" + flagIgnorePrice = "polaris.node.http-timeouts.ignore-price" +) diff --git a/cosmos/config/template.go b/cosmos/config/template.go new file mode 100644 index 0000000000..3703ddd5ad --- /dev/null +++ b/cosmos/config/template.go @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +//nolint:lll,cyclop // template file. +package config + +const ( + PolarisConfigTemplate = ` +############################################################################### +### Polaris ### +############################################################################### +# General Polaris settings +[polaris] + +[polaris.polar] +# Gas cap for RPC requests +rpc-gas-cap = "{{ .Polaris.Polar.RPCGasCap }}" + +# Timeout setting for EVM operations via RPC +rpc-evm-timeout = "{{ .Polaris.Polar.RPCEVMTimeout }}" + +# Transaction fee cap for RPC requests +rpc-tx-fee-cap = "{{ .Polaris.Polar.RPCTxFeeCap }}" + + +# Gas price oracle settings for Polaris +[polaris.polar.gpo] +# Number of blocks to check for gas prices +blocks = {{ .Polaris.Polar.GPO.Blocks }} + +# Percentile of gas price to use +percentile = {{ .Polaris.Polar.GPO.Percentile }} + +# Maximum header history for gas price determination +max-header-history = {{ .Polaris.Polar.GPO.MaxHeaderHistory }} + +# Maximum block history for gas price determination +max-block-history = {{ .Polaris.Polar.GPO.MaxBlockHistory }} + +# Default gas price value +default = "{{ .Polaris.Polar.GPO.Default }}" + +# Maximum gas price value +max-price = "{{ .Polaris.Polar.GPO.MaxPrice }}" + +# Prices to ignore for gas price determination +ignore-price = "{{ .Polaris.Polar.GPO.IgnorePrice }}" + + +# Node-specific settings +[polaris.node] +# Name of the node +name = "{{ .Polaris.Node.Name }}" + +# User identity associated with the node +user-ident = "{{ .Polaris.Node.UserIdent }}" + +# Version of the node +version = "{{ .Polaris.Node.Version }}" + +# Directory for storing node data +data-dir = "{{ .Polaris.Node.DataDir }}" + +# Directory for storing node keys +key-store-dir = "{{ .Polaris.Node.KeyStoreDir }}" + +# Path to the external signer +external-signer = "{{ .Polaris.Node.ExternalSigner }}" + +# Whether to use lightweight KDF +use-lightweight-kdf = {{ .Polaris.Node.UseLightweightKDF }} + +# Allow insecure unlock +insecure-unlock-allowed = {{ .Polaris.Node.InsecureUnlockAllowed }} + +# USB setting for the node +usb = {{ .Polaris.Node.USB }} + +# Path to smart card daemon +smart-card-daemon-path = "{{ .Polaris.Node.SmartCardDaemonPath }}" + +# IPC path for the node +ipc-path = "{{ .Polaris.Node.IPCPath }}" + +# Host for HTTP requests +http-host = "{{ .Polaris.Node.HTTPHost }}" + +# Port for HTTP requests +http-port = {{ .Polaris.Node.HTTPPort }} + +# CORS settings for HTTP +http-cors = [{{ range $index, $element := .Polaris.Node.HTTPCors }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Virtual hosts for HTTP +http-virtual-hosts = [{{ range $index, $element := .Polaris.Node.HTTPVirtualHosts }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Enabled modules for HTTP +http-modules = [{{ range $index, $element := .Polaris.Node.HTTPModules }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Path prefix for HTTP +http-path-prefix = "{{ .Polaris.Node.HTTPPathPrefix }}" + +# Address for authentication +auth-addr = "{{ .Polaris.Node.AuthAddr }}" + +# Port for authentication +auth-port = {{ .Polaris.Node.AuthPort }} + +# Virtual hosts for authentication +auth-virtual-hosts = [{{ range $index, $element := .Polaris.Node.AuthVirtualHosts }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Host for WebSockets +ws-host = "{{ .Polaris.Node.WSHost }}" + +# Port for WebSockets +ws-port = {{ .Polaris.Node.WSPort }} + +# Path prefix for WebSockets +ws-path-prefix = "{{ .Polaris.Node.WSPathPrefix }}" + +# Origins allowed for WebSockets +ws-origins = [{{ range $index, $element := .Polaris.Node.WSOrigins }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Enabled modules for WebSockets +ws-modules = [{{ range $index, $element := .Polaris.Node.WSModules }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Expose all settings for WebSockets +ws-expose-all = {{ .Polaris.Node.WSExposeAll }} + +# CORS settings for GraphQL +graphql-cors = [{{ range $index, $element := .Polaris.Node.GraphQLCors }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Virtual hosts for GraphQL +graphql-virtual-hosts = [{{ range $index, $element := .Polaris.Node.GraphQLVirtualHosts }}{{ if $index }}, {{ end }}"{{ $element }}"{{ end }}] + +# Allow unprotected transactions +allow-unprotected-txs = {{ .Polaris.Node.AllowUnprotectedTxs }} + +# Limit for batch requests +batch-request-limit = {{ .Polaris.Node.BatchRequestLimit }} + +# Maximum size for batch responses +batch-response-max-size = {{ .Polaris.Node.BatchResponseMaxSize }} + +# JWT secret for authentication +jwt-secret = "{{ .Polaris.Node.JWTSecret }}" + +# Database engine for the node +db-engine = "{{ .Polaris.Node.DBEngine }}" + + +# HTTP timeout settings for the node +[polaris.node.http-timeouts] +# Timeout for reading HTTP requests +read-timeout = "{{ .Polaris.Node.HTTPTimeouts.ReadTimeout }}" + +# Timeout for reading HTTP request headers +read-header-timeout = "{{ .Polaris.Node.HTTPTimeouts.ReadHeaderTimeout }}" + +# Timeout for writing HTTP responses +write-timeout = "{{ .Polaris.Node.HTTPTimeouts.WriteTimeout }}" + +# Timeout for idle HTTP connections +idle-timeout = "{{ .Polaris.Node.HTTPTimeouts.IdleTimeout }}" +` +) diff --git a/cosmos/go.mod b/cosmos/go.mod index 2848563395..6704897997 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -47,6 +47,8 @@ require ( pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a ) +require github.com/spf13/cast v1.5.1 + require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -204,7 +206,6 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.2.0 // indirect diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 8e8ac2b945..240c6b0bb0 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -32,6 +32,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm" @@ -71,7 +72,10 @@ var _ = Describe("", func() { return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) }, ) - k.Setup(storetypes.NewKVStoreKey("offchain-evm"), nil, "", GinkgoT().TempDir(), log.NewNopLogger()) + cfg := config.DefaultConfig() + cfg.Node.DataDir = GinkgoT().TempDir() + cfg.Node.KeyStoreDir = GinkgoT().TempDir() + k.Setup(cfg, nil, log.NewTestLogger(GinkgoT())) am = evm.NewAppModule(k, ak) }) diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index 3a837dbb9c..325d402ce2 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -31,6 +31,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool" + "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" @@ -85,33 +86,19 @@ func NewKeeper( // Setup sets up the plugins in the Host. It also build the Polaris EVM Provider. func (k *Keeper) Setup( - _ *storetypes.KVStoreKey, + cfg *config.Config, qc func(height int64, prove bool) (sdk.Context, error), - polarisConfigPath string, - polarisDataDir string, logger log.Logger, ) { // Setup plugins in the Host k.host.Setup(k.storeKey, nil, k.ak, qc) - // Build the Polaris EVM Provider - cfg, err := polar.LoadConfigFromFilePath(polarisConfigPath) - // TODO: fix properly. - if err != nil || cfg.GPO == nil { - // TODO: log warning for this case. - logger.Error("failed to load polaris config", "falling back to defaults") - cfg = polar.DefaultConfig() - } - - // TODO: PARSE POLARIS.TOML CORRECT AGAIN - nodeCfg := polar.DefaultGethNodeConfig() - nodeCfg.DataDir = polarisDataDir - node, err := polar.NewGethNetworkingStack(nodeCfg) + node, err := polar.NewGethNetworkingStack(&cfg.Node) if err != nil { panic(err) } - k.polaris = polar.NewWithNetworkingStack(cfg, k.host, node, ethlog.FuncHandler( + k.polaris = polar.NewWithNetworkingStack(&cfg.Polar, k.host, node, ethlog.FuncHandler( func(r *ethlog.Record) error { polarisGethLogger := logger.With("module", "polaris-geth") switch r.Lvl { //nolint:nolintlint,exhaustive // linter is bugged. diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index ba372359ce..b8e6492106 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -34,6 +34,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" bindings "pkg.berachain.dev/polaris/contracts/bindings/testing" + "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -107,7 +108,10 @@ var _ = Describe("Processor", func() { validator.Status = stakingtypes.Bonded Expect(sk.SetValidator(ctx, validator)).To(Succeed()) sc = staking.NewPrecompileContract(ak, &sk) - k.Setup(storetypes.NewKVStoreKey("offchain-evm"), nil, "", GinkgoT().TempDir(), log.NewNopLogger()) + cfg := config.DefaultConfig() + cfg.Node.DataDir = GinkgoT().TempDir() + cfg.Node.KeyStoreDir = GinkgoT().TempDir() + k.Setup(cfg, nil, log.NewTestLogger(GinkgoT())) _ = sk.SetParams(ctx, stakingtypes.DefaultParams()) // Set validator with consensus address. diff --git a/e2e/hive/clients/polard/config/app.toml b/e2e/hive/clients/polard/config/app.toml index 0bb60bcaf3..6913579185 100644 --- a/e2e/hive/clients/polard/config/app.toml +++ b/e2e/hive/clients/polard/config/app.toml @@ -224,3 +224,161 @@ stop-node-on-err = true # Note, this configuration only applies to SDK built-in app-side mempool # implementations. max-txs = "5000" + +############################################################################### +### Polaris ### +############################################################################### +# General Polaris settings +[polaris] + +[polaris.polar] +# Gas cap for RPC requests +rpc-gas-cap = "50000000" + +# Timeout setting for EVM operations via RPC +rpc-evm-timeout = "5s" + +# Transaction fee cap for RPC requests +rpc-tx-fee-cap = "1" + + +# Gas price oracle settings for Polaris +[polaris.polar.gpo] +# Number of blocks to check for gas prices +blocks = 20 + +# Percentile of gas price to use +percentile = 60 + +# Maximum header history for gas price determination +max-header-history = 1024 + +# Maximum block history for gas price determination +max-block-history = 1024 + +# Default gas price value +default = "1000000000" + +# Maximum gas price value +max-price = "500000000000" + +# Prices to ignore for gas price determination +ignore-price = "2" + + +# Node-specific settings +[polaris.node] +# Name of the node +name = "polaris-geth" + +# User identity associated with the node +user-ident = "" + +# Version of the node +version = "" + +# Directory for storing node data +data-dir = "/Users/dev/Library/Ethereum" + +# Directory for storing node keys +key-store-dir = "" + +# Path to the external signer +external-signer = "" + +# Whether to use lightweight KDF +use-lightweight-kdf = false + +# Allow insecure unlock +insecure-unlock-allowed = false + +# USB setting for the node +usb = false + +# Path to smart card daemon +smart-card-daemon-path = "" + +# IPC path for the node +ipc-path = "" + +# Host for HTTP requests +http-host = "0.0.0.0" + +# Port for HTTP requests +http-port = 8545 + +# CORS settings for HTTP +http-cors = ["*"] + +# Virtual hosts for HTTP +http-virtual-hosts = ["*"] + +# Enabled modules for HTTP +http-modules = ["net", "web3", "eth", "web3", "net", "txpool", "debug"] + +# Path prefix for HTTP +http-path-prefix = "" + +# Address for authentication +auth-addr = "localhost" + +# Port for authentication +auth-port = 8551 + +# Virtual hosts for authentication +auth-virtual-hosts = ["localhost"] + +# Host for WebSockets +ws-host = "0.0.0.0" + +# Port for WebSockets +ws-port = 8546 + +# Path prefix for WebSockets +ws-path-prefix = "" + +# Origins allowed for WebSockets +ws-origins = ["*"] + +# Enabled modules for WebSockets +ws-modules = ["net", "web3", "eth"] + +# Expose all settings for WebSockets +ws-expose-all = false + +# CORS settings for GraphQL +graphql-cors = [] + +# Virtual hosts for GraphQL +graphql-virtual-hosts = ["localhost"] + +# Allow unprotected transactions +allow-unprotected-txs = false + +# Limit for batch requests +batch-request-limit = 1000 + +# Maximum size for batch responses +batch-response-max-size = 25000000 + +# JWT secret for authentication +jwt-secret = "" + +# Database engine for the node +db-engine = "" + + +# HTTP timeout settings for the node +[polaris.node.http-timeouts] +# Timeout for reading HTTP requests +read-timeout = "30s" + +# Timeout for reading HTTP request headers +read-header-timeout = "30s" + +# Timeout for writing HTTP responses +write-timeout = "30s" + +# Timeout for idle HTTP connections +idle-timeout = "2m0s" + diff --git a/e2e/hive/clients/polard/config/polaris.toml b/e2e/hive/clients/polard/config/polaris.toml deleted file mode 100644 index 8aa0d10e2d..0000000000 --- a/e2e/hive/clients/polard/config/polaris.toml +++ /dev/null @@ -1,33 +0,0 @@ -[NodeConfig] -HTTPHost = "0.0.0.0" -HTTPPort = 8545 -HTTPCors = ["*"] -HTTPVirtualHosts = ["*"] -HTTPModules = ["eth", "net", "web3", "txpool", "debug"] -AuthAddr = "0.0.0.0" -AuthPort = 8546 -AuthVirtualHosts = ["0.0.0.0"] -WSHost = "0.0.0.0" -WSPort = 8546 -WSOrigins = ["*"] -WSModules = ["eth", "net", "web3"] - -[NodeConfig.HTTPTimeouts] -ReadTimeout = "30s" -ReadHeaderTimeout = "30s" -WriteTimeout = "30s" -IdleTimeout = "1m" - -[RPCConfig] -RPCGasCap = 10000000 -RPCEVMTimeout = "10s" -RPCTxFeeCap = 1 - -[RPCConfig.GPO] -Blocks = 10 -Percentile = 50 -MaxHeaderHistory = 192 -MaxBlockHistory = 5000 -Default = 1000000000 -MaxPrice = 100000000000 -IgnorePrice = 0 diff --git a/e2e/hive/clients/polard/hive-init.sh b/e2e/hive/clients/polard/hive-init.sh index b79817f688..f86509e080 100644 --- a/e2e/hive/clients/polard/hive-init.sh +++ b/e2e/hive/clients/polard/hive-init.sh @@ -39,7 +39,6 @@ TRACE="" # Path variables CONFIG_TOML=$HOMEDIR/config/config.toml APP_TOML=$HOMEDIR/config/app.toml -POLARIS_TOML=$HOMEDIR/config/polaris.toml GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json diff --git a/e2e/precompile/polard/config/app.toml b/e2e/precompile/polard/config/app.toml index 0bb60bcaf3..6913579185 100644 --- a/e2e/precompile/polard/config/app.toml +++ b/e2e/precompile/polard/config/app.toml @@ -224,3 +224,161 @@ stop-node-on-err = true # Note, this configuration only applies to SDK built-in app-side mempool # implementations. max-txs = "5000" + +############################################################################### +### Polaris ### +############################################################################### +# General Polaris settings +[polaris] + +[polaris.polar] +# Gas cap for RPC requests +rpc-gas-cap = "50000000" + +# Timeout setting for EVM operations via RPC +rpc-evm-timeout = "5s" + +# Transaction fee cap for RPC requests +rpc-tx-fee-cap = "1" + + +# Gas price oracle settings for Polaris +[polaris.polar.gpo] +# Number of blocks to check for gas prices +blocks = 20 + +# Percentile of gas price to use +percentile = 60 + +# Maximum header history for gas price determination +max-header-history = 1024 + +# Maximum block history for gas price determination +max-block-history = 1024 + +# Default gas price value +default = "1000000000" + +# Maximum gas price value +max-price = "500000000000" + +# Prices to ignore for gas price determination +ignore-price = "2" + + +# Node-specific settings +[polaris.node] +# Name of the node +name = "polaris-geth" + +# User identity associated with the node +user-ident = "" + +# Version of the node +version = "" + +# Directory for storing node data +data-dir = "/Users/dev/Library/Ethereum" + +# Directory for storing node keys +key-store-dir = "" + +# Path to the external signer +external-signer = "" + +# Whether to use lightweight KDF +use-lightweight-kdf = false + +# Allow insecure unlock +insecure-unlock-allowed = false + +# USB setting for the node +usb = false + +# Path to smart card daemon +smart-card-daemon-path = "" + +# IPC path for the node +ipc-path = "" + +# Host for HTTP requests +http-host = "0.0.0.0" + +# Port for HTTP requests +http-port = 8545 + +# CORS settings for HTTP +http-cors = ["*"] + +# Virtual hosts for HTTP +http-virtual-hosts = ["*"] + +# Enabled modules for HTTP +http-modules = ["net", "web3", "eth", "web3", "net", "txpool", "debug"] + +# Path prefix for HTTP +http-path-prefix = "" + +# Address for authentication +auth-addr = "localhost" + +# Port for authentication +auth-port = 8551 + +# Virtual hosts for authentication +auth-virtual-hosts = ["localhost"] + +# Host for WebSockets +ws-host = "0.0.0.0" + +# Port for WebSockets +ws-port = 8546 + +# Path prefix for WebSockets +ws-path-prefix = "" + +# Origins allowed for WebSockets +ws-origins = ["*"] + +# Enabled modules for WebSockets +ws-modules = ["net", "web3", "eth"] + +# Expose all settings for WebSockets +ws-expose-all = false + +# CORS settings for GraphQL +graphql-cors = [] + +# Virtual hosts for GraphQL +graphql-virtual-hosts = ["localhost"] + +# Allow unprotected transactions +allow-unprotected-txs = false + +# Limit for batch requests +batch-request-limit = 1000 + +# Maximum size for batch responses +batch-response-max-size = 25000000 + +# JWT secret for authentication +jwt-secret = "" + +# Database engine for the node +db-engine = "" + + +# HTTP timeout settings for the node +[polaris.node.http-timeouts] +# Timeout for reading HTTP requests +read-timeout = "30s" + +# Timeout for reading HTTP request headers +read-header-timeout = "30s" + +# Timeout for writing HTTP responses +write-timeout = "30s" + +# Timeout for idle HTTP connections +idle-timeout = "2m0s" + diff --git a/e2e/precompile/polard/config/polaris.toml b/e2e/precompile/polard/config/polaris.toml deleted file mode 100644 index c18b1bb2d1..0000000000 --- a/e2e/precompile/polard/config/polaris.toml +++ /dev/null @@ -1,33 +0,0 @@ -[NodeConfig] -HTTPHost = "0.0.0.0" -HTTPPort = 8545 -HTTPCors = ["*"] -HTTPVirtualHosts = ["*"] -HTTPModules = ["eth", "net", "web3", "txpool", "debug"] -AuthAddr = "0.0.0.0" -AuthPort = 8546 -AuthVirtualHosts = ["0.0.0.0"] -WSHost = "0.0.0.0" -WSPort = 8546 -WSOrigins = ["*"] -WSModules = ["eth", "net", "web3"] - -[NodeConfig.HTTPTimeouts] -ReadTimeout = "30s" -ReadHeaderTimeout = "30s" -WriteTimeout = "30s" -IdleTimeout = "1m" - -[RPCConfig] -RPCGasCap = 10000000 -RPCEVMTimeout = "10s" -RPCTxFeeCap = 1 - -[RPCConfig.GPO] -Blocks = 10 -Percentile = 50 -MaxHeaderHistory = 192 -MaxBlockHistory = 5000 -Default = 1000000000 -MaxPrice = 100000000000 -IgnorePrice = 1 diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 915adc9c05..1f30dc3a69 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -35,7 +35,6 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/runtime" @@ -62,6 +61,7 @@ import ( slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + evmconfig "pkg.berachain.dev/polaris/cosmos/config" ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" evmante "pkg.berachain.dev/polaris/cosmos/x/evm/ante" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -224,22 +224,19 @@ func NewPolarisApp( app.App = appBuilder.Build(db, traceStore, append(baseAppOptions, baseapp.SetMempool(ethTxMempool))...) + // read oracle config from app-opts, and construct oracle service + polarisCfg, err := evmconfig.ReadConfigFromAppOpts(appOpts) + if err != nil { + panic(err) + } + // TODO: MOVE EVM SETUP // ----- BEGIN EVM SETUP ---------------------------------------------- - // TODO: reenable offchain - // offchainKey := storetypes.NewKVStoreKey("offchain-evm") - // app.MountStore(offchainKey, storetypes.StoreTypeDB) - homePath, ok := appOpts.Get(flags.FlagHome).(string) - if !ok || homePath == "" { - homePath = DefaultNodeHome - } + // setup evm keeper and all of its plugins. app.EVMKeeper.Setup( - nil, + polarisCfg, app.CreateQueryContext, - // TODO: clean this up. - homePath+"/config/polaris.toml", - homePath+"/data/polaris", logger, ) opt := ante.HandlerOptions{ @@ -260,7 +257,7 @@ func NewPolarisApp( // ----- END EVM SETUP ------------------------------------------------- // register streaming services - if err := app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { + if err = app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { panic(err) } @@ -286,7 +283,7 @@ func NewPolarisApp( app.sm.RegisterStoreDecoders() - if err := app.Load(loadLatest); err != nil { + if err = app.Load(loadLatest); err != nil { panic(err) } diff --git a/e2e/testapp/docker/local/config/app.toml b/e2e/testapp/docker/local/config/app.toml index 0bb60bcaf3..fec2b5d1c8 100644 --- a/e2e/testapp/docker/local/config/app.toml +++ b/e2e/testapp/docker/local/config/app.toml @@ -8,7 +8,11 @@ # The minimum gas prices a validator is willing to accept for processing a # transaction. A transaction's fees must meet the minimum of any denomination # specified in this config (e.g. 0.25token1;0.0001token2). -minimum-gas-prices = "0abera" +minimum-gas-prices = "0stake" + +# The maximum gas a query coming over rest/grpc may consume. +# If this is set to zero, the query can consume an unbounded amount of gas. +query-gas-limit = "0" # default: the last 362880 states are kept, pruning at 10 block intervals # nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) @@ -60,20 +64,15 @@ inter-block-cache = true index-events = [] # IavlCacheSize set the size of the iavl tree cache (in number of nodes). -iavl-cache-size = 781250 +iavl-cache-size = 10000 # IAVLDisableFastNode enables or disables the fast node feature of IAVL. # Default is false. iavl-disable-fastnode = false -# IAVLLazyLoading enable/disable the lazy loading of iavl store. -# Default is false. -iavl-lazy-loading = false - # AppDBBackend defines the database backend type to use for the application and snapshots DBs. # An empty string indicates that a fallback will be used. -# First fallback is the deprecated compile-time types.DBBackend value. -# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in CometBFT's config.toml. +# The fallback is the db_backend value set in CometBFT's config.toml. app-db-backend = "" ############################################################################### @@ -123,7 +122,7 @@ enable = false swagger = false # Address defines the API server to listen on. -address = "tcp://0.0.0.0:1317" +address = "tcp://localhost:1317" # MaxOpenConnections defines the number of maximum open connections. max-open-connections = 1000 @@ -150,7 +149,7 @@ enabled-unsafe-cors = false enable = true # Address defines the gRPC server address to bind to. -address = "0.0.0.0:9090" +address = "localhost:9090" # MaxRecvMsgSize defines the max message size in bytes the server can receive. # The default value is 10MB. @@ -223,4 +222,162 @@ stop-node-on-err = true # # Note, this configuration only applies to SDK built-in app-side mempool # implementations. -max-txs = "5000" +max-txs = 5000 + +############################################################################### +### Polaris ### +############################################################################### +# General Polaris settings +[polaris] + +[polaris.polar] +# Gas cap for RPC requests +rpc-gas-cap = "50000000" + +# Timeout setting for EVM operations via RPC +rpc-evm-timeout = "5s" + +# Transaction fee cap for RPC requests +rpc-tx-fee-cap = "1" + + +# Gas price oracle settings for Polaris +[polaris.polar.gpo] +# Number of blocks to check for gas prices +blocks = 20 + +# Percentile of gas price to use +percentile = 60 + +# Maximum header history for gas price determination +max-header-history = 1024 + +# Maximum block history for gas price determination +max-block-history = 1024 + +# Default gas price value +default = "1000000000" + +# Maximum gas price value +max-price = "500000000000" + +# Prices to ignore for gas price determination +ignore-price = "2" + + +# Node-specific settings +[polaris.node] +# Name of the node +name = "polaris-geth" + +# User identity associated with the node +user-ident = "" + +# Version of the node +version = "" + +# Directory for storing node data +data-dir = "/Users/dev/Library/Ethereum" + +# Directory for storing node keys +key-store-dir = "" + +# Path to the external signer +external-signer = "" + +# Whether to use lightweight KDF +use-lightweight-kdf = false + +# Allow insecure unlock +insecure-unlock-allowed = false + +# USB setting for the node +usb = false + +# Path to smart card daemon +smart-card-daemon-path = "" + +# IPC path for the node +ipc-path = "" + +# Host for HTTP requests +http-host = "0.0.0.0" + +# Port for HTTP requests +http-port = 8545 + +# CORS settings for HTTP +http-cors = ["*"] + +# Virtual hosts for HTTP +http-virtual-hosts = ["*"] + +# Enabled modules for HTTP +http-modules = ["net", "web3", "eth", "web3", "net", "txpool", "debug"] + +# Path prefix for HTTP +http-path-prefix = "" + +# Address for authentication +auth-addr = "localhost" + +# Port for authentication +auth-port = 8551 + +# Virtual hosts for authentication +auth-virtual-hosts = ["localhost"] + +# Host for WebSockets +ws-host = "0.0.0.0" + +# Port for WebSockets +ws-port = 8546 + +# Path prefix for WebSockets +ws-path-prefix = "" + +# Origins allowed for WebSockets +ws-origins = ["*"] + +# Enabled modules for WebSockets +ws-modules = ["net", "web3", "eth"] + +# Expose all settings for WebSockets +ws-expose-all = false + +# CORS settings for GraphQL +graphql-cors = [] + +# Virtual hosts for GraphQL +graphql-virtual-hosts = ["localhost"] + +# Allow unprotected transactions +allow-unprotected-txs = false + +# Limit for batch requests +batch-request-limit = 1000 + +# Maximum size for batch responses +batch-response-max-size = 25000000 + +# JWT secret for authentication +jwt-secret = "" + +# Database engine for the node +db-engine = "" + + +# HTTP timeout settings for the node +[polaris.node.http-timeouts] +# Timeout for reading HTTP requests +read-timeout = "30s" + +# Timeout for reading HTTP request headers +read-header-timeout = "30s" + +# Timeout for writing HTTP responses +write-timeout = "30s" + +# Timeout for idle HTTP connections +idle-timeout = "2m0s" + diff --git a/e2e/testapp/docker/local/config/client.toml b/e2e/testapp/docker/local/config/client.toml new file mode 100644 index 0000000000..f21f3eb395 --- /dev/null +++ b/e2e/testapp/docker/local/config/client.toml @@ -0,0 +1,21 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "test123" + +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "os" + +# CLI output format (text|json) +output = "text" + +# : to CometBFT RPC interface for this chain +node = "tcp://localhost:26657" + +# Transaction broadcasting mode (sync|async) +broadcast-mode = "sync" diff --git a/e2e/testapp/docker/local/config/config.toml b/e2e/testapp/docker/local/config/config.toml index 9cf1314540..aaa9a6f947 100644 --- a/e2e/testapp/docker/local/config/config.toml +++ b/e2e/testapp/docker/local/config/config.toml @@ -6,24 +6,20 @@ # "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable # or --home cmd flag. +# The version of the CometBFT binary that created or +# last modified the config file. Do not modify this. +version = "0.38.0" + ####################################################################### ### Main Base Config Options ### ####################################################################### # TCP or UNIX socket address of the ABCI application, # or the name of an ABCI application compiled in with the CometBFT binary -proxy_app = "tcp://0.0.0.0:26658" +proxy_app = "tcp://127.0.0.1:26658" # A custom human readable name for this node -moniker = "localtestnet" - -# If this node is many blocks behind the tip of the chain, BlockSync -# allows them to catchup quickly by downloading blocks in parallel -# and verifying their commits -# -# Deprecated: this key will be removed and BlockSync will be enabled -# unconditionally in the next major release. -block_sync = true +moniker = "123" # Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb # * goleveldb (github.com/syndtr/goleveldb - most popular implementation) @@ -91,7 +87,7 @@ filter_peers = false [rpc] # TCP or UNIX socket address for the RPC server to listen on -laddr = "tcp://0.0.0.0:26657" +laddr = "tcp://127.0.0.1:26657" # A list of origins a cross-domain request can be executed from # Default value '[]' disables cors support @@ -170,7 +166,7 @@ experimental_close_on_slow_client = false # WARNING: Using a value larger than 10s will result in increasing the # global HTTP write timeout, which applies to all connections and endpoints. # See https://github.com/tendermint/tendermint/issues/3435 -timeout_broadcast_tx_commit = "15s" +timeout_broadcast_tx_commit = "10s" # Maximum size of request body, in bytes max_body_bytes = 1000000 @@ -194,7 +190,7 @@ tls_cert_file = "" tls_key_file = "" # pprof listen address (https://golang.org/pkg/net/http/pprof) -pprof_laddr = "0.0.0.0:6060" +pprof_laddr = "localhost:6060" ####################################################### ### P2P Configuration Options ### @@ -204,11 +200,9 @@ pprof_laddr = "0.0.0.0:6060" # Address to listen for incoming connections laddr = "tcp://0.0.0.0:26656" -# Address to advertise to peers for them to dial -# If empty, will use the same port as the laddr, -# and will introspect on the listener or use UPnP -# to figure out the address. ip and port are required -# example: 159.89.10.97:26656 +# Address to advertise to peers for them to dial. If empty, will use the same +# port as the laddr, and will introspect on the listener to figure out the +# address. IP and port are required. Example: 159.89.10.97:26656 external_address = "" # Comma separated list of seed nodes to connect to @@ -217,9 +211,6 @@ seeds = "" # Comma separated list of nodes to keep persistent connections to persistent_peers = "" -# UPNP port forwarding -upnp = false - # Path to address book addr_book_file = "config/addrbook.json" @@ -275,13 +266,24 @@ dial_timeout = "3s" ####################################################### [mempool] -# Mempool version to use: -# 1) "v0" - (default) FIFO mempool. -# 2) "v1" - prioritized mempool (deprecated; will be removed in the next release). -version = "v0" - +# Recheck (default: true) defines whether CometBFT should recheck the +# validity for all remaining transaction in the mempool after a block. +# Since a block affects the application state, some transactions in the +# mempool may become invalid. If this does not apply to your application, +# you can disable rechecking. recheck = true + +# Broadcast (default: true) defines whether the mempool should relay +# transactions to other peers. Setting this to false will stop the mempool +# from relaying transactions to other peers until they are included in a +# block. In other words, if Broadcast is disabled, only the peer you send +# the tx to will see it until it is included in a block. broadcast = true + +# WalPath (default: "") configures the location of the Write Ahead Log +# (WAL) for the mempool. The WAL is disabled by default. To enable, set +# WalPath to where you want the WAL to be written (e.g. +# "data/mempool.wal"). wal_dir = "" # Maximum number of transactions in the mempool @@ -309,22 +311,6 @@ max_tx_bytes = 1048576 # XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 max_batch_bytes = 0 -# ttl-duration, if non-zero, defines the maximum amount of time a transaction -# can exist for in the mempool. -# -# Note, if ttl-num-blocks is also defined, a transaction will be removed if it -# has existed in the mempool at least ttl-num-blocks number of blocks or if it's -# insertion time into the mempool is beyond ttl-duration. -ttl-duration = "0s" - -# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction -# can exist for in the mempool. -# -# Note, if ttl-duration is also defined, a transaction will be removed if it -# has existed in the mempool at least ttl-num-blocks number of blocks or if -# it's insertion time into the mempool is beyond ttl-duration. -ttl-num-blocks = 0 - ####################################################### ### State Sync Configuration Options ### ####################################################### @@ -367,7 +353,7 @@ chunk_fetchers = "4" [blocksync] # Block Sync version to use: -# +# # In v0.37, v1 and v2 of the block sync protocols were deprecated. # Please use v0 instead. # @@ -382,17 +368,17 @@ version = "v0" wal_file = "data/cs.wal/wal" # How long we wait for a proposal block before prevoting nil -timeout_propose = "1s" +timeout_propose = "3s" # How much timeout_propose increases with each round -timeout_propose_delta = "1s" +timeout_propose_delta = "500ms" # How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) timeout_prevote = "1s" # How much the timeout_prevote increases with each round -timeout_prevote_delta = "1s" +timeout_prevote_delta = "500ms" # How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) timeout_precommit = "1s" # How much the timeout_precommit increases with each round -timeout_precommit_delta = "1s" +timeout_precommit_delta = "500ms" # How long we wait after committing a block, before starting on the new # height (this gives us a chance to receive some more precommits, even # though we already have +2/3). diff --git a/e2e/testapp/docker/local/config/polaris.toml b/e2e/testapp/docker/local/config/polaris.toml deleted file mode 100644 index c18b1bb2d1..0000000000 --- a/e2e/testapp/docker/local/config/polaris.toml +++ /dev/null @@ -1,33 +0,0 @@ -[NodeConfig] -HTTPHost = "0.0.0.0" -HTTPPort = 8545 -HTTPCors = ["*"] -HTTPVirtualHosts = ["*"] -HTTPModules = ["eth", "net", "web3", "txpool", "debug"] -AuthAddr = "0.0.0.0" -AuthPort = 8546 -AuthVirtualHosts = ["0.0.0.0"] -WSHost = "0.0.0.0" -WSPort = 8546 -WSOrigins = ["*"] -WSModules = ["eth", "net", "web3"] - -[NodeConfig.HTTPTimeouts] -ReadTimeout = "30s" -ReadHeaderTimeout = "30s" -WriteTimeout = "30s" -IdleTimeout = "1m" - -[RPCConfig] -RPCGasCap = 10000000 -RPCEVMTimeout = "10s" -RPCTxFeeCap = 1 - -[RPCConfig.GPO] -Blocks = 10 -Percentile = 50 -MaxHeaderHistory = 192 -MaxBlockHistory = 5000 -Default = 1000000000 -MaxPrice = 100000000000 -IgnorePrice = 1 diff --git a/e2e/testapp/docker/local/docker-init.sh b/e2e/testapp/docker/local/docker-init.sh index bb8c0b3f9e..f329192196 100644 --- a/e2e/testapp/docker/local/docker-init.sh +++ b/e2e/testapp/docker/local/docker-init.sh @@ -40,7 +40,6 @@ TRACE="" # Path variables CONFIG_TOML=$HOMEDIR/config/config.toml APP_TOML=$HOMEDIR/config/app.toml -POLARIS_TOML=$HOMEDIR/config/polaris.toml GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index 53431523ae..1494e347f7 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -39,7 +39,6 @@ TRACE="" # Path variables CONFIG_TOML=$HOMEDIR/config/config.toml APP_TOML=$HOMEDIR/config/app.toml -POLARIS_TOML=$HOMEDIR/config/polaris.toml GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json @@ -68,7 +67,6 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then cp ./e2e/testapp/docker/local/config/app.toml "$APP_TOML" cp ./e2e/testapp/docker/local/config/config.toml "$CONFIG_TOML" - cp ./e2e/testapp/docker/local/config/polaris.toml "$POLARIS_TOML" # Set client config ./bin/polard config set client keyring-backend $KEYRING --home "$HOMEDIR" diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 7087537f38..9a20136cd2 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -59,6 +59,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + evmconfig "pkg.berachain.dev/polaris/cosmos/config" ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" "pkg.berachain.dev/polaris/cosmos/crypto/keyring" evmmempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" @@ -166,7 +167,40 @@ func initCometBFTConfig() *cmtcfg.Config { // initAppConfig helps to override default appConfig template and configs. // return "", nil if no custom configuration is required for the application. func initAppConfig() (string, interface{}) { - return serverconfig.DefaultConfigTemplate, serverconfig.DefaultConfig() + // The following code snippet is just for reference. + + type CustomAppConfig struct { + serverconfig.Config + Polaris evmconfig.Config `mapstructure:"polaris"` + } + + // Optionally allow the chain developer to overwrite the SDK's default + // server config. + srvCfg := serverconfig.DefaultConfig() + // The SDK's default minimum gas price is set to "" (empty value) inside + // app.toml. If left empty by validators, the node will halt on startup. + // However, the chain developer can set a default app.toml value for their + // validators here. + // + // In summary: + // - if you leave srvCfg.MinGasPrices = "", all validators MUST tweak their + // own app.toml config, + // - if you set srvCfg.MinGasPrices non-empty, validators CAN tweak their + // own app.toml to override, or use this default value. + // + // In simapp, we set the min gas prices to 0. + srvCfg.MinGasPrices = "0stake" + // srvCfg.BaseConfig.IAVLDisableFastNode = true // disable fastnode by default + srvCfg.IAVLCacheSize = 10000 + + customAppConfig := CustomAppConfig{ + Config: *srvCfg, + Polaris: *evmconfig.DefaultConfig(), + } + + customAppTemplate := serverconfig.DefaultConfigTemplate + evmconfig.PolarisConfigTemplate + + return customAppTemplate, customAppConfig } func initRootCmd( diff --git a/eth/polar/.polaris.example.toml b/eth/polar/.polaris.example.toml deleted file mode 100644 index 61e71b38da..0000000000 --- a/eth/polar/.polaris.example.toml +++ /dev/null @@ -1,37 +0,0 @@ -[NodeConfig] -Name = "my-node" -UserIdent = "my-identity" -Version = "1.0.0" -DataDir = "/var/data/my-node" -HTTPHost = "0.0.0.0" -HTTPPort = 8545 -HTTPCors = ["*"] -HTTPVirtualHosts = ["*"] -HTTPModules = ["eth", "net", "web3", "txpool", "debug"] -AuthAddr = "0.0.0.0" -AuthPort = 8546 -AuthVirtualHosts = ["0.0.0.0"] -WSHost = "0.0.0.0" -WSPort = 8546 -WSOrigins = ["*"] -WSModules = ["eth", "net"] - -[NodeConfig.HTTPTimeouts] -ReadTimeout = "30s" -ReadHeaderTimeout = "30s" -WriteTimeout = "30s" -IdleTimeout = "1m" - -[RPCConfig] -RPCGasCap = 10000000 -RPCEVMTimeout = "10s" -RPCTxFeeCap = 1 - -[RPCConfig.GPO] -Blocks = 10 -Percentile = 50 -MaxHeaderHistory = 192 -MaxBlockHistory = 5000 -Default = 1000000000 -MaxPrice = 100000000000 -IgnorePrice = 0 diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 1fb91018dc..e1fa168501 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -84,7 +84,7 @@ func NewBackend( if cfg.GPO.Default == nil { panic("cfg.GPO.Default is nil") } - b.gpo = gasprice.NewOracle(b, *cfg.GPO) + b.gpo = gasprice.NewOracle(b, cfg.GPO) return b } diff --git a/eth/polar/config.go b/eth/polar/config.go index 291481fba4..658f530add 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -45,7 +45,7 @@ func DefaultConfig() *Config { gpoConfig := ethconfig.FullNodeGPO gpoConfig.Default = big.NewInt(gpoDefault) return &Config{ - GPO: &gpoConfig, + GPO: gpoConfig, RPCGasCap: ethconfig.Defaults.RPCGasCap, RPCTxFeeCap: ethconfig.Defaults.RPCTxFeeCap, RPCEVMTimeout: ethconfig.Defaults.RPCEVMTimeout, @@ -55,7 +55,7 @@ func DefaultConfig() *Config { // Config represents the configurable parameters for Polaris. type Config struct { // Gas Price Oracle config. - GPO *gasprice.Config + GPO gasprice.Config // RPCGasCap is the global gas cap for eth-call variants. RPCGasCap uint64 `toml:""` diff --git a/eth/polar/node.go b/eth/polar/node.go index 2e0f173969..24b249ccb9 100644 --- a/eth/polar/node.go +++ b/eth/polar/node.go @@ -57,7 +57,6 @@ func (n *Node) Start() error { } // DefaultConfig returns the default configuration for the provider. -// TODO: DEPRECATE THIS func DefaultGethNodeConfig() *node.Config { nodeCfg := node.DefaultConfig nodeCfg.P2P.NoDiscovery = true From ae7eb6529e5809a3c32ea550a69a075536def6cc Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 21 Sep 2023 18:00:14 -0400 Subject: [PATCH 025/122] fix(cfg): Handle empty DataDir in cfg. (#1133) --- cosmos/config/config.go | 3 +++ e2e/hive/clients/polard/config/app.toml | 2 +- e2e/precompile/polard/config/app.toml | 2 +- e2e/testapp/docker/local/config/app.toml | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cosmos/config/config.go b/cosmos/config/config.go index 94d6c0cfd2..3128a5bad4 100644 --- a/cosmos/config/config.go +++ b/cosmos/config/config.go @@ -123,6 +123,9 @@ func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { if conf.Node.DataDir, err = getString(flagDataDir); err != nil { return nil, handleError(err) } + if conf.Node.DataDir == "" { + conf.Node.DataDir = node.DefaultDataDir() + } if conf.Node.KeyStoreDir, err = getString(flagKeyStoreDir); err != nil { return nil, handleError(err) } diff --git a/e2e/hive/clients/polard/config/app.toml b/e2e/hive/clients/polard/config/app.toml index 6913579185..f48cfbbdcf 100644 --- a/e2e/hive/clients/polard/config/app.toml +++ b/e2e/hive/clients/polard/config/app.toml @@ -278,7 +278,7 @@ user-ident = "" version = "" # Directory for storing node data -data-dir = "/Users/dev/Library/Ethereum" +data-dir = "" # Directory for storing node keys key-store-dir = "" diff --git a/e2e/precompile/polard/config/app.toml b/e2e/precompile/polard/config/app.toml index 6913579185..f48cfbbdcf 100644 --- a/e2e/precompile/polard/config/app.toml +++ b/e2e/precompile/polard/config/app.toml @@ -278,7 +278,7 @@ user-ident = "" version = "" # Directory for storing node data -data-dir = "/Users/dev/Library/Ethereum" +data-dir = "" # Directory for storing node keys key-store-dir = "" diff --git a/e2e/testapp/docker/local/config/app.toml b/e2e/testapp/docker/local/config/app.toml index fec2b5d1c8..a9cc4f72e9 100644 --- a/e2e/testapp/docker/local/config/app.toml +++ b/e2e/testapp/docker/local/config/app.toml @@ -277,7 +277,7 @@ user-ident = "" version = "" # Directory for storing node data -data-dir = "/Users/dev/Library/Ethereum" +data-dir = "" # Directory for storing node keys key-store-dir = "" From cef9b2830ae7382ec44507f2e27cfedbe82149cb Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 21 Sep 2023 23:52:50 -0400 Subject: [PATCH 026/122] refactor(repo): Remove dead code and minor cleanup (#1134) --- cosmos/lib/codec.go | 27 +++ cosmos/lib/trees/btree.go | 133 ----------- cosmos/lib/trees/btree_test.go | 224 ------------------ cosmos/lib/trees/memiterator.go | 140 ----------- .../precompile/governance/governance_test.go | 3 +- cosmos/precompile/testutil/testutil.go | 9 +- cosmos/{lib => testing/utils}/bank.go | 2 +- cosmos/{lib => testing/utils}/interfaces.go | 8 +- 8 files changed, 34 insertions(+), 512 deletions(-) create mode 100644 cosmos/lib/codec.go delete mode 100644 cosmos/lib/trees/btree.go delete mode 100644 cosmos/lib/trees/btree_test.go delete mode 100644 cosmos/lib/trees/memiterator.go rename cosmos/{lib => testing/utils}/bank.go (99%) rename cosmos/{lib => testing/utils}/interfaces.go (93%) diff --git a/cosmos/lib/codec.go b/cosmos/lib/codec.go new file mode 100644 index 0000000000..dd214304da --- /dev/null +++ b/cosmos/lib/codec.go @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package lib + +import "cosmossdk.io/core/address" + +type CodecProvider interface { + AddressCodec() address.Codec +} diff --git a/cosmos/lib/trees/btree.go b/cosmos/lib/trees/btree.go deleted file mode 100644 index 09da34a8ed..0000000000 --- a/cosmos/lib/trees/btree.go +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package trees - -import ( - "bytes" - "errors" - - dbm "github.com/cosmos/cosmos-db" - "github.com/tidwall/btree" -) - -const ( - // The approximate number of items and children per B-tree node. Tuned with benchmarks. - // copied from memdb. - bTreeDegree = 32 -) - -var ErrKeyEmpty = errors.New("key cannot be empty") - -// BTree is an interface that defines the methods a binary tree must implement. -type BTree interface { - // Set sets the key to value. - Set(key, value []byte) - - // Get gets the value at key. - Get(key []byte) []byte - - // Delete deletes key. - Delete(key []byte) - - // Iterator returns an iterator between start and end. - Iterator(start, end []byte) (dbm.Iterator, error) - - // ReverseIterator returns a reverse iterator between start and end. - ReverseIterator(start, end []byte) (dbm.Iterator, error) - - // Copy returns a shallow copy of BTree. - Copy() BTree -} - -// bTree implements the sorted cache for cachekv store, -// we don't use MemDB here because cachekv is used extensively in sdk core path, -// we need it to be as fast as possible, while `MemDB` is mainly used as a mocking db in unit tests. -// -// We choose tidwall/btree over google/btree here because it provides API to implement step iterator directly. -type bTree struct { - tree *btree.BTreeG[item] -} - -// NewBTree creates a wrapper around `btree.BTreeG`. -func NewBTree() BTree { - return &bTree{ - tree: btree.NewBTreeGOptions(byKeys, btree.Options{ - Degree: bTreeDegree, - NoLocks: false, - }), - } -} - -func (bt *bTree) Set(key, value []byte) { - bt.tree.Set(newItem(key, value)) -} - -func (bt *bTree) Get(key []byte) []byte { - i, found := bt.tree.Get(newItem(key, nil)) - if !found { - return nil - } - return i.value -} - -func (bt *bTree) Delete(key []byte) { - bt.tree.Delete(newItem(key, nil)) -} - -//nolint:nolintlint,ireturn -func (bt *bTree) Iterator(start, end []byte) (dbm.Iterator, error) { - if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, ErrKeyEmpty - } - return newMemIterator(start, end, bt, true), nil -} - -//nolint:nolintlint,ireturn -func (bt *bTree) ReverseIterator(start, end []byte) (dbm.Iterator, error) { - if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, ErrKeyEmpty - } - return newMemIterator(start, end, bt, false), nil -} - -// Copy the tree. This is a copy-on-write operation and is very fast because -// it only performs a shadowed copy. -func (bt *bTree) Copy() BTree { - return &bTree{ - tree: bt.tree.Copy(), - } -} - -// item is a btree item with byte slices as keys and values. -type item struct { - key []byte - value []byte -} - -// byKeys compares the items by key. -func byKeys(a, b item) bool { - return bytes.Compare(a.key, b.key) == -1 -} - -// newItem creates a new pair item. -func newItem(key, value []byte) item { - return item{key: key, value: value} -} diff --git a/cosmos/lib/trees/btree_test.go b/cosmos/lib/trees/btree_test.go deleted file mode 100644 index 1dcc1b1e92..0000000000 --- a/cosmos/lib/trees/btree_test.go +++ /dev/null @@ -1,224 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package trees_test - -import ( - "encoding/binary" - "testing" - - dbm "github.com/cosmos/cosmos-db" - - "pkg.berachain.dev/polaris/cosmos/lib/trees" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestSuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/lib/ds/trees") -} - -var _ = Describe("GetSetDelete", func() { - var db trees.BTree - - BeforeEach(func() { - db = trees.NewBTree() - }) - - It("should return nil for a nonexistent key", func() { - value := db.Get([]byte("a")) - Expect(value).To(BeNil()) - }) - - It("should set and get a value", func() { - db.Set([]byte("a"), []byte{0x01}) - db.Set([]byte("b"), []byte{0x02}) - - value := db.Get([]byte("a")) - Expect(value).To(Equal([]byte{0x01})) - - value = db.Get([]byte("b")) - Expect(value).To(Equal([]byte{0x02})) - }) - - It("should delete a value", func() { - db.Set([]byte("a"), []byte{0x01}) - db.Set([]byte("b"), []byte{0x02}) - - db.Delete([]byte("a")) - - value := db.Get([]byte("a")) - Expect(value).To(BeNil()) - - db.Delete([]byte("b")) - - value = db.Get([]byte("b")) - Expect(value).To(BeNil()) - }) -}) -var _ = Describe("DBIterator", func() { - var db trees.BTree - - BeforeEach(func() { - db = trees.NewBTree() - - for i := 0; i < 10; i++ { - if i != 6 { // but skip 6. - db.Set(int642Bytes(int64(i)), []byte{}) - } - } - }) - - It("should be deep copyable", func() { - db2 := db.Copy() - - itr, err := db.Iterator(nil, nil) - Expect(err).ToNot(HaveOccurred()) - defer itr.Close() - - for itr.Valid() { - key := itr.Key() - value := itr.Value() - itr.Next() - value2 := db2.Get(key) - Expect(value).To(Equal(value2)) - } - }) - - It("should error with blank iterator keys", func() { - _, err := db.ReverseIterator([]byte{}, nil) - Expect(err).To(Equal(trees.ErrKeyEmpty)) - _, err = db.ReverseIterator(nil, []byte{}) - Expect(err).To(Equal(trees.ErrKeyEmpty)) - }) - - It("should iterate forward", func() { - itr, err := db.Iterator(nil, nil) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(itr, []int64{0, 1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator") - }) - - It("should iterate reverse", func() { - ritr, err := db.ReverseIterator(nil, nil) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator") - }) - - It("should iterate to 0", func() { - itr, err := db.Iterator(nil, int642Bytes(0)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(itr, []int64(nil), "forward iterator to 0") - }) - - It("should iterate from 10 (ex)", func() { - ritr, err := db.ReverseIterator(int642Bytes(10), nil) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64(nil), "reverse iterator from 10 (ex)") - }) - - It("should iterate from 0", func() { - itr, err := db.Iterator(int642Bytes(0), nil) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(itr, []int64{0, 1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 0") - }) - - It("should iterate from 1", func() { - itr, err := db.Iterator(int642Bytes(1), nil) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(itr, []int64{1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 1") - }) - - It("should iterate reverse from 10 (ex)", func() { - ritr, err := db.ReverseIterator(nil, int642Bytes(10)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 10 (ex)") - }) - - It("should iterate reverse from 9 (ex)", func() { - ritr, err := db.ReverseIterator(nil, int642Bytes(9)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64{8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 9 (ex)") - }) - - It("should iterate reverse from 8 (ex)", func() { - ritr, err := db.ReverseIterator(nil, int642Bytes(8)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64{7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 8 (ex)") - }) - - It("should iterate forward from 5 to 6", func() { - itr, err := db.Iterator(int642Bytes(5), int642Bytes(6)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(itr, []int64{5}, "forward iterator from 5 to 6") - }) - - It("should iterate forward from 5 to 7", func() { - itr, err := db.Iterator(int642Bytes(5), int642Bytes(7)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(itr, []int64{5}, "forward iterator from 5 to 7") - }) - - It("should reverse iterator from 5 (ex) to 4", func() { - ritr, err := db.ReverseIterator(int642Bytes(4), int642Bytes(5)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64{4}, "reverse iterator from 5 (ex) to 4") - }) - - It("should reverse iterator from 6 (ex) to 4", func() { - ritr, err := db.ReverseIterator(int642Bytes(4), int642Bytes(6)) - Expect(err).ToNot(HaveOccurred()) - verifyIterator(ritr, []int64{5, 4}, "reverse iterator from 6 (ex) to 4") - }) - - It("should return a reverse iterator from 9 (ex)", func() { - ritr, err := db.ReverseIterator(nil, int642Bytes(9)) - Expect(err).NotTo(HaveOccurred()) - verifyIterator(ritr, []int64{8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 9 (ex)") - }) - -}) - -var _ = Describe("Copy", func() { - -}) - -func verifyIterator(itr dbm.Iterator, expected []int64, _ string) { - i := 0 - for itr.Valid() { - key := itr.Key() - Expect(expected[i]).To(Equal(bytes2Int64(key))) - itr.Next() - i++ - } - Expect(i).To(Equal(len(expected))) - Expect(itr.Close()).To(Succeed()) -} - -func int642Bytes(i int64) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(i)) - return b -} - -func bytes2Int64(buf []byte) int64 { - return int64(binary.BigEndian.Uint64(buf)) -} diff --git a/cosmos/lib/trees/memiterator.go b/cosmos/lib/trees/memiterator.go deleted file mode 100644 index 47e3fa4c7d..0000000000 --- a/cosmos/lib/trees/memiterator.go +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package trees - -import ( - "bytes" - "errors" - - dbm "github.com/cosmos/cosmos-db" - "github.com/tidwall/btree" -) - -var _ dbm.Iterator = (*memIterator)(nil) - -// memIterator iterates over iterKVCache items. -// if value is nil, means it was deleted. -// Implements Iterator. -type memIterator struct { - iter btree.IterG[item] - - start []byte - end []byte - ascending bool - valid bool -} - -func newMemIterator(start, end []byte, items *bTree, ascending bool) *memIterator { - iter := items.tree.Iter() - var valid bool - //nolint:nestif // from sdk. - if ascending { - if start != nil { - valid = iter.Seek(newItem(start, nil)) - } else { - valid = iter.First() - } - } else { - if end != nil { - valid = iter.Seek(newItem(end, nil)) - if !valid { - valid = iter.Last() - } else { - // end is exclusive - valid = iter.Prev() - } - } else { - valid = iter.Last() - } - } - - mi := &memIterator{ - iter: iter, - start: start, - end: end, - ascending: ascending, - valid: valid, - } - - if mi.valid { - mi.valid = mi.keyInRange(mi.Key()) - } - - return mi -} - -func (mi *memIterator) Domain() ([]byte, []byte) { - return mi.start, mi.end -} - -func (mi *memIterator) Close() error { - mi.iter.Release() - return nil -} - -func (mi *memIterator) Error() error { - if !mi.Valid() { - return errors.New("invalid memIterator") - } - return nil -} - -func (mi *memIterator) Valid() bool { - return mi.valid -} - -func (mi *memIterator) Next() { - mi.assertValid() - - if mi.ascending { - mi.valid = mi.iter.Next() - } else { - mi.valid = mi.iter.Prev() - } - - if mi.valid { - mi.valid = mi.keyInRange(mi.Key()) - } -} - -func (mi *memIterator) keyInRange(key []byte) bool { - if mi.ascending && mi.end != nil && bytes.Compare(key, mi.end) >= 0 { - return false - } - if !mi.ascending && mi.start != nil && bytes.Compare(key, mi.start) < 0 { - return false - } - return true -} - -func (mi *memIterator) Key() []byte { - return mi.iter.Item().key -} - -func (mi *memIterator) Value() []byte { - return mi.iter.Item().value -} - -func (mi *memIterator) assertValid() { - if err := mi.Error(); err != nil { - panic(err) - } -} diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 16e2d4912b..69130519c2 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -41,7 +41,6 @@ import ( cbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" - cosmlib "pkg.berachain.dev/polaris/cosmos/lib" "pkg.berachain.dev/polaris/cosmos/precompile/testutil" testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/types" @@ -141,7 +140,7 @@ var _ = Describe("Governance Precompile", func() { It("should succeed", func() { initDeposit := sdk.NewCoins(sdk.NewInt64Coin("abera", 100)) govAcct := gk.GetGovernanceAccount(ctx).GetAddress() - err := cosmlib.MintCoinsToAddress( + err := testutils.MintCoinsToAddress( sdk.UnwrapSDKContext(vm.UnwrapPolarContext(ctx).Context()), bk, governancetypes.ModuleName, diff --git a/cosmos/precompile/testutil/testutil.go b/cosmos/precompile/testutil/testutil.go index 94496ccd5f..a59ce1bf68 100644 --- a/cosmos/precompile/testutil/testutil.go +++ b/cosmos/precompile/testutil/testutil.go @@ -43,8 +43,7 @@ import ( v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "pkg.berachain.dev/polaris/cosmos/lib" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/eth/common" //nolint:stylecheck,revive // Ginkgo is the testing framework. @@ -67,11 +66,11 @@ func Setup(ctrl *gomock.Controller, caller sdk.AccAddress) ( sdk.Context, authkeeper.AccountKeeperI, bankkeeper.Keeper, *governancekeeper.Keeper, ) { // Setup the keepers and context. - ctx, ak, bk, sk := testutil.SetupMinimalKeepers() + ctx, ak, bk, sk := testutils.SetupMinimalKeepers() dk := govtestutil.NewMockDistributionKeeper(ctrl) // Create the codec. - encCfg := testutil.MakeTestEncodingConfig( + encCfg := testutils.MakeTestEncodingConfig( gov.AppModuleBasic{}, bank.AppModuleBasic{}, ) @@ -117,7 +116,7 @@ func Setup(ctrl *gomock.Controller, caller sdk.AccAddress) ( // gk.SetProposalID(ctx, 1) // Fund the caller with some coins. - err = lib.MintCoinsToAddress( + err = testutils.MintCoinsToAddress( //nolint:gomnd // magic number is fine here. ctx, bk, governancetypes.ModuleName, common.BytesToAddress(caller), "abera", big.NewInt(100000000), ) diff --git a/cosmos/lib/bank.go b/cosmos/testing/utils/bank.go similarity index 99% rename from cosmos/lib/bank.go rename to cosmos/testing/utils/bank.go index 43b18c5a7a..775b416709 100644 --- a/cosmos/lib/bank.go +++ b/cosmos/testing/utils/bank.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package lib +package utils import ( "context" diff --git a/cosmos/lib/interfaces.go b/cosmos/testing/utils/interfaces.go similarity index 93% rename from cosmos/lib/interfaces.go rename to cosmos/testing/utils/interfaces.go index b541c80476..56502eb9bd 100644 --- a/cosmos/lib/interfaces.go +++ b/cosmos/testing/utils/interfaces.go @@ -18,20 +18,14 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package lib +package utils import ( "context" - "cosmossdk.io/core/address" - sdk "github.com/cosmos/cosmos-sdk/types" ) -type CodecProvider interface { - AddressCodec() address.Codec -} - type BankKeeper interface { SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error From d5824bc767a3daa54b7bdcbd6437988f17b166ba Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 22 Sep 2023 16:14:52 -0400 Subject: [PATCH 027/122] fix(journal): Restructure journals (#1135) --- cosmos/x/evm/plugins/base.go | 4 +- cosmos/x/evm/plugins/block/plugin.go | 2 - cosmos/x/evm/plugins/configuration/plugin.go | 2 - cosmos/x/evm/plugins/gas/plugin.go | 2 - cosmos/x/evm/plugins/historical/plugin.go | 2 - cosmos/x/evm/plugins/precompile/plugin.go | 2 - cosmos/x/evm/plugins/state/plugin.go | 1 - cosmos/x/evm/plugins/txpool/plugin.go | 2 - eth/core/state/journal/access_list.go | 44 +++++++---------- eth/core/state/journal/access_list_test.go | 48 +++++++----------- eth/core/state/journal/base.go | 52 ++++++++++++++++++++ eth/core/state/journal/logs.go | 46 ++++++----------- eth/core/state/journal/logs_test.go | 32 ++++++------ eth/core/state/journal/refund.go | 29 +++-------- eth/core/state/journal/selfdestruct_test.go | 2 +- eth/core/state/journal/selfdestructs.go | 39 ++++++--------- eth/core/state/journal/transient_storage.go | 17 ++----- 17 files changed, 143 insertions(+), 183 deletions(-) create mode 100644 eth/core/state/journal/base.go diff --git a/cosmos/x/evm/plugins/base.go b/cosmos/x/evm/plugins/base.go index d799de83ac..a88eadf765 100644 --- a/cosmos/x/evm/plugins/base.go +++ b/cosmos/x/evm/plugins/base.go @@ -28,9 +28,7 @@ import ( // Base is the base interface which all x/evm Polaris plugins must implement -type Base interface { - IsPlugin() -} +type Base interface{} // HasGenesis represents the base class that all x/evm Polaris plugins which have // InitGenesis or ExportGenesis methods must implement diff --git a/cosmos/x/evm/plugins/block/plugin.go b/cosmos/x/evm/plugins/block/plugin.go index 3edfeaaaab..415939f1a7 100644 --- a/cosmos/x/evm/plugins/block/plugin.go +++ b/cosmos/x/evm/plugins/block/plugin.go @@ -89,5 +89,3 @@ func (p *plugin) GetNewBlockMetadata(number uint64) (common.Address, uint64) { } return common.BytesToAddress(valBz), uint64(cometHeader.Time.UTC().Unix()) } - -func (p *plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/configuration/plugin.go b/cosmos/x/evm/plugins/configuration/plugin.go index a58c100be4..3110e8f9ac 100644 --- a/cosmos/x/evm/plugins/configuration/plugin.go +++ b/cosmos/x/evm/plugins/configuration/plugin.go @@ -67,5 +67,3 @@ func (p *plugin) FeeCollector() *common.Address { addr := common.BytesToAddress([]byte(authtypes.FeeCollectorName)) return &addr } - -func (p *plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/gas/plugin.go b/cosmos/x/evm/plugins/gas/plugin.go index 793c9a8e72..dfe453e342 100644 --- a/cosmos/x/evm/plugins/gas/plugin.go +++ b/cosmos/x/evm/plugins/gas/plugin.go @@ -126,5 +126,3 @@ func (p *plugin) resetMeters(ctx sdk.Context) { p.consensusMaxGas = uint64(block.MaxGas) } } - -func (p *plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/historical/plugin.go b/cosmos/x/evm/plugins/historical/plugin.go index 4846912a5a..eb19e21b65 100644 --- a/cosmos/x/evm/plugins/historical/plugin.go +++ b/cosmos/x/evm/plugins/historical/plugin.go @@ -69,5 +69,3 @@ func NewPlugin( func (p *plugin) Prepare(ctx context.Context) { p.ctx = sdk.UnwrapSDKContext(ctx) } - -func (p *plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/precompile/plugin.go b/cosmos/x/evm/plugins/precompile/plugin.go index 68cdcd3812..8f0aeaed89 100644 --- a/cosmos/x/evm/plugins/precompile/plugin.go +++ b/cosmos/x/evm/plugins/precompile/plugin.go @@ -207,5 +207,3 @@ func (p *plugin) disableReentrancy(sdb vm.PolarisStateDB) { // restore ctx gas configs for continuing precompile execution p.sp.SetGasConfig(p.kvGasConfig, p.transientKVGasConfig) } - -func (p *plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 95cdf11ce1..af3ac8573e 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -546,4 +546,3 @@ func (p *plugin) SetGasConfig(kvGasConfig, transientKVGasConfig storetypes.GasCo } // IsPlugin implements plugins.Base. -func (p *plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/txpool/plugin.go b/cosmos/x/evm/plugins/txpool/plugin.go index 2f3fcd4b4a..fd9e9e75b4 100644 --- a/cosmos/x/evm/plugins/txpool/plugin.go +++ b/cosmos/x/evm/plugins/txpool/plugin.go @@ -120,5 +120,3 @@ func (p *plugin) SendPrivTx(signedTx *coretypes.Transaction) error { // the tx. return p.EthTxPool.Insert(sdk.Context{}.WithPriority(signedTx.GasPrice().Int64()), cosmosTx) } - -func (p *plugin) IsPlugin() {} diff --git a/eth/core/state/journal/access_list.go b/eth/core/state/journal/access_list.go index 12e4080ee3..14b54117fa 100644 --- a/eth/core/state/journal/access_list.go +++ b/eth/core/state/journal/access_list.go @@ -22,8 +22,6 @@ package journal import ( "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/lib/ds" - "pkg.berachain.dev/polaris/lib/ds/stack" libtypes "pkg.berachain.dev/polaris/lib/types" "pkg.berachain.dev/polaris/lib/utils" ) @@ -43,18 +41,17 @@ type Accesslist interface { AddressInAccessList(common.Address) bool } +// accessList is a `baseJournal` that tracks the access list. type accessList struct { - *AccessList // current access list, always the head of journal stack. - journal ds.Stack[*AccessList] // journal of access lists. + baseJournal[*AccessList] // journal of access lists. } // NewAccesslist returns a new `accessList` journal. func NewAccesslist() Accesslist { - journal := stack.New[*AccessList](initCapacity) + journal := newBaseJournal[*AccessList](initCapacity) journal.Push(NewAccessList()) return &accessList{ - AccessList: journal.Peek(), - journal: journal, + baseJournal: journal, } } @@ -65,35 +62,31 @@ func (al *accessList) RegistryKey() string { // AddAddressToAccessList implements `state.AccessListJournal`. func (al *accessList) AddAddressToAccessList(addr common.Address) { - al.AddAddress(addr) + al.Peek().AddAddress(addr) } // AddSlotToAccessList implements `state.AccessListJournal`. func (al *accessList) AddSlotToAccessList(addr common.Address, slot common.Hash) { - al.AddSlot(addr, slot) + al.Peek().AddSlot(addr, slot) } // AddressInAccessList implements `state.AccessListJournal`. func (al *accessList) AddressInAccessList(addr common.Address) bool { - return al.ContainsAddress(addr) + return al.Peek().ContainsAddress(addr) } // SlotInAccessList implements `state.AccessListJournal`. func (al *accessList) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { - return al.Contains(addr, slot) + return al.Peek().Contains(addr, slot) } -// `Snapshot` implements `libtypes.Snapshottable`. +// Snapshot implements `libtypes.Snapshottable`. func (al *accessList) Snapshot() int { - al.AccessList = al.AccessList.Copy() - al.journal.Push(al.AccessList) - return al.journal.Size() - 1 -} - -// RevertToSnapshot implements `libtypes.Snapshottable`. -func (al *accessList) RevertToSnapshot(id int) { - al.journal.PopToSize(id) - al.AccessList = al.journal.Peek() + al.Push(al.Peek().Copy()) + // Accesslist is size minus one, since we want to revert to the place in the stack + // where snapshot was called, which since we need to push a copy on the stack, is + // the size minus one. + return al.baseJournal.Size() - 1 } // Finalize implements `libtypes.Controllable`. @@ -103,15 +96,12 @@ func (al *accessList) Finalize() { // Clone implements `libtypes.Cloneable`. func (al *accessList) Clone() Accesslist { - size := al.journal.Size() cpy := &accessList{ - AccessList: al.AccessList.Copy(), - journal: stack.New[*AccessList](size), + baseJournal: newBaseJournal[*AccessList](al.Capacity()), } - cpy.journal.Push(cpy.AccessList) - for i := 1; i < size; i++ { // skip the root, already pushed above - cpy.journal.Push(al.journal.PeekAt(i).Copy()) + for i := 0; i < al.Size(); i++ { // skip the root, already pushed above + cpy.Push(al.PeekAt(i).Copy()) } return cpy diff --git a/eth/core/state/journal/access_list_test.go b/eth/core/state/journal/access_list_test.go index 4c6743919e..b34ab36bb6 100644 --- a/eth/core/state/journal/access_list_test.go +++ b/eth/core/state/journal/access_list_test.go @@ -46,49 +46,37 @@ var _ = Describe("AccessList", func() { }) It("should support controllable access list operations", func() { - Expect(al.AddAddress(a1)).To(BeTrue()) - Expect(al.ContainsAddress(a1)).To(BeTrue()) - Expect(al.ContainsAddress(a2)).To(BeFalse()) - al.DeleteAddress(a1) - Expect(al.ContainsAddress(a1)).To(BeFalse()) + al.AddAddressToAccessList(a1) + Expect(al.AddressInAccessList(a1)).To(BeTrue()) + Expect(al.AddressInAccessList(a2)).To(BeFalse()) + al.Peek().DeleteAddress(a1) + Expect(al.AddressInAccessList(a1)).To(BeFalse()) - ac, sc := al.AddSlot(a1, s1) - Expect(ac).To(BeTrue()) - Expect(sc).To(BeTrue()) - ac, sc = al.AddSlot(a1, s2) - Expect(ac).To(BeFalse()) - Expect(sc).To(BeTrue()) + al.AddSlotToAccessList(a1, s1) + al.AddSlotToAccessList(a1, s2) id := al.Snapshot() + al.AddSlotToAccessList(a2, s1) - ac, sc = al.AddSlot(a2, s1) - Expect(ac).To(BeTrue()) - Expect(sc).To(BeTrue()) - Expect(al.ContainsAddress(a2)).To(BeTrue()) + Expect(al.AddressInAccessList(a2)).To(BeTrue()) al.RevertToSnapshot(id) - Expect(al.ContainsAddress(a2)).To(BeFalse()) + Expect(al.AddressInAccessList(a2)).To(BeFalse()) Expect(func() { al.Finalize() }).ToNot(Panic()) - Expect(al.journal.Size()).To(Equal(1)) + Expect(al.Size()).To(Equal(1)) }) It("should clone correctly", func() { - ac, sc := al.AddSlot(a1, s1) - Expect(ac).To(BeTrue()) - Expect(sc).To(BeTrue()) - ac, sc = al.AddSlot(a1, s2) - Expect(ac).To(BeFalse()) - Expect(sc).To(BeTrue()) + al.AddSlotToAccessList(a1, s1) + al.AddSlotToAccessList(a1, s2) al2 := utils.MustGetAs[*accessList](al.Clone()) - Expect(al2.ContainsAddress(a1)).To(BeTrue()) - Expect(al2.ContainsAddress(a2)).To(BeFalse()) + Expect(al2.AddressInAccessList(a1)).To(BeTrue()) + Expect(al2.AddressInAccessList(a2)).To(BeFalse()) - ac, sc = al2.AddSlot(a2, s1) - Expect(ac).To(BeTrue()) - Expect(sc).To(BeTrue()) - Expect(al2.ContainsAddress(a2)).To(BeTrue()) - Expect(al.ContainsAddress(a2)).To(BeFalse()) + al2.AddSlotToAccessList(a2, s1) + Expect(al2.AddressInAccessList(a2)).To(BeTrue()) + Expect(al.AddressInAccessList(a2)).To(BeFalse()) }) }) diff --git a/eth/core/state/journal/base.go b/eth/core/state/journal/base.go new file mode 100644 index 0000000000..af87a40c3c --- /dev/null +++ b/eth/core/state/journal/base.go @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package journal + +import ( + "pkg.berachain.dev/polaris/lib/ds" + "pkg.berachain.dev/polaris/lib/ds/stack" +) + +// baseJournal is a struct that holds a stack of items. +type baseJournal[T any] struct { + ds.Stack[T] +} + +// newBaseJournal returns a new `baseJournal` with the given initial capacity. +func newBaseJournal[T any](initialCapacity int) baseJournal[T] { + return baseJournal[T]{ + Stack: stack.New[T](initialCapacity), + } +} + +// Snapshot takes a snapshot of the `Logs` store. +// +// Snapshot implements `libtypes.Snapshottable`. +func (j *baseJournal[T]) Snapshot() int { + return j.Size() +} + +// RevertToSnapshot reverts the `Logs` store to a given snapshot id. +// +// RevertToSnapshot implements `libtypes.Snapshottable`. +func (j *baseJournal[T]) RevertToSnapshot(id int) { + j.PopToSize(id) +} diff --git a/eth/core/state/journal/logs.go b/eth/core/state/journal/logs.go index 18eb788e25..8157bdff4a 100644 --- a/eth/core/state/journal/logs.go +++ b/eth/core/state/journal/logs.go @@ -23,8 +23,6 @@ package journal import ( "pkg.berachain.dev/polaris/eth/common" coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/lib/ds" - "pkg.berachain.dev/polaris/lib/ds/stack" libtypes "pkg.berachain.dev/polaris/lib/types" ) @@ -48,7 +46,7 @@ type Log interface { // logs is a state plugin that tracks Ethereum logs. type logs struct { - journal ds.Stack[*coretypes.Log] // journal of logs that resets on every tx + baseJournal[*coretypes.Log] txHash common.Hash txIndex int } @@ -56,7 +54,7 @@ type logs struct { // NewLogs returns a new `logs` journal. func NewLogs() Log { return &logs{ - journal: stack.New[*coretypes.Log](initCapacity), + baseJournal: newBaseJournal[*coretypes.Log](initCapacity), } } @@ -67,7 +65,7 @@ func (l *logs) RegistryKey() string { // SetTxContext sets the transaction hash and index for the current transaction. func (l *logs) SetTxContext(thash common.Hash, ti int) { - l.journal = stack.New[*coretypes.Log](initCapacity) + l.baseJournal = newBaseJournal[*coretypes.Log](initCapacity) // Set the transaction hash and index. l.txHash = thash l.txIndex = ti @@ -82,45 +80,31 @@ func (l *logs) TxIndex() int { func (l *logs) AddLog(log *coretypes.Log) { log.TxHash = l.txHash log.TxIndex = uint(l.txIndex) - l.journal.Push(log) + l.Push(log) } // Logs returns the logs for the current tx with the existing metadata. func (l *logs) Logs() []*coretypes.Log { - size := l.journal.Size() + size := l.Size() buf := make([]*coretypes.Log, size) for i := 0; i < size; i++ { - buf[i] = l.journal.PeekAt(i) + buf[i] = l.PeekAt(i) } return buf } // GetLogs returns the logs for the tx with the given metadata. func (l *logs) GetLogs(_ common.Hash, blockNumber uint64, blockHash common.Hash) []*coretypes.Log { - size := l.journal.Size() + size := l.Size() buf := make([]*coretypes.Log, size) for i := 0; i < size; i++ { - buf[i] = l.journal.PeekAt(i) + buf[i] = l.PeekAt(i) buf[i].BlockHash = blockHash buf[i].BlockNumber = blockNumber } return buf } -// Snapshot takes a snapshot of the `Logs` store. -// -// Snapshot implements `libtypes.Snapshottable`. -func (l *logs) Snapshot() int { - return l.journal.Size() -} - -// RevertToSnapshot reverts the `Logs` store to a given snapshot id. -// -// RevertToSnapshot implements `libtypes.Snapshottable`. -func (l *logs) RevertToSnapshot(id int) { - l.journal.PopToSize(id) -} - // Finalize clears the journal of the tx logs. // // Finalize implements `libtypes.Controllable`. @@ -128,19 +112,17 @@ func (l *logs) Finalize() {} // Clone implements `libtypes.Cloneable`. func (l *logs) Clone() Log { - capacity := l.journal.Capacity() - size := l.journal.Size() clone := &logs{ - journal: stack.New[*coretypes.Log](capacity), - txHash: l.txHash, - txIndex: l.txIndex, + baseJournal: newBaseJournal[*coretypes.Log](l.Capacity()), + txHash: l.txHash, + txIndex: l.txIndex, } // copy every individual log from the journal - for i := 0; i < size; i++ { + for i := 0; i < l.Size(); i++ { cpy := new(coretypes.Log) - *cpy = *l.journal.PeekAt(i) - clone.journal.Push(cpy) + *cpy = *l.PeekAt(i) + clone.Push(cpy) } return clone diff --git a/eth/core/state/journal/logs_test.go b/eth/core/state/journal/logs_test.go index 165fe15ef0..01091bbf9a 100644 --- a/eth/core/state/journal/logs_test.go +++ b/eth/core/state/journal/logs_test.go @@ -42,7 +42,7 @@ var _ = Describe("Logs", func() { BeforeEach(func() { l = utils.MustGetAs[*logs](NewLogs()) l.SetTxContext(thash, int(ti)) - Expect(l.journal.Capacity()).To(Equal(32)) + Expect(l.Capacity()).To(Equal(32)) }) It("should have the correct registry key", func() { @@ -52,21 +52,21 @@ var _ = Describe("Logs", func() { When("adding logs", func() { BeforeEach(func() { l.AddLog(&coretypes.Log{Address: a1}) - Expect(l.journal.Size()).To(Equal(1)) - Expect(l.journal.PeekAt(0).Address).To(Equal(a1)) - Expect(l.journal.PeekAt(0).TxHash).To(Equal(thash)) - Expect(l.journal.PeekAt(0).TxIndex).To(Equal(ti)) + Expect(l.Size()).To(Equal(1)) + Expect(l.PeekAt(0).Address).To(Equal(a1)) + Expect(l.PeekAt(0).TxHash).To(Equal(thash)) + Expect(l.PeekAt(0).TxIndex).To(Equal(ti)) }) It("should correctly snapshot and revert", func() { id := l.Snapshot() l.AddLog(&coretypes.Log{Address: a2}) - Expect(l.journal.Size()).To(Equal(2)) - Expect(l.journal.PeekAt(1).Address).To(Equal(a2)) + Expect(l.Size()).To(Equal(2)) + Expect(l.PeekAt(1).Address).To(Equal(a2)) l.RevertToSnapshot(id) - Expect(l.journal.Size()).To(Equal(1)) + Expect(l.Size()).To(Equal(1)) }) It("should correctly get logs", func() { @@ -88,18 +88,18 @@ var _ = Describe("Logs", func() { It("should correctly clone", func() { l.AddLog(&coretypes.Log{Address: a2}) - Expect(l.journal.Size()).To(Equal(2)) - Expect(l.journal.PeekAt(1).Address).To(Equal(a2)) + Expect(l.Size()).To(Equal(2)) + Expect(l.PeekAt(1).Address).To(Equal(a2)) l2 := utils.MustGetAs[*logs](l.Clone()) - Expect(l2.journal.Size()).To(Equal(2)) - Expect(l2.journal.PeekAt(0).Address).To(Equal(a1)) - Expect(l2.journal.PeekAt(1).Address).To(Equal(a2)) + Expect(l2.Size()).To(Equal(2)) + Expect(l2.PeekAt(0).Address).To(Equal(a1)) + Expect(l2.PeekAt(1).Address).To(Equal(a2)) l2.AddLog(&coretypes.Log{Address: a3}) - Expect(l2.journal.Size()).To(Equal(3)) - Expect(l2.journal.PeekAt(2).Address).To(Equal(a3)) - Expect(l.journal.Size()).To(Equal(2)) + Expect(l2.Size()).To(Equal(3)) + Expect(l2.PeekAt(2).Address).To(Equal(a3)) + Expect(l.Size()).To(Equal(2)) }) }) }) diff --git a/eth/core/state/journal/refund.go b/eth/core/state/journal/refund.go index 31983f3179..47a4d9249b 100644 --- a/eth/core/state/journal/refund.go +++ b/eth/core/state/journal/refund.go @@ -21,8 +21,6 @@ package journal import ( - "pkg.berachain.dev/polaris/lib/ds" - "pkg.berachain.dev/polaris/lib/ds/stack" libtypes "pkg.berachain.dev/polaris/lib/types" ) @@ -42,13 +40,14 @@ type Refund interface { // refund is a `Store` that tracks the refund counter. type refund struct { - ds.Stack[uint64] // journal of historical refunds. + baseJournal[uint64] // journal of historical refunds. + } // NewRefund creates and returns a `refund` journal. func NewRefund() Refund { return &refund{ - Stack: stack.New[uint64](initCapacity), + baseJournal: newBaseJournal[uint64](initCapacity), } } @@ -73,33 +72,17 @@ func (r *refund) SubRefund(gas uint64) { r.Push(r.Peek() - gas) } -// Snapshot returns the current size of the refund counter, which is used to -// revert the refund counter to a previous value. -// -// Snapshot implements `libtypes.Snapshottable`. -func (r *refund) Snapshot() int { - return r.Size() -} - -// RevertToSnapshot reverts the refund counter to the value at the given `snap`. -// -// RevertToSnapshot implements `libtypes.Snapshottable`. -func (r *refund) RevertToSnapshot(id int) { - r.PopToSize(id) -} - // Finalize implements `libtypes.Controllable`. func (r *refund) Finalize() { - r.Stack = stack.New[uint64](initCapacity) + r.baseJournal = newBaseJournal[uint64](initCapacity) } // Clone implements `libtypes.Cloneable`. func (r *refund) Clone() Refund { - size := r.Size() clone := &refund{ - Stack: stack.New[uint64](size), + baseJournal: newBaseJournal[uint64](initCapacity), } - for i := 0; i < size; i++ { + for i := 0; i < r.Size(); i++ { clone.Push(r.PeekAt(i)) } return clone diff --git a/eth/core/state/journal/selfdestruct_test.go b/eth/core/state/journal/selfdestruct_test.go index 564f1ceba6..1f93e9e934 100644 --- a/eth/core/state/journal/selfdestruct_test.go +++ b/eth/core/state/journal/selfdestruct_test.go @@ -66,7 +66,7 @@ var _ = Describe("SelfDestructs", func() { s.Finalize() Expect(s.lastSnapshot).To(Equal(-1)) - Expect(s.journal.Size()).To(Equal(0)) + Expect(s.Size()).To(Equal(0)) }) It("should not suicide when snapshot is not called", func() { diff --git a/eth/core/state/journal/selfdestructs.go b/eth/core/state/journal/selfdestructs.go index 0d3e9d3c30..f96b448a84 100644 --- a/eth/core/state/journal/selfdestructs.go +++ b/eth/core/state/journal/selfdestructs.go @@ -25,8 +25,6 @@ import ( "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/lib/ds" - "pkg.berachain.dev/polaris/lib/ds/stack" libtypes "pkg.berachain.dev/polaris/lib/types" "pkg.berachain.dev/polaris/lib/utils" ) @@ -65,8 +63,8 @@ type SelfDestructs interface { // NOTE: we are only supporting one self destructed address per EVM call (and consequently per snapshot). type selfDestructs struct { // journal of suicide address per call, very rare to suicide so we alloc only 1 address - journal ds.Stack[*common.Address] - ssp selfDestructStatePlugin + baseJournal[*common.Address] + ssp selfDestructStatePlugin // lastSnapshot ensures that only 1 address is being self destructed per snapshot lastSnapshot int } @@ -74,7 +72,7 @@ type selfDestructs struct { // NewSelfDestructs returns a new selfDestructs journal. func NewSelfDestructs(ssp selfDestructStatePlugin) SelfDestructs { return &selfDestructs{ - journal: stack.New[*common.Address](initCapacity), + baseJournal: newBaseJournal[*common.Address](initCapacity), ssp: ssp, lastSnapshot: -1, } @@ -90,7 +88,7 @@ func (s *selfDestructs) RegistryKey() string { // until after Commit is called. func (s *selfDestructs) SelfDestruct(addr common.Address) { // ensure only one suicide per snapshot call - if s.journal.Size() > s.lastSnapshot { + if s.Size() > s.lastSnapshot { // pushed one suicide for this contract call, can do no more return } @@ -105,7 +103,7 @@ func (s *selfDestructs) SelfDestruct(addr common.Address) { s.ssp.SubBalance(addr, s.ssp.GetBalance(addr)) // add to journal. - s.journal.Push(&addr) + s.Push(&addr) } func (s *selfDestructs) Selfdestruct6780(_ common.Address) { @@ -115,8 +113,8 @@ func (s *selfDestructs) Selfdestruct6780(_ common.Address) { // HasSelfDestructed implements the PolarisStateDB interface by returning if the contract was self destructed // in current transaction. func (s *selfDestructs) HasSelfDestructed(addr common.Address) bool { - for i := s.journal.Size() - 1; i >= 0; i-- { - if *s.journal.PeekAt(i) == addr { + for i := s.Size() - 1; i >= 0; i-- { + if *s.PeekAt(i) == addr { return true } } @@ -126,21 +124,15 @@ func (s *selfDestructs) HasSelfDestructed(addr common.Address) bool { // GetSelfDestructs implements state.SelfDestructsJournal. func (s *selfDestructs) GetSelfDestructs() []common.Address { var suicidalAddrs []common.Address - for i := 0; i < s.journal.Size(); i++ { - suicidalAddrs = append(suicidalAddrs, *s.journal.PeekAt(i)) + for i := 0; i < s.Size(); i++ { + suicidalAddrs = append(suicidalAddrs, *s.PeekAt(i)) } return suicidalAddrs } -// Snapshot implements libtypes.Controllable. func (s *selfDestructs) Snapshot() int { - s.lastSnapshot = s.journal.Size() - return s.lastSnapshot -} - -// RevertToSnapshot implements libtypes.Controllable. -func (s *selfDestructs) RevertToSnapshot(id int) { - s.journal.PopToSize(id) + s.lastSnapshot = s.Size() + return s.baseJournal.Snapshot() } // Finalize implements libtypes.Controllable. @@ -150,18 +142,17 @@ func (s *selfDestructs) Finalize() { // Clone implements libtypes.Cloneable. func (s *selfDestructs) Clone() SelfDestructs { - size := s.journal.Size() clone := &selfDestructs{ - journal: stack.New[*common.Address](size), + baseJournal: newBaseJournal[*common.Address](s.Capacity()), ssp: s.ssp, lastSnapshot: s.lastSnapshot, } // copy every address from the journal - for i := 0; i < size; i++ { + for i := 0; i < s.Size(); i++ { cpy := new(common.Address) - *cpy = *s.journal.PeekAt(i) - clone.journal.Push(cpy) + *cpy = *s.PeekAt(i) + clone.Push(cpy) } return clone diff --git a/eth/core/state/journal/transient_storage.go b/eth/core/state/journal/transient_storage.go index 81891da4d9..9d4602100f 100644 --- a/eth/core/state/journal/transient_storage.go +++ b/eth/core/state/journal/transient_storage.go @@ -23,7 +23,6 @@ package journal import ( "github.com/ethereum/go-ethereum/common" - "pkg.berachain.dev/polaris/lib/ds" "pkg.berachain.dev/polaris/lib/ds/stack" libtypes "pkg.berachain.dev/polaris/lib/types" ) @@ -74,13 +73,13 @@ type TransientStorage interface { // `transientStorage` is a journal that tracks the transient state. type transientStorage struct { - ds.Stack[transientState] + baseJournal[transientState] } // `NewTransientStorage` returns a new `transient` journal. func NewTransientStorage() TransientStorage { return &transientStorage{ - stack.New[transientState](initCapacity), + newBaseJournal[transientState](initCapacity), } } @@ -105,16 +104,6 @@ func (t *transientStorage) GetTransientState(addr common.Address, key common.Has return t.Peek().Get(addr, key) } -// `Snapshot` implements `libtypes.Snapshottable`. -func (t *transientStorage) Snapshot() int { - return t.Size() -} - -// `RevertToSnapshot` implements `libtypes.Snapshottable`. -func (t *transientStorage) RevertToSnapshot(id int) { - t.PopToSize(id) -} - // `Finalize` implements `libtypes.Controllable`. func (t *transientStorage) Finalize() { t.Stack = stack.New[transientState](initCapacity) @@ -124,7 +113,7 @@ func (t *transientStorage) Finalize() { func (t *transientStorage) Clone() TransientStorage { size := t.Size() clone := &transientStorage{ - stack.New[transientState](size), + newBaseJournal[transientState](initCapacity), } // copy every individual transient state From 6a92c39697141c67d335740469a14be533c1c614 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 22 Sep 2023 16:17:32 -0400 Subject: [PATCH 028/122] fix(tstore): journal size --- eth/core/state/journal/transient_storage.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/eth/core/state/journal/transient_storage.go b/eth/core/state/journal/transient_storage.go index 9d4602100f..e7554b10e6 100644 --- a/eth/core/state/journal/transient_storage.go +++ b/eth/core/state/journal/transient_storage.go @@ -111,13 +111,12 @@ func (t *transientStorage) Finalize() { // Clone implements `libtypes.Cloneable`. func (t *transientStorage) Clone() TransientStorage { - size := t.Size() clone := &transientStorage{ - newBaseJournal[transientState](initCapacity), + newBaseJournal[transientState](t.Capacity()), } // copy every individual transient state - for i := 0; i < size; i++ { + for i := 0; i < t.Size(); i++ { clone.Push(t.PeekAt(i).Copy()) } From 15c1356ac65114992035d10f3f01c8a9058b1d4b Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sun, 24 Sep 2023 12:28:03 -0400 Subject: [PATCH 029/122] fix(precompile): Fix regression where `eth_call` can cause non-deterministic gas consumption (#1136) --- cosmos/x/evm/keeper/host.go | 9 ++-- cosmos/x/evm/plugins/base.go | 4 -- cosmos/x/evm/plugins/block/plugin.go | 1 - cosmos/x/evm/plugins/configuration/plugin.go | 1 - cosmos/x/evm/plugins/engine/plugin.go | 2 - cosmos/x/evm/plugins/gas/plugin.go | 2 - cosmos/x/evm/plugins/historical/plugin.go | 1 - cosmos/x/evm/plugins/precompile/plugin.go | 52 +++++++------------ .../x/evm/plugins/precompile/plugin_test.go | 33 +++--------- cosmos/x/evm/plugins/state/plugin.go | 3 -- cosmos/x/evm/plugins/txpool/plugin.go | 2 - eth/core/precompile/default_plugin.go | 6 +++ eth/core/state/statedb.go | 9 ++++ 13 files changed, 45 insertions(+), 80 deletions(-) diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index a1a171f7d5..e99590d692 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -26,7 +26,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/configuration" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" @@ -49,7 +48,7 @@ var _ core.PolarisHostChain = (*host)(nil) // It includes core.PolarisHostChain and functions that are called in other packages. type Host interface { core.PolarisHostChain - GetAllPlugins() []plugins.Base + GetAllPlugins() []any Setup( storetypes.StoreKey, storetypes.StoreKey, @@ -103,7 +102,7 @@ func (h *host) Setup( ) { // Setup the state, precompile, historical, and txpool plugins h.sp = state.NewPlugin(ak, storeKey, log.NewFactory(h.pcs().GetPrecompiles())) - h.pp = precompile.NewPlugin(h.pcs().GetPrecompiles(), h.sp) + h.pp = precompile.NewPlugin(h.pcs().GetPrecompiles()) // TODO: re-enable historical plugin using ABCI listener. h.hp = historical.NewPlugin(h.cp, h.bp, nil, storeKey) h.txp.SetNonceRetriever(h.sp) @@ -153,6 +152,6 @@ func (h *host) GetTxPoolPlugin() core.TxPoolPlugin { } // GetAllPlugins returns all the plugins. -func (h *host) GetAllPlugins() []plugins.Base { - return []plugins.Base{h.bp, h.cp, h.gp, h.hp, h.pp, h.sp, h.txp} +func (h *host) GetAllPlugins() []any { + return []any{h.bp, h.cp, h.gp, h.hp, h.pp, h.sp, h.txp} } diff --git a/cosmos/x/evm/plugins/base.go b/cosmos/x/evm/plugins/base.go index a88eadf765..61898231f6 100644 --- a/cosmos/x/evm/plugins/base.go +++ b/cosmos/x/evm/plugins/base.go @@ -26,10 +26,6 @@ import ( "pkg.berachain.dev/polaris/eth/core" ) -// Base is the base interface which all x/evm Polaris plugins must implement - -type Base interface{} - // HasGenesis represents the base class that all x/evm Polaris plugins which have // InitGenesis or ExportGenesis methods must implement diff --git a/cosmos/x/evm/plugins/block/plugin.go b/cosmos/x/evm/plugins/block/plugin.go index 415939f1a7..7c3dc733aa 100644 --- a/cosmos/x/evm/plugins/block/plugin.go +++ b/cosmos/x/evm/plugins/block/plugin.go @@ -35,7 +35,6 @@ import ( ) type Plugin interface { - plugins.Base plugins.HasGenesis core.BlockPlugin diff --git a/cosmos/x/evm/plugins/configuration/plugin.go b/cosmos/x/evm/plugins/configuration/plugin.go index 3110e8f9ac..ad44908d7d 100644 --- a/cosmos/x/evm/plugins/configuration/plugin.go +++ b/cosmos/x/evm/plugins/configuration/plugin.go @@ -36,7 +36,6 @@ import ( // Plugin is the interface that must be implemented by the plugin. type Plugin interface { - plugins.Base plugins.HasGenesis core.ConfigurationPlugin SetChainConfig(*params.ChainConfig) diff --git a/cosmos/x/evm/plugins/engine/plugin.go b/cosmos/x/evm/plugins/engine/plugin.go index ddfa912d9e..0b5afac1ee 100644 --- a/cosmos/x/evm/plugins/engine/plugin.go +++ b/cosmos/x/evm/plugins/engine/plugin.go @@ -23,7 +23,6 @@ package engine import ( "github.com/cosmos/cosmos-sdk/client" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/eth/core" ) @@ -32,7 +31,6 @@ var _ Plugin = (*plugin)(nil) // Plugin defines the required functions of the transaction pool plugin. type Plugin interface { - plugins.Base core.EnginePlugin Start(client.Context) } diff --git a/cosmos/x/evm/plugins/gas/plugin.go b/cosmos/x/evm/plugins/gas/plugin.go index dfe453e342..018a0b11d0 100644 --- a/cosmos/x/evm/plugins/gas/plugin.go +++ b/cosmos/x/evm/plugins/gas/plugin.go @@ -28,7 +28,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/vm" ) @@ -38,7 +37,6 @@ const gasMeterDescriptor = `polaris-gas-plugin` // Plugin is the interface that must be implemented by the plugin. type Plugin interface { - plugins.Base core.GasPlugin } diff --git a/cosmos/x/evm/plugins/historical/plugin.go b/cosmos/x/evm/plugins/historical/plugin.go index eb19e21b65..dd01daab29 100644 --- a/cosmos/x/evm/plugins/historical/plugin.go +++ b/cosmos/x/evm/plugins/historical/plugin.go @@ -33,7 +33,6 @@ import ( // Plugin is the interface that must be implemented by the plugin. type Plugin interface { - plugins.Base core.HistoricalPlugin plugins.HasGenesis } diff --git a/cosmos/x/evm/plugins/precompile/plugin.go b/cosmos/x/evm/plugins/precompile/plugin.go index 8f0aeaed89..de506e76e3 100644 --- a/cosmos/x/evm/plugins/precompile/plugin.go +++ b/cosmos/x/evm/plugins/precompile/plugin.go @@ -27,11 +27,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" + ethstate "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/params" "pkg.berachain.dev/polaris/lib/registry" @@ -41,13 +41,14 @@ import ( // Plugin is the interface that must be implemented by the plugin. type Plugin interface { - plugins.Base core.PrecompilePlugin +} - KVGasConfig() storetypes.GasConfig - SetKVGasConfig(storetypes.GasConfig) - TransientKVGasConfig() storetypes.GasConfig - SetTransientKVGasConfig(storetypes.GasConfig) +// polarisStateDB is the interface that must be implemented by the state DB. +// The stateDB must allow retrieving the plugin in order to set it's gas config. +type polarisStateDB interface { + // GetPlugin retrieves the underlying state plugin from the StateDB. + GetPlugin() ethstate.Plugin } // plugin runs precompile containers in the Cosmos environment with the context gas configs. @@ -59,18 +60,17 @@ type plugin struct { kvGasConfig storetypes.GasConfig // transientKVGasConfig is the gas config for the transient KV store. transientKVGasConfig storetypes.GasConfig - // sp allows resetting the context for the reentrancy into the EVM. - sp StatePlugin } // NewPlugin creates and returns a plugin with the default KV store gas configs. -func NewPlugin(precompiles []ethprecompile.Registrable, sp StatePlugin) Plugin { +func NewPlugin(precompiles []ethprecompile.Registrable) Plugin { return &plugin{ - Registry: registry.NewMap[common.Address, vm.PrecompileContainer](), - precompiles: precompiles, + Registry: registry.NewMap[common.Address, vm.PrecompileContainer](), + precompiles: precompiles, + // NOTE: these are hardcoded as they are also hardcoded in the sdk. + // This should be updated if it ever changes. kvGasConfig: storetypes.KVGasConfig(), transientKVGasConfig: storetypes.TransientGasConfig(), - sp: sp, } } @@ -92,26 +92,6 @@ func (p *plugin) GetActive(rules *params.Rules) []common.Address { return active } -// KVGasConfig implements Plugin. -func (p *plugin) KVGasConfig() storetypes.GasConfig { - return p.kvGasConfig -} - -// SetKVGasConfig implements Plugin. -func (p *plugin) SetKVGasConfig(kvGasConfig storetypes.GasConfig) { - p.kvGasConfig = kvGasConfig -} - -// TransientKVGasConfig implements Plugin. -func (p *plugin) TransientKVGasConfig() storetypes.GasConfig { - return p.transientKVGasConfig -} - -// SetTransientKVGasConfig implements Plugin. -func (p *plugin) SetTransientKVGasConfig(transientKVGasConfig storetypes.GasConfig) { - p.transientKVGasConfig = transientKVGasConfig -} - // Run runs the a precompile container and returns the remaining gas after execution by injecting // a Cosmos SDK `GasMeter`. This function returns an error if the precompile execution returns an // error or insufficient gas is provided. @@ -187,7 +167,9 @@ func (p *plugin) enableReentrancy(sdb vm.PolarisStateDB) { cem.EndPrecompileExecution() // remove Cosmos gas consumption so gas is consumed only per OPCODE - p.sp.SetGasConfig(storetypes.GasConfig{}, storetypes.GasConfig{}) + utils.MustGetAs[state.Plugin]( + utils.MustGetAs[polarisStateDB](sdb).GetPlugin(), + ).SetGasConfig(storetypes.GasConfig{}, storetypes.GasConfig{}) } // DisableReentrancy sets the state so that execution cannot enter the EVM again. @@ -205,5 +187,7 @@ func (p *plugin) disableReentrancy(sdb vm.PolarisStateDB) { cem.BeginPrecompileExecution(sdb) // restore ctx gas configs for continuing precompile execution - p.sp.SetGasConfig(p.kvGasConfig, p.transientKVGasConfig) + utils.MustGetAs[state.Plugin]( + utils.MustGetAs[polarisStateDB](sdb).GetPlugin(), + ).SetGasConfig(p.kvGasConfig, p.transientKVGasConfig) } diff --git a/cosmos/x/evm/plugins/precompile/plugin_test.go b/cosmos/x/evm/plugins/precompile/plugin_test.go index 61903f9a6f..cf453e2263 100644 --- a/cosmos/x/evm/plugins/precompile/plugin_test.go +++ b/cosmos/x/evm/plugins/precompile/plugin_test.go @@ -35,6 +35,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events/mock" "pkg.berachain.dev/polaris/eth/common" + ethstate "pkg.berachain.dev/polaris/eth/core/state" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/lib/utils" @@ -53,7 +54,7 @@ var _ = Describe("plugin", func() { ctx = ctx.WithEventManager( events.NewManagerFrom(ctx.EventManager(), mock.NewPrecompileLogFactory()), ) - p = utils.MustGetAs[*plugin](NewPlugin(nil, &mockSP{ctx})) + p = utils.MustGetAs[*plugin](NewPlugin(nil)) e = &mockEVM{nil, ctx, &mockSDB{nil, ctx, 0}} }) @@ -68,20 +69,6 @@ var _ = Describe("plugin", func() { Expect(err).To(MatchError("out of gas")) }) - It("should plug in custom gas configs", func() { - Expect(p.KVGasConfig().DeleteCost).To(Equal(uint64(1000))) - Expect(p.TransientKVGasConfig().DeleteCost).To(Equal(uint64(100))) - - p.SetKVGasConfig(storetypes.GasConfig{ - DeleteCost: 2, - }) - Expect(p.KVGasConfig().DeleteCost).To(Equal(uint64(2))) - p.SetTransientKVGasConfig(storetypes.GasConfig{ - DeleteCost: 3, - }) - Expect(p.TransientKVGasConfig().DeleteCost).To(Equal(uint64(3))) - }) - It("should handle read-only static calls", func() { ms := utils.MustGetAs[tmock.MultiStore](ctx.MultiStore()) cem := utils.MustGetAs[state.ControllableEventManager](ctx.EventManager()) @@ -123,16 +110,6 @@ var ( addr2 = common.BytesToAddress([]byte{2}) ) -// MOCKS BELOW. - -type mockSP struct { - ctx sdk.Context -} - -func (msp *mockSP) SetGasConfig(kvg storetypes.GasConfig, tkvg storetypes.GasConfig) { - msp.ctx = msp.ctx.WithKVGasConfig(kvg).WithTransientKVGasConfig(tkvg) -} - type mockEVM struct { vm.PrecompileEVM ctx sdk.Context @@ -149,6 +126,12 @@ type mockSDB struct { logs int } +func (ms *mockSDB) GetPlugin() ethstate.Plugin { + return state.NewPlugin( + nil, nil, nil, + ) +} + func (ms *mockSDB) GetContext() context.Context { return ms.ctx } diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index af3ac8573e..aa298bbc25 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -53,7 +53,6 @@ var ( // Plugin is the interface that must be implemented by the plugin. type Plugin interface { - plugins.Base plugins.HasGenesis core.StatePlugin // SetQueryContextFn sets the query context func for the plugin. @@ -544,5 +543,3 @@ func (p *plugin) Clone() ethstate.Plugin { func (p *plugin) SetGasConfig(kvGasConfig, transientKVGasConfig storetypes.GasConfig) { p.ctx = p.ctx.WithKVGasConfig(kvGasConfig).WithTransientKVGasConfig(transientKVGasConfig) } - -// IsPlugin implements plugins.Base. diff --git a/cosmos/x/evm/plugins/txpool/plugin.go b/cosmos/x/evm/plugins/txpool/plugin.go index fd9e9e75b4..3661cf7948 100644 --- a/cosmos/x/evm/plugins/txpool/plugin.go +++ b/cosmos/x/evm/plugins/txpool/plugin.go @@ -29,7 +29,6 @@ import ( "github.com/ethereum/go-ethereum/event" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" mempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" @@ -41,7 +40,6 @@ var _ Plugin = (*plugin)(nil) // Plugin defines the required functions of the transaction pool plugin. type Plugin interface { - plugins.Base core.TxPoolPlugin SetNonceRetriever(mempool.NonceRetriever) SetClientContext(client.Context) diff --git a/eth/core/precompile/default_plugin.go b/eth/core/precompile/default_plugin.go index 1702d88ff8..23925b7d47 100644 --- a/eth/core/precompile/default_plugin.go +++ b/eth/core/precompile/default_plugin.go @@ -45,6 +45,12 @@ func NewDefaultPlugin() Plugin { } } +// Register is a no-op for the default plugin. +func (dp *defaultPlugin) Register(vm.PrecompileContainer) error { + // no-op + return nil +} + // GetPrecompiles implements core.PrecompilePlugin. func (dp *defaultPlugin) GetPrecompiles(rules *params.Rules) []Registrable { return GetDefaultPrecompiles(rules) diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index 0ab9d3077b..b6d3b8c81f 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -81,6 +81,15 @@ func newStateDBWithJournals( } } +// ============================================================================= +// Plugin +// ============================================================================= + +// GetPlugin returns the plugin from statedb. +func (sdb *stateDB) GetPlugin() Plugin { + return sdb.Plugin +} + // ============================================================================= // Snapshot // ============================================================================= From 326426fa61f6424d809a933ea287e46967e04b80 Mon Sep 17 00:00:00 2001 From: Taeguk Kwon Date: Mon, 25 Sep 2023 23:23:47 +0900 Subject: [PATCH 030/122] fix(evm): missing things when init or export genesis (#1129) Co-authored-by: steve806 --- cosmos/x/evm/plugins/state/genesis.go | 21 +++++++++++++++++++++ cosmos/x/evm/plugins/state/plugin.go | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/cosmos/x/evm/plugins/state/genesis.go b/cosmos/x/evm/plugins/state/genesis.go index b456587eb0..66720f9e3d 100644 --- a/cosmos/x/evm/plugins/state/genesis.go +++ b/cosmos/x/evm/plugins/state/genesis.go @@ -48,6 +48,9 @@ func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { p.SetState(address, k, v) } } + if account.Nonce != 0 { + p.SetNonce(address, account.Nonce) + } } p.Finalize() } @@ -68,6 +71,7 @@ func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { account.Storage = make(map[common.Hash]common.Hash) } account.Balance = p.GetBalance(address) + account.Nonce = p.GetNonce(address) ethGen.Alloc[address] = account return false }) @@ -85,6 +89,23 @@ func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { account.Code = p.GetCode(address) account.Balance = p.GetBalance(address) + account.Nonce = p.GetNonce(address) + ethGen.Alloc[address] = account + + return false + }) + + // Iterate Code and set the genesis accounts. + p.IterateCode(func(address common.Address, codeHash common.Hash) bool { + account, ok := ethGen.Alloc[address] + if !ok { + account = core.GenesisAccount{} + } + account.Code = p.GetCode(address) + account.Nonce = p.GetNonce(address) + if account.Balance == nil { + account.Balance = big.NewInt(0) + } ethGen.Alloc[address] = account return false diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index aa298bbc25..bf6504c8f7 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -362,6 +362,27 @@ func (p *plugin) SetCode(addr common.Address, code []byte) { } } +// IterateCode iterates over all the contract code, and calls the given function. +func (p *plugin) IterateCode(fn func(addr common.Address, value common.Hash) bool) { + it := storetypes.KVStorePrefixIterator( + p.cms.GetKVStore(p.storeKey), + []byte{types.CodeHashKeyPrefix}, + ) + defer func() { + if err := it.Close(); err != nil { + p.savedErr = err + } + }() + + for ; it.Valid(); it.Next() { + k := it.Key() + addr := AddressFromCodeHashKey(k) + if fn(addr, p.GetCodeHash(addr)) { + break + } + } +} + // ============================================================================= // Storage // ============================================================================= From bc3604030bf4afb3149433f257006fceb3533f8f Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 25 Sep 2023 10:43:12 -0400 Subject: [PATCH 031/122] Revert "fix(evm): missing things when init or export genesis (#1129)" This reverts commit 326426fa61f6424d809a933ea287e46967e04b80. --- cosmos/x/evm/plugins/state/genesis.go | 21 --------------------- cosmos/x/evm/plugins/state/plugin.go | 21 --------------------- 2 files changed, 42 deletions(-) diff --git a/cosmos/x/evm/plugins/state/genesis.go b/cosmos/x/evm/plugins/state/genesis.go index 66720f9e3d..b456587eb0 100644 --- a/cosmos/x/evm/plugins/state/genesis.go +++ b/cosmos/x/evm/plugins/state/genesis.go @@ -48,9 +48,6 @@ func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { p.SetState(address, k, v) } } - if account.Nonce != 0 { - p.SetNonce(address, account.Nonce) - } } p.Finalize() } @@ -71,7 +68,6 @@ func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { account.Storage = make(map[common.Hash]common.Hash) } account.Balance = p.GetBalance(address) - account.Nonce = p.GetNonce(address) ethGen.Alloc[address] = account return false }) @@ -89,23 +85,6 @@ func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { account.Code = p.GetCode(address) account.Balance = p.GetBalance(address) - account.Nonce = p.GetNonce(address) - ethGen.Alloc[address] = account - - return false - }) - - // Iterate Code and set the genesis accounts. - p.IterateCode(func(address common.Address, codeHash common.Hash) bool { - account, ok := ethGen.Alloc[address] - if !ok { - account = core.GenesisAccount{} - } - account.Code = p.GetCode(address) - account.Nonce = p.GetNonce(address) - if account.Balance == nil { - account.Balance = big.NewInt(0) - } ethGen.Alloc[address] = account return false diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index bf6504c8f7..aa298bbc25 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -362,27 +362,6 @@ func (p *plugin) SetCode(addr common.Address, code []byte) { } } -// IterateCode iterates over all the contract code, and calls the given function. -func (p *plugin) IterateCode(fn func(addr common.Address, value common.Hash) bool) { - it := storetypes.KVStorePrefixIterator( - p.cms.GetKVStore(p.storeKey), - []byte{types.CodeHashKeyPrefix}, - ) - defer func() { - if err := it.Close(); err != nil { - p.savedErr = err - } - }() - - for ; it.Valid(); it.Next() { - k := it.Key() - addr := AddressFromCodeHashKey(k) - if fn(addr, p.GetCodeHash(addr)) { - break - } - } -} - // ============================================================================= // Storage // ============================================================================= From 11c57943e2f7f715cd7774e3360f78e8b1ded902 Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Mon, 25 Sep 2023 11:29:58 -0400 Subject: [PATCH 032/122] fix(evm): revive #1129 (missing things when init or export genesis) (#1138) --- cosmos/x/evm/plugins/state/genesis.go | 21 +++++++++++++++++++ cosmos/x/evm/plugins/state/plugin.go | 21 +++++++++++++++++++ .../get-account-proof-with-storage.io | 2 +- .../tests/eth_getProof/get-account-proof.io | 2 +- .../get-account-nonce.io | 2 +- eth/common/imported.go | 1 + 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/cosmos/x/evm/plugins/state/genesis.go b/cosmos/x/evm/plugins/state/genesis.go index b456587eb0..66720f9e3d 100644 --- a/cosmos/x/evm/plugins/state/genesis.go +++ b/cosmos/x/evm/plugins/state/genesis.go @@ -48,6 +48,9 @@ func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { p.SetState(address, k, v) } } + if account.Nonce != 0 { + p.SetNonce(address, account.Nonce) + } } p.Finalize() } @@ -68,6 +71,7 @@ func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { account.Storage = make(map[common.Hash]common.Hash) } account.Balance = p.GetBalance(address) + account.Nonce = p.GetNonce(address) ethGen.Alloc[address] = account return false }) @@ -85,6 +89,23 @@ func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { account.Code = p.GetCode(address) account.Balance = p.GetBalance(address) + account.Nonce = p.GetNonce(address) + ethGen.Alloc[address] = account + + return false + }) + + // Iterate Code and set the genesis accounts. + p.IterateCode(func(address common.Address, codeHash common.Hash) bool { + account, ok := ethGen.Alloc[address] + if !ok { + account = core.GenesisAccount{} + } + account.Code = p.GetCode(address) + account.Nonce = p.GetNonce(address) + if account.Balance == nil { + account.Balance = big.NewInt(0) + } ethGen.Alloc[address] = account return false diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index aa298bbc25..bf6504c8f7 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -362,6 +362,27 @@ func (p *plugin) SetCode(addr common.Address, code []byte) { } } +// IterateCode iterates over all the contract code, and calls the given function. +func (p *plugin) IterateCode(fn func(addr common.Address, value common.Hash) bool) { + it := storetypes.KVStorePrefixIterator( + p.cms.GetKVStore(p.storeKey), + []byte{types.CodeHashKeyPrefix}, + ) + defer func() { + if err := it.Close(); err != nil { + p.savedErr = err + } + }() + + for ; it.Valid(); it.Next() { + k := it.Key() + addr := AddressFromCodeHashKey(k) + if fn(addr, p.GetCodeHash(addr)) { + break + } + } +} + // ============================================================================= // Storage // ============================================================================= diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io b/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io index d051ce621a..3dd98c33fa 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof-with-storage.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_getProof","params":["0xaa00000000000000000000000000000000000000",["0x1"],"0x3"]} -<< {"jsonrpc":"2.0","id":1,"result":{"address":"0xaa00000000000000000000000000000000000000","accountProof":[],"balance":"0x1","codeHash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","nonce":"0x0","storageHash":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","storageProof":[{"key":"0x1","value":"0x0","proof":[]}]}} +<< {"jsonrpc":"2.0","id":1,"result":{"address":"0xaa00000000000000000000000000000000000000","accountProof":[],"balance":"0x1","codeHash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","nonce":"0x1","storageHash":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","storageProof":[{"key":"0x1","value":"0x0","proof":[]}]}} diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof.io b/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof.io index 7bf3353adf..295782b898 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getProof/get-account-proof.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_getProof","params":["0xaa00000000000000000000000000000000000000",[],"0x3"]} -<< {"jsonrpc":"2.0","id":1,"result":{"address":"0xaa00000000000000000000000000000000000000","accountProof":[],"balance":"0x1","codeHash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","nonce":"0x0","storageHash":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","storageProof":[]}} +<< {"jsonrpc":"2.0","id":1,"result":{"address":"0xaa00000000000000000000000000000000000000","accountProof":[],"balance":"0x1","codeHash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","nonce":"0x1","storageHash":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","storageProof":[]}} diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getTransactionCount/get-account-nonce.io b/e2e/hive/simulators/rpc-compat/tests/eth_getTransactionCount/get-account-nonce.io index 956051ede5..4edec43e90 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_getTransactionCount/get-account-nonce.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getTransactionCount/get-account-nonce.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_getTransactionCount","params":["0xaa00000000000000000000000000000000000000","latest"]} -<< {"jsonrpc":"2.0","id":1,"result":"0x0"} +<< {"jsonrpc":"2.0","id":1,"result":"0x1"} diff --git a/eth/common/imported.go b/eth/common/imported.go index f9b01534cc..a1904ac3e1 100644 --- a/eth/common/imported.go +++ b/eth/common/imported.go @@ -39,6 +39,7 @@ var ( Bytes2Hex = common.Bytes2Hex FromHex = common.FromHex HexToAddress = common.HexToAddress + IsHexAddress = common.IsHexAddress Hex2Bytes = common.Hex2Bytes HexToHash = common.HexToHash LeftPadBytes = common.LeftPadBytes From 705d983b921a8e569faed1fe2c67d8b95e6337d7 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 25 Sep 2023 11:30:28 -0400 Subject: [PATCH 033/122] chore(cleanup): General cleanup (#1137) --- cosmos/go.mod | 10 +- cosmos/go.sum | 16 +- cosmos/precompile/bank/bank_test.go | 25 +- .../precompile/governance/governance_test.go | 5 +- .../{testutil => governance}/testutil.go | 11 +- cosmos/x/evm/plugins/configuration/plugin.go | 9 - .../evm/plugins/configuration/plugin_test.go | 25 -- .../x/evm/plugins/configuration/store_test.go | 72 +++-- cosmos/x/evm/plugins/historical/plugin.go | 3 - e2e/localnet/go.mod | 2 +- e2e/localnet/go.sum | 4 +- e2e/precompile/go.mod | 2 +- e2e/precompile/go.sum | 4 +- e2e/testapp/go.mod | 10 +- e2e/testapp/go.sum | 20 +- e2e/testapp/polard/cmd/root.go | 1 - go.work.sum | 270 ++++++++++++++++++ 17 files changed, 388 insertions(+), 101 deletions(-) rename cosmos/precompile/{testutil => governance}/testutil.go (93%) diff --git a/cosmos/go.mod b/cosmos/go.mod index 6704897997..9fe4a6b4c5 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -24,7 +24,7 @@ require ( github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.13.1 @@ -37,14 +37,14 @@ require ( github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 // indirect - github.com/tidwall/btree v1.7.0 + github.com/tidwall/btree v1.7.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect google.golang.org/grpc v1.58.1 google.golang.org/protobuf v1.31.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 + pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 + pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6 ) require github.com/spf13/cast v1.5.1 diff --git a/cosmos/go.sum b/cosmos/go.sum index 22014cd2fd..74e176068d 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -233,8 +233,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -1492,12 +1492,12 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 h1:U5wpPv/ZitKJCZkHWVsWOzAfX3orlnHHhn5rYGJ1DPA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 h1:0dIN2V+giVZmUOPvDyOxnXfTgZIoBOqjZTpXn704edY= +pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6/go.mod h1:XDIlhb6eOL2Rq81b0OPzke5IFQyqgbD7f60NRomcmXc= +pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6 h1:ZvjvAvaPEZr+Og4GABn1AGM7RPD6lIW12j3qouVDFvI= +pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/cosmos/precompile/bank/bank_test.go b/cosmos/precompile/bank/bank_test.go index 4cf119a367..564dbbe833 100644 --- a/cosmos/precompile/bank/bank_test.go +++ b/cosmos/precompile/bank/bank_test.go @@ -37,7 +37,6 @@ import ( generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" "pkg.berachain.dev/polaris/cosmos/precompile" "pkg.berachain.dev/polaris/cosmos/precompile/bank" - "pkg.berachain.dev/polaris/cosmos/precompile/testutil" testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" @@ -481,7 +480,7 @@ var _ = Describe("Bank Precompile Test", func() { _, err = contract.Send( pCtx, common.BytesToAddress(toAcc), - testutil.SdkCoinsToEvmCoins(sortedSdkCoins), + sdkCoinsToEvmCoins(sortedSdkCoins), ) Expect(err).ToNot(HaveOccurred()) @@ -513,7 +512,7 @@ var _ = Describe("Bank Precompile Test", func() { _, err = contract.Send( ctx, common.BytesToAddress(toAcc), - testutil.SdkCoinsToEvmCoins(coinsToSend), + sdkCoinsToEvmCoins(coinsToSend), ) Expect(err).To(MatchError(precompile.ErrInvalidCoin)) }) @@ -556,3 +555,23 @@ func getTestMetadata() []banktypes.Metadata { }, } } + +func sdkCoinsToEvmCoins(sdkCoins sdk.Coins) []struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` +} { + evmCoins := make([]struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` + }, len(sdkCoins)) + for i, coin := range sdkCoins { + evmCoins[i] = struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` + }{ + Amount: coin.Amount.BigInt(), + Denom: coin.Denom, + } + } + return evmCoins +} diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 69130519c2..3c322641c4 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -41,7 +41,6 @@ import ( cbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" - "pkg.berachain.dev/polaris/cosmos/precompile/testutil" testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/types" "pkg.berachain.dev/polaris/eth/common" @@ -72,11 +71,11 @@ var _ = Describe("Governance Precompile", func() { ) BeforeEach(func() { - t := testutil.GinkgoTestReporter{} + t := ginkgoTestReporter{} mockCtrl = gomock.NewController(t) types.SetupCosmosConfig() caller = testutils.Alice.Bytes() - sdkCtx, ak, bk, gk = testutil.Setup(mockCtrl, caller) + sdkCtx, ak, bk, gk = setupGovTest(mockCtrl, caller) contract = utils.MustGetAs[*Contract](NewPrecompileContract( ak, governancekeeper.NewMsgServerImpl(gk), diff --git a/cosmos/precompile/testutil/testutil.go b/cosmos/precompile/governance/testutil.go similarity index 93% rename from cosmos/precompile/testutil/testutil.go rename to cosmos/precompile/governance/testutil.go index a59ce1bf68..120c9741f2 100644 --- a/cosmos/precompile/testutil/testutil.go +++ b/cosmos/precompile/governance/testutil.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package testutil +package governance import ( "fmt" @@ -51,18 +51,19 @@ import ( ) // Test Reporter to use governance module tests with Ginkgo. -type GinkgoTestReporter struct{} +type ginkgoTestReporter struct{} -func (g GinkgoTestReporter) Errorf(format string, args ...interface{}) { +func (g ginkgoTestReporter) Errorf(format string, args ...interface{}) { Fail(fmt.Sprintf(format, args...)) } -func (g GinkgoTestReporter) Fatalf(format string, args ...interface{}) { +func (g ginkgoTestReporter) Fatalf(format string, args ...interface{}) { Fail(fmt.Sprintf(format, args...)) } // Helper functions for setting up the tests. -func Setup(ctrl *gomock.Controller, caller sdk.AccAddress) ( +// TODO: deprecate this garbage. +func setupGovTest(ctrl *gomock.Controller, caller sdk.AccAddress) ( sdk.Context, authkeeper.AccountKeeperI, bankkeeper.Keeper, *governancekeeper.Keeper, ) { // Setup the keepers and context. diff --git a/cosmos/x/evm/plugins/configuration/plugin.go b/cosmos/x/evm/plugins/configuration/plugin.go index ad44908d7d..1f93dad1cc 100644 --- a/cosmos/x/evm/plugins/configuration/plugin.go +++ b/cosmos/x/evm/plugins/configuration/plugin.go @@ -26,10 +26,8 @@ import ( storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" - "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/params" ) @@ -59,10 +57,3 @@ func (p *plugin) Prepare(ctx context.Context) { sCtx := sdk.UnwrapSDKContext(ctx) p.paramsStore = sCtx.KVStore(p.storeKey) } - -// FeeCollector implements the core.ConfigurationPlugin interface. -func (p *plugin) FeeCollector() *common.Address { - // TODO: parameterize fee collector name. - addr := common.BytesToAddress([]byte(authtypes.FeeCollectorName)) - return &addr -} diff --git a/cosmos/x/evm/plugins/configuration/plugin_test.go b/cosmos/x/evm/plugins/configuration/plugin_test.go index 7336f74a3e..2aea759934 100644 --- a/cosmos/x/evm/plugins/configuration/plugin_test.go +++ b/cosmos/x/evm/plugins/configuration/plugin_test.go @@ -49,34 +49,9 @@ var _ = Describe("Plugin", func() { Describe("Prepare", func() { It("should initialize the params store", func() { p.Prepare(ctx) - // Check that the params store is initialized. expect := ctx.KVStore(p.storeKey) Expect(p.paramsStore).To(Equal(expect)) }) }) - - Describe("ChainConfig", func() { - Context("when the params store is empty", func() { - It("should return nil", func() { - config := p.ChainConfig() - Expect(config).To(BeNil()) - }) - }) - - Context("when the params store contains valid params", func() { - // It("should return the chain config", func() { - // storedParams := types.Params{ - // EvmDenom: "eth", - // ExtraEIPs: []int64{123}, - // } - // bz, err := storedParams.Marshal() - // Expect(err).ToNot(HaveOccurred()) - // p.paramsStore.Set([]byte{types.ParamsKey}, bz) - - // config := p.ChainConfig() - // Expect(config).To(Equal(params.DefaultChainConfig)) - // }) - }) - }) }) diff --git a/cosmos/x/evm/plugins/configuration/store_test.go b/cosmos/x/evm/plugins/configuration/store_test.go index 38da1de252..5b42c7b687 100644 --- a/cosmos/x/evm/plugins/configuration/store_test.go +++ b/cosmos/x/evm/plugins/configuration/store_test.go @@ -20,21 +20,57 @@ package configuration -// . "github.com/onsi/ginkgo/v2" -// . "github.com/onsi/gomega" - -// var _ = Describe("Plugin", func() { -// var ( -// // p *plugin -// // ctx sdk.Context -// ) - -// BeforeEach(func() { -// // ctx = testutil.NewContext() -// // storeKey := storetypes.NewKVStoreKey("evm") -// // // p = &plugin{ -// // storeKey: storeKey, -// // paramsStore: ctx.KVStore(storeKey), -// // } -// }) -// }) +import ( + storetypes "cosmossdk.io/store/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + + testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + "pkg.berachain.dev/polaris/eth/params" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Plugin", func() { + var ( + p *plugin + ctx sdk.Context + ) + + BeforeEach(func() { + ctx = testutil.NewContext() + storeKey := storetypes.NewKVStoreKey("evm") + p = &plugin{ + storeKey: storeKey, + paramsStore: ctx.KVStore(storeKey), + } + }) + + Describe("Prepare", func() { + It("should initialize the params store", func() { + p.Prepare(ctx) + + // Check that the params store is initialized. + expect := ctx.KVStore(p.storeKey) + Expect(p.paramsStore).To(Equal(expect)) + }) + }) + + Describe("ChainConfig", func() { + Context("when the params store is empty", func() { + It("should return nil", func() { + config := p.ChainConfig() + Expect(config).To(BeNil()) + }) + }) + + Context("when the params store contains valid params", func() { + It("should return the chain config", func() { + p.SetChainConfig(params.DefaultChainConfig) + config := p.ChainConfig() + Expect(config).To(Equal(params.DefaultChainConfig)) + }) + }) + }) +}) diff --git a/cosmos/x/evm/plugins/historical/plugin.go b/cosmos/x/evm/plugins/historical/plugin.go index dd01daab29..fdc32e26b8 100644 --- a/cosmos/x/evm/plugins/historical/plugin.go +++ b/cosmos/x/evm/plugins/historical/plugin.go @@ -47,9 +47,6 @@ type plugin struct { bp core.BlockPlugin // storekey is the store key for the header store. storeKey storetypes.StoreKey - // TODO: reenable offchain - // `offchainStore` is the offchain store, used for accessing offchain data. - // offchainStoreKey storetypes.StoreKey } // NewPlugin creates a new instance of the block plugin from the given context. diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 87bd6a9276..7b0d031f79 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -55,7 +55,7 @@ require ( github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d // indirect + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 5a2a2ccf31..f3ffd50efd 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -200,8 +200,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 076fa66aa5..ed6e8c4a95 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -12,7 +12,7 @@ replace ( require ( cosmossdk.io/core v0.11.0 cosmossdk.io/math v1.1.2 - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index c0a615ecbb..84a9923639 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -200,8 +200,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 65baa74d8b..8e54432999 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,8 +15,8 @@ require ( cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 - pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/cosmos v0.0.0-20230925142347-326426fa61f6 + pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 ) require ( @@ -34,7 +34,7 @@ require ( github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d + github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect github.com/ethereum/go-ethereum v1.13.1 // indirect @@ -272,8 +272,8 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 // indirect - pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a // indirect + pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 968057f118..72d852e7a8 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -396,8 +396,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d h1:dBD7O1D3lxfMwKjR71ooQanLzclJ17NZMHplL6qd8ZU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230915171831-2196edacb99d/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= +github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -1885,14 +1885,14 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697 h1:D51V7Xugl2EOq7c966pjqTYXT7WodBZMiIsqcze/qgo= -pkg.berachain.dev/polaris/contracts v0.0.0-20230830221145-a6c6454d3697/go.mod h1:ceCUUKQ1GkDJqXjAmeOrjJ/8AEqdUip466n8G4UCgjM= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a h1:QMJRzQpU3/i5WBakrL5V0TE5CcEshC60nw1Ek+bJpJg= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 h1:wgvK5vI7UlQYBs3kB2wZBgsxUjYK1lCV0LFJ4YF2u/4= -pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230925142347-326426fa61f6 h1:kMeJg5obVNhBHQCMnztPTv1nJGgf6lQSHu73orpgQ6U= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230925142347-326426fa61f6/go.mod h1:CI85P35I3drHdlokROrjQYLXQphPZo/jaxGQIl6mEpg= +pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 h1:0dIN2V+giVZmUOPvDyOxnXfTgZIoBOqjZTpXn704edY= +pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6/go.mod h1:XDIlhb6eOL2Rq81b0OPzke5IFQyqgbD7f60NRomcmXc= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 9a20136cd2..7ae768c28e 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -286,7 +286,6 @@ func txCommand() *cobra.Command { authcmd.GetBroadcastCommand(), authcmd.GetEncodeCommand(), authcmd.GetDecodeCommand(), - authcmd.GetAuxToFeeCommand(), ) return cmd diff --git a/go.work.sum b/go.work.sum index 29348f92d8..7dd9ac4fd0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -185,9 +185,16 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxq github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= @@ -197,129 +204,292 @@ github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSb github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230817233644-564b068800e0/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/emicklei/dot v1.5.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e h1:CYRpN206UTHUinz3VJoLaBdy1gEGeJNsqT0mvswDcMw= +github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= @@ -329,15 +499,115 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +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.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= +google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/protobuf v1.28.2-0.20230222093303-bc1253ad3743/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= From e92222cc88068ad6fbe894d2be6ed3ff7dedbff3 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 25 Sep 2023 17:46:50 -0400 Subject: [PATCH 034/122] chore(deps): Bump cosmos-sdk to `v0.50-rc.1` (#1139) --- cosmos/go.mod | 6 +- cosmos/go.sum | 12 +- e2e/localnet/go.mod | 6 +- e2e/localnet/go.sum | 12 +- e2e/precompile/go.mod | 6 +- e2e/precompile/go.sum | 12 +- e2e/testapp/go.mod | 6 +- e2e/testapp/go.sum | 12 +- eth/go.mod | 2 +- eth/go.sum | 4 +- go.work.sum | 316 +----------------------------------------- lib/go.mod | 2 +- lib/go.sum | 4 +- magefiles/go.mod | 2 +- magefiles/go.sum | 4 +- 15 files changed, 49 insertions(+), 357 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index 9fe4a6b4c5..1a82f61284 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -16,7 +16,7 @@ require ( cosmossdk.io/depinject v1.0.0-alpha.4 cosmossdk.io/errors v1.0.0 cosmossdk.io/log v1.2.1 - cosmossdk.io/math v1.1.2 + cosmossdk.io/math v1.1.3-rc.1 cosmossdk.io/store v1.0.0-rc.0 cosmossdk.io/x/tx v0.10.0 github.com/btcsuite/btcd v0.23.4 @@ -24,7 +24,7 @@ require ( github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b + github.com/cosmos/cosmos-sdk v0.50.0-rc.1 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.13.1 @@ -33,7 +33,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/holiman/uint256 v1.2.3 // indirect github.com/huandu/skiplist v1.2.0 // indirect - github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 74e176068d..3989af3f2d 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -47,8 +47,8 @@ cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= +cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= @@ -233,8 +233,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -765,8 +765,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 7b0d031f79..f0baf3dd3a 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -8,7 +8,7 @@ replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0. require ( github.com/docker/docker v24.0.5+incompatible github.com/ethereum/go-ethereum v1.13.1 - github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a @@ -24,7 +24,7 @@ require ( cosmossdk.io/depinject v1.0.0-alpha.4 // indirect cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 // indirect - cosmossdk.io/math v1.1.2 // indirect + cosmossdk.io/math v1.1.3-rc.1 // indirect cosmossdk.io/store v1.0.0-rc.0 // indirect cosmossdk.io/x/tx v0.10.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect @@ -55,7 +55,7 @@ require ( github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b // indirect + github.com/cosmos/cosmos-sdk v0.50.0-rc.1 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index f3ffd50efd..60627b8454 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -47,8 +47,8 @@ cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= +cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= @@ -200,8 +200,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -709,8 +709,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index ed6e8c4a95..7f8173f62c 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -11,9 +11,9 @@ replace ( require ( cosmossdk.io/core v0.11.0 - cosmossdk.io/math v1.1.2 - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b - github.com/onsi/ginkgo/v2 v2.12.0 + cosmossdk.io/math v1.1.3-rc.1 + github.com/cosmos/cosmos-sdk v0.50.0-rc.1 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 84a9923639..ae153128ff 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -47,8 +47,8 @@ cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= +cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= @@ -200,8 +200,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -705,8 +705,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 8e54432999..12d089446f 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -26,7 +26,7 @@ require ( cosmossdk.io/depinject v1.0.0-alpha.4 cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 - cosmossdk.io/math v1.1.2 // indirect + cosmossdk.io/math v1.1.3-rc.1 // indirect cosmossdk.io/store v1.0.0-rc.0 cosmossdk.io/x/tx v0.10.0 // indirect github.com/btcsuite/btcd v0.23.4 // indirect @@ -34,7 +34,7 @@ require ( github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b + github.com/cosmos/cosmos-sdk v0.50.0-rc.1 github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect github.com/ethereum/go-ethereum v1.13.1 // indirect @@ -43,7 +43,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/huandu/skiplist v1.2.0 // indirect - github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 72d852e7a8..b62d143538 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -201,8 +201,8 @@ cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= +cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 h1:axKhxRa3M9QW2GdKJUsSyzo44gxcwSOTGeomtkbQClM= @@ -396,8 +396,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b h1:RP4SQswWGtFkLWFJzlWa4iPfrL5SwEOum+0F85fCon8= -github.com/cosmos/cosmos-sdk v0.50.0-rc.0.0.20230925142031-19632293df2b/go.mod h1:8rNGga/Gg9/NIFvpqO4URts+8Cz/XVB0wTr5ZDm22UM= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -973,8 +973,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= diff --git a/eth/go.mod b/eth/go.mod index a6719d4740..28439935b9 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -9,7 +9,7 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/ethereum/go-ethereum v1.13.1 github.com/holiman/uint256 v1.2.3 - github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 golang.org/x/text v0.13.0 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a diff --git a/eth/go.sum b/eth/go.sum index fe135b3a86..8724b430b5 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -238,8 +238,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= diff --git a/go.work.sum b/go.work.sum index 7dd9ac4fd0..22633a6de9 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,8 +1,3 @@ -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= @@ -10,7 +5,6 @@ cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= @@ -28,13 +22,6 @@ cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeH cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= @@ -44,7 +31,6 @@ cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsX cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= @@ -59,18 +45,13 @@ cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIh cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= @@ -78,8 +59,6 @@ cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= @@ -99,7 +78,6 @@ cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4s cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= @@ -114,15 +92,10 @@ cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhO cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= @@ -138,41 +111,24 @@ cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2t cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= -github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= @@ -182,19 +138,10 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45M github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= @@ -204,292 +151,132 @@ github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSb github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20230817233644-564b068800e0/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/emicklei/dot v1.5.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= -github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= -github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= -github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= -github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e h1:CYRpN206UTHUinz3VJoLaBdy1gEGeJNsqT0mvswDcMw= -github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= -github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= @@ -499,115 +286,20 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -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.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= -google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/protobuf v1.28.2-0.20230222093303-bc1253ad3743/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= diff --git a/lib/go.mod b/lib/go.mod index eedb7565b2..dc2046c73a 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/lib go 1.21 require ( - github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 ) diff --git a/lib/go.sum b/lib/go.sum index e7bede382a..cb31ddaea7 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -21,8 +21,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/magefiles/go.mod b/magefiles/go.mod index ad2c39986d..3c1a375afb 100644 --- a/magefiles/go.mod +++ b/magefiles/go.mod @@ -11,7 +11,7 @@ require ( github.com/google/addlicense v1.1.1 github.com/magefile/mage v1.15.0 github.com/matryer/moq v0.3.2 - github.com/onsi/ginkgo/v2 v2.12.0 + github.com/onsi/ginkgo/v2 v2.12.1 github.com/securego/gosec/v2 v2.17.0 github.com/segmentio/golines v0.11.0 ) diff --git a/magefiles/go.sum b/magefiles/go.sum index 113bdc0097..f7abd4e743 100644 --- a/magefiles/go.sum +++ b/magefiles/go.sum @@ -661,8 +661,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= From 042d5e3f7279c151a38778159ea181adf4950d1f Mon Sep 17 00:00:00 2001 From: corduroy <130501039+corduroybera@users.noreply.github.com> Date: Wed, 27 Sep 2023 11:52:44 -0400 Subject: [PATCH 035/122] feat(actions): daily doc generation, tested and verified with act (#1151) ### Summary by CodeRabbit - New Feature: Implemented a daily GitHub Actions workflow that automates the generation and update of documentation. This workflow checks out the `polaris` repository, installs necessary toolchains, generates documentation, and pushes the updates to the `docs-monorepo` repository. This ensures that our documentation is always up-to-date with the latest changes in the codebase. --- .github/workflows/daily.yml | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/workflows/daily.yml diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 0000000000..3a9e860930 --- /dev/null +++ b/.github/workflows/daily.yml @@ -0,0 +1,48 @@ +name: daily + +on: + schedule: + - cron: '0 0 * * *' # This schedule runs the workflow daily at midnight UTC + +jobs: + docs: + strategy: + matrix: + go-version: [1.21.1] + python-version: [3.11.5] + runs-on: ubuntu-latest + steps: + - name: Checkout polaris + uses: actions/checkout@v3 + with: + path: polaris + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - name: Forge doc + run: | + cd polaris + forge doc + - name: Checkout docs-monorepo + uses: actions/checkout@v3 + with: + repository: berachain/docs-monorepo + token: ${{ secrets.GITHUB_TOKEN }} + path: docs-monorepo + ref: main + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Generate docs + run: | + cd docs-monorepo + pip install -r apps/digest/requirements.txt + python apps/digest/main.py polaris + git status + - name: Commit and push changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Update docs with Polaris changes + repository: docs-monorepo + commit_author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + \ No newline at end of file From a79fa498db1bc5666b2a73155dc9ebb4313e0f26 Mon Sep 17 00:00:00 2001 From: corduroy <130501039+corduroybera@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:09:39 -0400 Subject: [PATCH 036/122] fix(actions): Adding token for docs repo access (#1158) --- .github/workflows/daily.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 3a9e860930..8b9941cbc0 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v3 with: repository: berachain/docs-monorepo - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.DOCS_TOKEN }} path: docs-monorepo ref: main - name: Set up Python From 23cc5f141354c9e255a0dc90995b160cd246896f Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Thu, 28 Sep 2023 10:25:28 -0400 Subject: [PATCH 037/122] fix(cosmos): Deterministically load genesis accounts into StateDB (#1156) Co-authored-by: Devon Bear --- cosmos/go.mod | 2 +- cosmos/go.sum | 4 +- cosmos/x/evm/genesis.go | 18 +++++- cosmos/x/evm/keeper/genesis.go | 4 +- cosmos/x/evm/keeper/processor_test.go | 2 +- cosmos/x/evm/plugins/base.go | 2 +- cosmos/x/evm/plugins/block/genesis.go | 6 +- cosmos/x/evm/plugins/configuration/genesis.go | 4 +- cosmos/x/evm/plugins/configuration/plugin.go | 2 +- cosmos/x/evm/plugins/configuration/store.go | 5 +- .../x/evm/plugins/configuration/store_test.go | 2 +- cosmos/x/evm/plugins/historical/genesis.go | 6 +- .../x/evm/plugins/historical/plugin_test.go | 2 +- cosmos/x/evm/plugins/state/genesis.go | 55 ++++++++++++++----- cosmos/x/evm/plugins/state/genesis_test.go | 40 +++++++++----- e2e/hive/simulators/rpc/init/genesis.json | 6 +- e2e/localnet/go.mod | 2 +- e2e/localnet/go.sum | 4 +- e2e/precompile/go.mod | 2 +- e2e/precompile/go.sum | 4 +- e2e/testapp/go.mod | 2 +- e2e/testapp/go.sum | 4 +- eth/go.mod | 2 +- eth/go.sum | 4 +- go.work.sum | 4 +- 25 files changed, 121 insertions(+), 67 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index 1a82f61284..b62befdf34 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/cosmos/go.sum b/cosmos/go.sum index 3989af3f2d..d1817da288 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -113,8 +113,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/cosmos/x/evm/genesis.go b/cosmos/x/evm/genesis.go index 7e3d3b51c1..4a2c532f02 100644 --- a/cosmos/x/evm/genesis.go +++ b/cosmos/x/evm/genesis.go @@ -22,6 +22,8 @@ package evm import ( "encoding/json" + "fmt" + "math/big" abci "github.com/cometbft/cometbft/abci/types" @@ -45,7 +47,21 @@ func (AppModuleBasic) DefaultGenesis(_ codec.JSONCodec) json.RawMessage { // ValidateGenesis performs genesis state validation for the evm module. func (AppModuleBasic) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { ethGen := new(core.Genesis) - return ethGen.UnmarshalJSON(bz) // todo: improve + if err := ethGen.UnmarshalJSON(bz); err != nil { + return err + } + + for address, account := range ethGen.Alloc { + if ethGen.Config.IsEIP155(big.NewInt(0)) && account.Code != nil && account.Nonce == 0 { + // NOTE: EIP 161 was released at the same block as EIP 155. + return fmt.Errorf( + "EIP-161 requires an account with code (%s) to have nonce of at least 1, given (0)", + address.Hex(), + ) + } + } + + return nil } // InitGenesis performs genesis initialization for the evm module. It returns diff --git a/cosmos/x/evm/keeper/genesis.go b/cosmos/x/evm/keeper/genesis.go index b4ae594d8e..6178891392 100644 --- a/cosmos/x/evm/keeper/genesis.go +++ b/cosmos/x/evm/keeper/genesis.go @@ -34,7 +34,9 @@ func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { for _, plugin := range k.host.GetAllPlugins() { // checks whether plugin implements methods of HasGenesis and executes them if it does if plugin, ok := utils.GetAs[plugins.HasGenesis](plugin); ok { - plugin.InitGenesis(ctx, genState) + if err := plugin.InitGenesis(ctx, genState); err != nil { + return err + } } } return nil diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index b8e6492106..a4b36d2f64 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -100,7 +100,7 @@ var _ = Describe("Processor", func() { for _, plugin := range k.GetHost().GetAllPlugins() { plugin, hasInitGenesis := utils.GetAs[plugins.HasGenesis](plugin) if hasInitGenesis { - plugin.InitGenesis(ctx, core.DefaultGenesis) + Expect(plugin.InitGenesis(ctx, core.DefaultGenesis)).To(Succeed()) } } validator, err := NewValidator(sdk.ValAddress(valAddr), PKs[0]) diff --git a/cosmos/x/evm/plugins/base.go b/cosmos/x/evm/plugins/base.go index 61898231f6..7deb312876 100644 --- a/cosmos/x/evm/plugins/base.go +++ b/cosmos/x/evm/plugins/base.go @@ -30,6 +30,6 @@ import ( // InitGenesis or ExportGenesis methods must implement type HasGenesis interface { - InitGenesis(sdk.Context, *core.Genesis) + InitGenesis(sdk.Context, *core.Genesis) error ExportGenesis(sdk.Context, *core.Genesis) } diff --git a/cosmos/x/evm/plugins/block/genesis.go b/cosmos/x/evm/plugins/block/genesis.go index 817c430d48..75e5eb61cb 100644 --- a/cosmos/x/evm/plugins/block/genesis.go +++ b/cosmos/x/evm/plugins/block/genesis.go @@ -28,13 +28,11 @@ import ( ) // InitGenesis stores the genesis block header in the KVStore under its own genesis key. -func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { +func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { p.Prepare(ctx) // Writing genesis block 0 to disk, available to query from any future IAVL height - if err := p.StoreHeader(ethGen.ToBlock().Header()); err != nil { - panic(err) - } + return p.StoreHeader(ethGen.ToBlock().Header()) } // Export genesis modifies a pointer to a genesis state object and populates it. diff --git a/cosmos/x/evm/plugins/configuration/genesis.go b/cosmos/x/evm/plugins/configuration/genesis.go index dea4b22eca..81bb13abee 100644 --- a/cosmos/x/evm/plugins/configuration/genesis.go +++ b/cosmos/x/evm/plugins/configuration/genesis.go @@ -28,9 +28,9 @@ import ( // InitGenesis performs genesis initialization for the evm module. It returns // no validator updates. -func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { +func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { p.Prepare(ctx) - p.SetChainConfig(ethGen.Config) + return p.SetChainConfig(ethGen.Config) } // ExportGenesis returns the exported genesis state as raw bytes for the evm diff --git a/cosmos/x/evm/plugins/configuration/plugin.go b/cosmos/x/evm/plugins/configuration/plugin.go index 1f93dad1cc..71d71a62eb 100644 --- a/cosmos/x/evm/plugins/configuration/plugin.go +++ b/cosmos/x/evm/plugins/configuration/plugin.go @@ -36,7 +36,7 @@ import ( type Plugin interface { plugins.HasGenesis core.ConfigurationPlugin - SetChainConfig(*params.ChainConfig) + SetChainConfig(*params.ChainConfig) error } // plugin implements the core.ConfigurationPlugin interface. diff --git a/cosmos/x/evm/plugins/configuration/store.go b/cosmos/x/evm/plugins/configuration/store.go index 5c959c5729..c897c305de 100644 --- a/cosmos/x/evm/plugins/configuration/store.go +++ b/cosmos/x/evm/plugins/configuration/store.go @@ -38,10 +38,11 @@ func (p *plugin) ChainConfig() *params.ChainConfig { } // GetEthGenesis is used to get the genesis info of the Ethereum chain. -func (p *plugin) SetChainConfig(chainConfig *params.ChainConfig) { +func (p *plugin) SetChainConfig(chainConfig *params.ChainConfig) error { bz, err := json.Marshal(chainConfig) if err != nil { - panic(err) + return err } p.paramsStore.Set([]byte{types.ChainConfigPrefix}, bz) + return nil } diff --git a/cosmos/x/evm/plugins/configuration/store_test.go b/cosmos/x/evm/plugins/configuration/store_test.go index 5b42c7b687..bf40dc3989 100644 --- a/cosmos/x/evm/plugins/configuration/store_test.go +++ b/cosmos/x/evm/plugins/configuration/store_test.go @@ -67,7 +67,7 @@ var _ = Describe("Plugin", func() { Context("when the params store contains valid params", func() { It("should return the chain config", func() { - p.SetChainConfig(params.DefaultChainConfig) + Expect(p.SetChainConfig(params.DefaultChainConfig)).To(Succeed()) config := p.ChainConfig() Expect(config).To(Equal(params.DefaultChainConfig)) }) diff --git a/cosmos/x/evm/plugins/historical/genesis.go b/cosmos/x/evm/plugins/historical/genesis.go index 37e3bdb76d..bc3eed5175 100644 --- a/cosmos/x/evm/plugins/historical/genesis.go +++ b/cosmos/x/evm/plugins/historical/genesis.go @@ -26,13 +26,11 @@ import ( "pkg.berachain.dev/polaris/eth/core" ) -func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { +func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { p.Prepare(ctx) // store genesis block - if err := p.StoreBlock(ethGen.ToBlock()); err != nil { - panic(err) - } + return p.StoreBlock(ethGen.ToBlock()) } func (p *plugin) ExportGenesis(_ sdk.Context, _ *core.Genesis) {} diff --git a/cosmos/x/evm/plugins/historical/plugin_test.go b/cosmos/x/evm/plugins/historical/plugin_test.go index c9557ec29b..2b142d94ec 100644 --- a/cosmos/x/evm/plugins/historical/plugin_test.go +++ b/cosmos/x/evm/plugins/historical/plugin_test.go @@ -50,7 +50,7 @@ var _ = Describe("Historical Data", func() { bp := mock.NewBlockPluginMock() p = utils.MustGetAs[*plugin](NewPlugin(cp, bp, nil, testutil.EvmKey)) - p.InitGenesis(ctx, core.DefaultGenesis) + Expect(p.InitGenesis(ctx, core.DefaultGenesis)).To(Succeed()) }) When("Genesis block", func() { diff --git a/cosmos/x/evm/plugins/state/genesis.go b/cosmos/x/evm/plugins/state/genesis.go index 66720f9e3d..d1f0a6606f 100644 --- a/cosmos/x/evm/plugins/state/genesis.go +++ b/cosmos/x/evm/plugins/state/genesis.go @@ -21,38 +21,63 @@ package state import ( + "fmt" "math/big" - sdk "github.com/cosmos/cosmos-sdk/types" + "golang.org/x/exp/slices" - "github.com/ethereum/go-ethereum/core" + sdk "github.com/cosmos/cosmos-sdk/types" "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/core" ) // InitGenesis takes in a pointer to a genesis state object and populates the KV store. -func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) { +func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { p.Reset(ctx) - // Iterate over the genesis accounts and set the balances. - for address, account := range ethGen.Alloc { - // TODO: technically wrong since its overriding / hacking the auth keeper and - // we are using the nonce from the account keeper as well. - p.CreateAccount(address) - p.SetBalance(address, account.Balance) + // Sort the addresses so that they are in a consistent order. + sortedAddresses := make([]common.Address, 0, len(ethGen.Alloc)) + for address := range ethGen.Alloc { + sortedAddresses = append(sortedAddresses, address) + } + slices.SortStableFunc(sortedAddresses, func(a, b common.Address) int { return a.Cmp(b) }) + + // Iterate over the sorted genesis accounts and set nonces, balances, codes, and storage. + for _, address := range sortedAddresses { + account := ethGen.Alloc[address] + + // Initialize the account on the auth keeper. + // NOTE: The auth module's init genesis runs before the evm module's init genesis. + if p.Exist(address) { + // If the account exists on the auth keeper, ensure the nonce is consistent. + if p.GetNonce(address) != account.Nonce { + return fmt.Errorf( + "account nonce mismatch for (%s) between auth (%d) and evm (%d) genesis state", + address.Hex(), p.GetNonce(address), account.Nonce, + ) + } + } else { + p.SetNonce(address, account.Nonce) + } + + // Initialize the account data on the state plugin. + if account.Balance != nil { + p.SetBalance(address, account.Balance) + } if account.Code != nil { p.SetCode(address, account.Code) + } else { + // Initialize the code hash to be empty by default. + p.cms.GetKVStore(p.storeKey).Set(CodeHashKeyFor(address), emptyCodeHashBytes) } if account.Storage != nil { - for k, v := range account.Storage { - p.SetState(address, k, v) - } - } - if account.Nonce != 0 { - p.SetNonce(address, account.Nonce) + p.SetStorage(address, account.Storage) } } + p.Finalize() + return nil } // Export genesis modifies a pointer to a genesis state object and populates it. diff --git a/cosmos/x/evm/plugins/state/genesis_test.go b/cosmos/x/evm/plugins/state/genesis_test.go index edbf2c0e2e..1400fe693a 100644 --- a/cosmos/x/evm/plugins/state/genesis_test.go +++ b/cosmos/x/evm/plugins/state/genesis_test.go @@ -39,7 +39,7 @@ var _ = Describe("Genesis", func() { var ( ctx sdk.Context sp state.Plugin - code []byte + code = []byte("code") ) BeforeEach(func() { @@ -47,35 +47,47 @@ var _ = Describe("Genesis", func() { ctx, ak, _, _ = testutil.SetupMinimalKeepers() sp = state.NewPlugin(ak, testutil.EvmKey, nil) - // Create account for alice. + // Create account for alice, bob + acc := ak.NewAccountWithAddress(ctx, bob[:]) + Expect(acc.SetSequence(2)).To(Succeed()) + ak.SetAccount(ctx, acc) sp.Reset(ctx) - code = []byte("code") }) - It("should init and export genesis", func() { + It("should fail init genesis on bad data", func() { genesis := new(core.Genesis) genesis.Alloc = make(core.GenesisAlloc) + genesis.Alloc[bob] = core.GenesisAccount{Nonce: 1} + // Call Init Genesis and expect bob's case to error because of nonce mismatch. + Expect(sp.InitGenesis(ctx, genesis)).To( + MatchError("account nonce mismatch for (0x0000000000000000000000000000000000626f62) between auth (2) and evm (1) genesis state"), //nolint:lll // test. + ) + }) + It("should init and export genesis", func() { + genesis := new(core.Genesis) + genesis.Alloc = make(core.GenesisAlloc) genesis.Alloc[alice] = core.GenesisAccount{ Balance: big.NewInt(5e18), Storage: map[common.Hash]common.Hash{ common.BytesToHash([]byte("key")): common.BytesToHash([]byte("value")), }, - Code: code, + Code: code, + Nonce: 1, + } + genesis.Alloc[bob] = core.GenesisAccount{ + Balance: big.NewInt(2e18), + Nonce: 2, } - // Call Init Genesis - sp.InitGenesis(ctx, genesis) - // Check that the code is set. - sp.Reset(ctx) - Expect(sp.GetCode(alice)).To(Equal(code)) - sp.Finalize() + // Call Init Genesis + Expect(sp.InitGenesis(ctx, genesis)).To(Succeed()) - // Check that the code hash is set. - sp.Reset(ctx) + // Check the code, hash, balance. Expect(sp.GetCodeHash(alice)).To(Equal(crypto.Keccak256Hash(code))) - sp.Finalize() + Expect(sp.GetCodeHash(bob)).To(Equal(crypto.Keccak256Hash(nil))) Expect(sp.GetBalance(alice)).To(Equal(big.NewInt(5e18))) + Expect(sp.GetBalance(bob)).To(Equal(big.NewInt(2e18))) Expect(sp.GetCode(alice)).To(Equal(code)) // Very exported genesis is equal. diff --git a/e2e/hive/simulators/rpc/init/genesis.json b/e2e/hive/simulators/rpc/init/genesis.json index 522e115280..78491db56a 100644 --- a/e2e/hive/simulators/rpc/init/genesis.json +++ b/e2e/hive/simulators/rpc/init/genesis.json @@ -48,11 +48,13 @@ "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "0x1234", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9": "0x01" - } + }, + "nonce": "0x1" }, "0000000000000000000000000000000000000315": { "balance": "0x9999999999999999999999999999999", - "code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ef2769ca1461003e575b610000565b3461000057610078600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061007a565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051809050600060405180830381858888f1935050505015610106578173ffffffffffffffffffffffffffffffffffffffff167f30a3c50752f2552dcc2b93f5b96866280816a986c0c0408cb6778b9fa198288f826040518082815260200191505060405180910390a25b5b50505600a165627a7a72305820637991fabcc8abad4294bf2bb615db78fbec4edff1635a2647d3894e2daf6a610029" + "code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ef2769ca1461003e575b610000565b3461000057610078600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061007a565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051809050600060405180830381858888f1935050505015610106578173ffffffffffffffffffffffffffffffffffffffff167f30a3c50752f2552dcc2b93f5b96866280816a986c0c0408cb6778b9fa198288f826040518082815260200191505060405180910390a25b5b50505600a165627a7a72305820637991fabcc8abad4294bf2bb615db78fbec4edff1635a2647d3894e2daf6a610029", + "nonce": "0x1" } } } \ No newline at end of file diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index f0baf3dd3a..75248f4715 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/e2e/localnet go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 require ( github.com/docker/docker v24.0.5+incompatible diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 60627b8454..b5a6189f48 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -107,8 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 7f8173f62c..084b2e0bae 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index ae153128ff..fdaa68b762 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -107,8 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 12d089446f..dc17268fac 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index b62d143538..c4ed1c865a 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -276,8 +276,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/eth/go.mod b/eth/go.mod index 28439935b9..1bc5529249 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 require ( github.com/BurntSushi/toml v1.3.2 diff --git a/eth/go.sum b/eth/go.sum index 8724b430b5..e7cd9e06f6 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -14,8 +14,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d h1:w5V4L3haBlaaC0VMWd+WlLIS4U8J1YOIsdFaPf/qoWs= -github.com/berachain/polaris-geth v0.0.0-20230919212829-4a52af33e74d/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= +github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= diff --git a/go.work.sum b/go.work.sum index 22633a6de9..5518e202bb 100644 --- a/go.work.sum +++ b/go.work.sum @@ -120,6 +120,7 @@ github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= @@ -140,6 +141,7 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbE github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= @@ -240,8 +242,6 @@ github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SE github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= From 4387ed8d39c811a301e4cc77b0fb13b76897583f Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 29 Sep 2023 11:16:36 -0400 Subject: [PATCH 038/122] feat(txpool): Handler + Mockery (#1159) --- .mockery.yaml | 10 + .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- contracts/foundry.toml | 2 +- cosmos/go.mod | 8 +- cosmos/txpool/handler.go | 171 ++++++++++++++++++ cosmos/txpool/handler_test.go | 98 ++++++++++ cosmos/txpool/mocks/broadcaster.go | 90 +++++++++ cosmos/txpool/mocks/subscription.go | 107 +++++++++++ cosmos/txpool/mocks/tx_serializer.go | 90 +++++++++ cosmos/txpool/mocks/tx_sub_provider.go | 81 +++++++++ cosmos/x/evm/types/tx_serializer.go | 121 +++++++++++++ eth/core/types/transaction.rlpgen.go | 3 - go.work.sum | 4 +- magefiles/constants.go | 1 + magefiles/go.mod | 5 + magefiles/go.sum | 14 ++ magefiles/setup/setup.go | 3 +- magefiles/tools.go | 4 + magefiles/tools/tools.go | 1 + 25 files changed, 810 insertions(+), 17 deletions(-) create mode 100644 .mockery.yaml create mode 100644 cosmos/txpool/handler.go create mode 100644 cosmos/txpool/handler_test.go create mode 100644 cosmos/txpool/mocks/broadcaster.go create mode 100644 cosmos/txpool/mocks/subscription.go create mode 100644 cosmos/txpool/mocks/tx_serializer.go create mode 100644 cosmos/txpool/mocks/tx_sub_provider.go create mode 100644 cosmos/x/evm/types/tx_serializer.go diff --git a/.mockery.yaml b/.mockery.yaml new file mode 100644 index 0000000000..2ce327a5ef --- /dev/null +++ b/.mockery.yaml @@ -0,0 +1,10 @@ +dir: "{{.InterfaceDir}}/mocks" +mockname: "{{.InterfaceNameCamel}}" +filename: "{{.InterfaceNameSnake}}.go" +outpkg: "mocks" +packages: + pkg.berachain.dev/polaris/cosmos/txpool: + config: + all: True + recursive: True + with-expecter: true \ No newline at end of file diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index 8a80c42ac5..c4ee848a6d 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -53,7 +53,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102118061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631acc976f146100435780632ff6e5df1461005f578063426ce1a91461007b575b5f80fd5b61005d600480360381019061005891906100ca565b610097565b005b6100796004803603810190610074919061012f565b61009a565b005b61009560048036038101906100909190610194565b61009d565b005b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f60a082840312156100c1576100c06100a8565b5b81905092915050565b5f602082840312156100df576100de6100a0565b5b5f82013567ffffffffffffffff8111156100fc576100fb6100a4565b5b610108848285016100ac565b91505092915050565b5f60408284031215610126576101256100a8565b5b81905092915050565b5f60208284031215610144576101436100a0565b5b5f82013567ffffffffffffffff811115610161576101606100a4565b5b61016d84828501610111565b91505092915050565b5f6040828403121561018b5761018a6100a8565b5b81905092915050565b5f602082840312156101a9576101a86100a0565b5b5f82013567ffffffffffffffff8111156101c6576101c56100a4565b5b6101d284828501610176565b9150509291505056fea2646970667358221220cd938f1594be90a76ff4980bf8e5eaf239e05e8867ea7e669197172d39f7515c64736f6c63430008140033", + Bin: "0x608060405234801561000f575f80fd5b506102118061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631acc976f146100435780632ff6e5df1461005f578063426ce1a91461007b575b5f80fd5b61005d600480360381019061005891906100ca565b610097565b005b6100796004803603810190610074919061012f565b61009a565b005b61009560048036038101906100909190610194565b61009d565b005b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f60a082840312156100c1576100c06100a8565b5b81905092915050565b5f602082840312156100df576100de6100a0565b5b5f82013567ffffffffffffffff8111156100fc576100fb6100a4565b5b610108848285016100ac565b91505092915050565b5f60408284031215610126576101256100a8565b5b81905092915050565b5f60208284031215610144576101436100a0565b5b5f82013567ffffffffffffffff811115610161576101606100a4565b5b61016d84828501610111565b91505092915050565b5f6040828403121561018b5761018a6100a8565b5b81905092915050565b5f602082840312156101a9576101a86100a0565b5b5f82013567ffffffffffffffff8111156101c6576101c56100a4565b5b6101d284828501610176565b9150509291505056fea264697066735822122015e30edb9e27c41d56fb4bfa53a31f05390368387a2fc2162a847aff41cbd03f64736f6c63430008140033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index a9094d2e46..e6a63d51a6 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220e4c37c223937988a35267edfbba61b52336e1dcb9878edd519edc3eb1881ec2a64736f6c63430008140033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220cf53a89b858bcd89a9f376c9fc26e35242e2b2c6d3caa86630baa63414ba767d64736f6c63430008140033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index fb1bc58655..7b666b0450 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220d6420ed9fe47b1dded4517a423e78839a9dd77daf8059b956323723ecfd6fbaa64736f6c63430008140033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212202e148d4d850cdba2cbe51678ae1a7f68fe0fa2f96b110fc952cd1dda2cd446f064736f6c63430008140033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index 078e0b5336..18c2f176af 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -63,7 +63,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proposal\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b5060405162001ec038038062001ec083398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051611ce9620001d75f395f6104e90152611ce95ff3fe608060405260043610610073575f3560e01c8063566fbd001161004d578063566fbd001461012157806376cdb03b14610151578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061094a565b6101f3565b6040516100b191906109d0565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a63565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a7c565b6102bd565b604051610118929190610ab6565b60405180910390f35b61013b60048036038101906101369190610bc2565b61035f565b6040516101489190610c53565b60405180910390f35b34801561015c575f80fd5b506101656104e7565b6040516101729190610c8c565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610ca5565b61050b565b6040516101ae919061112e565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a7c565b6105c0565b6040516101ea919061128e565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611305565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061136b565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c53565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906113aa565b91509150915091565b5f80600167ffffffffffffffff81111561037c5761037b610826565b5b6040519080825280602002602001820160405280156103b557816020015b6103a2610669565b81526020019060019003908161039a5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061040f5761040e6113e8565b5b60200260200101516020018190525082815f81518110610432576104316113e8565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d238313688886040518363ffffffff1660e01b815260040161049b929190611451565b6020604051808303815f875af11580156104b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104db9190611473565b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610515610682565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b8152600401610571929190611520565b5f60405180830381865afa15801561058b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b39190611bf6565b5090508092505050919050565b6105c86106c5565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b81526004016106209190610c53565b5f60405180830381865afa15801561063a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106629190611c6c565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f9610762565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b78161079b565b81146107c1575f80fd5b50565b5f813590506107d2816107ae565b92915050565b5f8160030b9050919050565b6107ed816107d8565b81146107f7575f80fd5b50565b5f81359050610808816107e4565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085c82610816565b810181811067ffffffffffffffff8211171561087b5761087a610826565b5b80604052505050565b5f61088d61078a565b90506108998282610853565b919050565b5f67ffffffffffffffff8211156108b8576108b7610826565b5b6108c182610816565b9050602081019050919050565b828183375f83830152505050565b5f6108ee6108e98461089e565b610884565b90508281526020810184848401111561090a57610909610812565b5b6109158482856108ce565b509392505050565b5f82601f8301126109315761093061080e565b5b81356109418482602086016108dc565b91505092915050565b5f805f6060848603121561096157610960610793565b5b5f61096e868287016107c4565b935050602061097f868287016107fa565b925050604084013567ffffffffffffffff8111156109a05761099f610797565b5b6109ac8682870161091d565b9150509250925092565b5f8115159050919050565b6109ca816109b6565b82525050565b5f6020820190506109e35f8301846109c1565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a2b610a26610a21846109e9565b610a08565b6109e9565b9050919050565b5f610a3c82610a11565b9050919050565b5f610a4d82610a32565b9050919050565b610a5d81610a43565b82525050565b5f602082019050610a765f830184610a54565b92915050565b5f60208284031215610a9157610a90610793565b5b5f610a9e848285016107c4565b91505092915050565b610ab08161079b565b82525050565b5f604082019050610ac95f830185610aa7565b610ad66020830184610aa7565b9392505050565b5f80fd5b5f80fd5b5f8083601f840112610afa57610af961080e565b5b8235905067ffffffffffffffff811115610b1757610b16610add565b5b602083019150836001820283011115610b3357610b32610ae1565b5b9250929050565b5f8083601f840112610b4f57610b4e61080e565b5b8235905067ffffffffffffffff811115610b6c57610b6b610add565b5b602083019150836001820283011115610b8857610b87610ae1565b5b9250929050565b5f819050919050565b610ba181610b8f565b8114610bab575f80fd5b50565b5f81359050610bbc81610b98565b92915050565b5f805f805f60608688031215610bdb57610bda610793565b5b5f86013567ffffffffffffffff811115610bf857610bf7610797565b5b610c0488828901610ae5565b9550955050602086013567ffffffffffffffff811115610c2757610c26610797565b5b610c3388828901610b3a565b93509350506040610c4688828901610bae565b9150509295509295909350565b5f602082019050610c665f830184610aa7565b92915050565b5f610c7682610a32565b9050919050565b610c8681610c6c565b82525050565b5f602082019050610c9f5f830184610c7d565b92915050565b5f60208284031215610cba57610cb9610793565b5b5f610cc7848285016107fa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610d028161079b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d3f578082015181840152602081019050610d24565b5f8484015250505050565b5f610d5482610d08565b610d5e8185610d12565b9350610d6e818560208601610d22565b610d7781610816565b840191505092915050565b610d8b816107d8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610db582610d91565b610dbf8185610d9b565b9350610dcf818560208601610d22565b610dd881610816565b840191505092915050565b5f608083015f8301518482035f860152610dfd8282610dab565b91505060208301518482036020860152610e178282610dab565b91505060408301518482036040860152610e318282610dab565b91505060608301518482036060860152610e4b8282610dab565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610e8a81610b8f565b82525050565b5f604083015f830151610ea55f860182610e81565b5060208301518482036020860152610ebd8282610dab565b9150508091505092915050565b5f610ed58383610e90565b905092915050565b5f602082019050919050565b5f610ef382610e58565b610efd8185610e62565b935083602082028501610f0f85610e72565b805f5b85811015610f4a5784840389528151610f2b8582610eca565b9450610f3683610edd565b925060208a01995050600181019050610f12565b50829750879550505050505092915050565b5f6101a083015f830151610f725f860182610cf9565b5060208301518482036020860152610f8a8282610d4a565b9150506040830151610f9f6040860182610d82565b5060608301518482036060860152610fb78282610de3565b9150506080830151610fcc6080860182610cf9565b5060a0830151610fdf60a0860182610cf9565b5060c083015184820360c0860152610ff78282610ee9565b91505060e083015161100c60e0860182610cf9565b50610100830151611021610100860182610cf9565b5061012083015184820361012086015261103b8282610dab565b9150506101408301518482036101408601526110578282610dab565b9150506101608301518482036101608601526110738282610dab565b91505061018083015184820361018086015261108f8282610dab565b9150508091505092915050565b5f6110a78383610f5c565b905092915050565b5f602082019050919050565b5f6110c582610cd0565b6110cf8185610cda565b9350836020820285016110e185610cea565b805f5b8581101561111c57848403895281516110fd858261109c565b9450611108836110af565b925060208a019950506001810190506110e4565b50829750879550505050505092915050565b5f6020820190508181035f83015261114681846110bb565b905092915050565b5f6101a083015f8301516111645f860182610cf9565b506020830151848203602086015261117c8282610d4a565b91505060408301516111916040860182610d82565b50606083015184820360608601526111a98282610de3565b91505060808301516111be6080860182610cf9565b5060a08301516111d160a0860182610cf9565b5060c083015184820360c08601526111e98282610ee9565b91505060e08301516111fe60e0860182610cf9565b50610100830151611213610100860182610cf9565b5061012083015184820361012086015261122d8282610dab565b9150506101408301518482036101408601526112498282610dab565b9150506101608301518482036101608601526112658282610dab565b9150506101808301518482036101808601526112818282610dab565b9150508091505092915050565b5f6020820190508181035f8301526112a6818461114e565b905092915050565b6112b7816107d8565b82525050565b5f82825260208201905092915050565b5f6112d782610d91565b6112e181856112bd565b93506112f1818560208601610d22565b6112fa81610816565b840191505092915050565b5f6060820190506113185f830186610aa7565b61132560208301856112ae565b818103604083015261133781846112cd565b9050949350505050565b61134a816109b6565b8114611354575f80fd5b50565b5f8151905061136581611341565b92915050565b5f602082840312156113805761137f610793565b5b5f61138d84828501611357565b91505092915050565b5f815190506113a4816107ae565b92915050565b5f80604083850312156113c0576113bf610793565b5b5f6113cd85828601611396565b92505060206113de85828601611396565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6114308385611415565b935061143d8385846108ce565b61144683610816565b840190509392505050565b5f6020820190508181035f83015261146a818486611425565b90509392505050565b5f6020828403121561148857611487610793565b5b5f61149584828501611396565b91505092915050565b6114a7816109b6565b82525050565b5f60a083015f8301518482035f8601526114c78282610dab565b91505060208301516114dc6020860182610cf9565b5060408301516114ef6040860182610cf9565b506060830151611502606086018261149e565b506080830151611515608086018261149e565b508091505092915050565b5f6040820190506115335f8301856112ae565b818103602083015261154581846114ad565b90509392505050565b5f67ffffffffffffffff82111561156857611567610826565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff82111561159b5761159a610826565b5b6115a482610816565b9050602081019050919050565b5f6115c36115be84611581565b610884565b9050828152602081018484840111156115df576115de610812565b5b6115ea848285610d22565b509392505050565b5f82601f8301126116065761160561080e565b5b81516116168482602086016115b1565b91505092915050565b5f8151905061162d816107e4565b92915050565b5f6116456116408461089e565b610884565b90508281526020810184848401111561166157611660610812565b5b61166c848285610d22565b509392505050565b5f82601f8301126116885761168761080e565b5b8151611698848260208601611633565b91505092915050565b5f608082840312156116b6576116b5611579565b5b6116c06080610884565b90505f82015167ffffffffffffffff8111156116df576116de61157d565b5b6116eb84828501611674565b5f83015250602082015167ffffffffffffffff81111561170e5761170d61157d565b5b61171a84828501611674565b602083015250604082015167ffffffffffffffff81111561173e5761173d61157d565b5b61174a84828501611674565b604083015250606082015167ffffffffffffffff81111561176e5761176d61157d565b5b61177a84828501611674565b60608301525092915050565b5f67ffffffffffffffff8211156117a05761179f610826565b5b602082029050602081019050919050565b5f815190506117bf81610b98565b92915050565b5f604082840312156117da576117d9611579565b5b6117e46040610884565b90505f6117f3848285016117b1565b5f83015250602082015167ffffffffffffffff8111156118165761181561157d565b5b61182284828501611674565b60208301525092915050565b5f61184061183b84611786565b610884565b9050808382526020820190506020840283018581111561186357611862610ae1565b5b835b818110156118aa57805167ffffffffffffffff8111156118885761188761080e565b5b80860161189589826117c5565b85526020850194505050602081019050611865565b5050509392505050565b5f82601f8301126118c8576118c761080e565b5b81516118d884826020860161182e565b91505092915050565b5f6101a082840312156118f7576118f6611579565b5b6119026101a0610884565b90505f61191184828501611396565b5f83015250602082015167ffffffffffffffff8111156119345761193361157d565b5b611940848285016115f2565b60208301525060406119548482850161161f565b604083015250606082015167ffffffffffffffff8111156119785761197761157d565b5b611984848285016116a1565b606083015250608061199884828501611396565b60808301525060a06119ac84828501611396565b60a08301525060c082015167ffffffffffffffff8111156119d0576119cf61157d565b5b6119dc848285016118b4565b60c08301525060e06119f084828501611396565b60e083015250610100611a0584828501611396565b6101008301525061012082015167ffffffffffffffff811115611a2b57611a2a61157d565b5b611a3784828501611674565b6101208301525061014082015167ffffffffffffffff811115611a5d57611a5c61157d565b5b611a6984828501611674565b6101408301525061016082015167ffffffffffffffff811115611a8f57611a8e61157d565b5b611a9b84828501611674565b6101608301525061018082015167ffffffffffffffff811115611ac157611ac061157d565b5b611acd84828501611674565b6101808301525092915050565b5f611aec611ae78461154e565b610884565b90508083825260208201905060208402830185811115611b0f57611b0e610ae1565b5b835b81811015611b5657805167ffffffffffffffff811115611b3457611b3361080e565b5b808601611b4189826118e1565b85526020850194505050602081019050611b11565b5050509392505050565b5f82601f830112611b7457611b7361080e565b5b8151611b84848260208601611ada565b91505092915050565b5f60408284031215611ba257611ba1611579565b5b611bac6040610884565b90505f82015167ffffffffffffffff811115611bcb57611bca61157d565b5b611bd784828501611674565b5f830152506020611bea84828501611396565b60208301525092915050565b5f8060408385031215611c0c57611c0b610793565b5b5f83015167ffffffffffffffff811115611c2957611c28610797565b5b611c3585828601611b60565b925050602083015167ffffffffffffffff811115611c5657611c55610797565b5b611c6285828601611b8d565b9150509250929050565b5f60208284031215611c8157611c80610793565b5b5f82015167ffffffffffffffff811115611c9e57611c9d610797565b5b611caa848285016118e1565b9150509291505056fea26469706673582212201f67eaa333db58f67fd67829d4572725e7b6f8e219b7fff6db0569c9cde8c99064736f6c63430008140033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b5060405162001ec038038062001ec083398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051611ce9620001d75f395f6104e90152611ce95ff3fe608060405260043610610073575f3560e01c8063566fbd001161004d578063566fbd001461012157806376cdb03b14610151578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061094a565b6101f3565b6040516100b191906109d0565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a63565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a7c565b6102bd565b604051610118929190610ab6565b60405180910390f35b61013b60048036038101906101369190610bc2565b61035f565b6040516101489190610c53565b60405180910390f35b34801561015c575f80fd5b506101656104e7565b6040516101729190610c8c565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610ca5565b61050b565b6040516101ae919061112e565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a7c565b6105c0565b6040516101ea919061128e565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611305565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061136b565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c53565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906113aa565b91509150915091565b5f80600167ffffffffffffffff81111561037c5761037b610826565b5b6040519080825280602002602001820160405280156103b557816020015b6103a2610669565b81526020019060019003908161039a5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061040f5761040e6113e8565b5b60200260200101516020018190525082815f81518110610432576104316113e8565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d238313688886040518363ffffffff1660e01b815260040161049b929190611451565b6020604051808303815f875af11580156104b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104db9190611473565b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610515610682565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b8152600401610571929190611520565b5f60405180830381865afa15801561058b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b39190611bf6565b5090508092505050919050565b6105c86106c5565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b81526004016106209190610c53565b5f60405180830381865afa15801561063a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106629190611c6c565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f9610762565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b78161079b565b81146107c1575f80fd5b50565b5f813590506107d2816107ae565b92915050565b5f8160030b9050919050565b6107ed816107d8565b81146107f7575f80fd5b50565b5f81359050610808816107e4565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085c82610816565b810181811067ffffffffffffffff8211171561087b5761087a610826565b5b80604052505050565b5f61088d61078a565b90506108998282610853565b919050565b5f67ffffffffffffffff8211156108b8576108b7610826565b5b6108c182610816565b9050602081019050919050565b828183375f83830152505050565b5f6108ee6108e98461089e565b610884565b90508281526020810184848401111561090a57610909610812565b5b6109158482856108ce565b509392505050565b5f82601f8301126109315761093061080e565b5b81356109418482602086016108dc565b91505092915050565b5f805f6060848603121561096157610960610793565b5b5f61096e868287016107c4565b935050602061097f868287016107fa565b925050604084013567ffffffffffffffff8111156109a05761099f610797565b5b6109ac8682870161091d565b9150509250925092565b5f8115159050919050565b6109ca816109b6565b82525050565b5f6020820190506109e35f8301846109c1565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a2b610a26610a21846109e9565b610a08565b6109e9565b9050919050565b5f610a3c82610a11565b9050919050565b5f610a4d82610a32565b9050919050565b610a5d81610a43565b82525050565b5f602082019050610a765f830184610a54565b92915050565b5f60208284031215610a9157610a90610793565b5b5f610a9e848285016107c4565b91505092915050565b610ab08161079b565b82525050565b5f604082019050610ac95f830185610aa7565b610ad66020830184610aa7565b9392505050565b5f80fd5b5f80fd5b5f8083601f840112610afa57610af961080e565b5b8235905067ffffffffffffffff811115610b1757610b16610add565b5b602083019150836001820283011115610b3357610b32610ae1565b5b9250929050565b5f8083601f840112610b4f57610b4e61080e565b5b8235905067ffffffffffffffff811115610b6c57610b6b610add565b5b602083019150836001820283011115610b8857610b87610ae1565b5b9250929050565b5f819050919050565b610ba181610b8f565b8114610bab575f80fd5b50565b5f81359050610bbc81610b98565b92915050565b5f805f805f60608688031215610bdb57610bda610793565b5b5f86013567ffffffffffffffff811115610bf857610bf7610797565b5b610c0488828901610ae5565b9550955050602086013567ffffffffffffffff811115610c2757610c26610797565b5b610c3388828901610b3a565b93509350506040610c4688828901610bae565b9150509295509295909350565b5f602082019050610c665f830184610aa7565b92915050565b5f610c7682610a32565b9050919050565b610c8681610c6c565b82525050565b5f602082019050610c9f5f830184610c7d565b92915050565b5f60208284031215610cba57610cb9610793565b5b5f610cc7848285016107fa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610d028161079b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d3f578082015181840152602081019050610d24565b5f8484015250505050565b5f610d5482610d08565b610d5e8185610d12565b9350610d6e818560208601610d22565b610d7781610816565b840191505092915050565b610d8b816107d8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610db582610d91565b610dbf8185610d9b565b9350610dcf818560208601610d22565b610dd881610816565b840191505092915050565b5f608083015f8301518482035f860152610dfd8282610dab565b91505060208301518482036020860152610e178282610dab565b91505060408301518482036040860152610e318282610dab565b91505060608301518482036060860152610e4b8282610dab565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610e8a81610b8f565b82525050565b5f604083015f830151610ea55f860182610e81565b5060208301518482036020860152610ebd8282610dab565b9150508091505092915050565b5f610ed58383610e90565b905092915050565b5f602082019050919050565b5f610ef382610e58565b610efd8185610e62565b935083602082028501610f0f85610e72565b805f5b85811015610f4a5784840389528151610f2b8582610eca565b9450610f3683610edd565b925060208a01995050600181019050610f12565b50829750879550505050505092915050565b5f6101a083015f830151610f725f860182610cf9565b5060208301518482036020860152610f8a8282610d4a565b9150506040830151610f9f6040860182610d82565b5060608301518482036060860152610fb78282610de3565b9150506080830151610fcc6080860182610cf9565b5060a0830151610fdf60a0860182610cf9565b5060c083015184820360c0860152610ff78282610ee9565b91505060e083015161100c60e0860182610cf9565b50610100830151611021610100860182610cf9565b5061012083015184820361012086015261103b8282610dab565b9150506101408301518482036101408601526110578282610dab565b9150506101608301518482036101608601526110738282610dab565b91505061018083015184820361018086015261108f8282610dab565b9150508091505092915050565b5f6110a78383610f5c565b905092915050565b5f602082019050919050565b5f6110c582610cd0565b6110cf8185610cda565b9350836020820285016110e185610cea565b805f5b8581101561111c57848403895281516110fd858261109c565b9450611108836110af565b925060208a019950506001810190506110e4565b50829750879550505050505092915050565b5f6020820190508181035f83015261114681846110bb565b905092915050565b5f6101a083015f8301516111645f860182610cf9565b506020830151848203602086015261117c8282610d4a565b91505060408301516111916040860182610d82565b50606083015184820360608601526111a98282610de3565b91505060808301516111be6080860182610cf9565b5060a08301516111d160a0860182610cf9565b5060c083015184820360c08601526111e98282610ee9565b91505060e08301516111fe60e0860182610cf9565b50610100830151611213610100860182610cf9565b5061012083015184820361012086015261122d8282610dab565b9150506101408301518482036101408601526112498282610dab565b9150506101608301518482036101608601526112658282610dab565b9150506101808301518482036101808601526112818282610dab565b9150508091505092915050565b5f6020820190508181035f8301526112a6818461114e565b905092915050565b6112b7816107d8565b82525050565b5f82825260208201905092915050565b5f6112d782610d91565b6112e181856112bd565b93506112f1818560208601610d22565b6112fa81610816565b840191505092915050565b5f6060820190506113185f830186610aa7565b61132560208301856112ae565b818103604083015261133781846112cd565b9050949350505050565b61134a816109b6565b8114611354575f80fd5b50565b5f8151905061136581611341565b92915050565b5f602082840312156113805761137f610793565b5b5f61138d84828501611357565b91505092915050565b5f815190506113a4816107ae565b92915050565b5f80604083850312156113c0576113bf610793565b5b5f6113cd85828601611396565b92505060206113de85828601611396565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6114308385611415565b935061143d8385846108ce565b61144683610816565b840190509392505050565b5f6020820190508181035f83015261146a818486611425565b90509392505050565b5f6020828403121561148857611487610793565b5b5f61149584828501611396565b91505092915050565b6114a7816109b6565b82525050565b5f60a083015f8301518482035f8601526114c78282610dab565b91505060208301516114dc6020860182610cf9565b5060408301516114ef6040860182610cf9565b506060830151611502606086018261149e565b506080830151611515608086018261149e565b508091505092915050565b5f6040820190506115335f8301856112ae565b818103602083015261154581846114ad565b90509392505050565b5f67ffffffffffffffff82111561156857611567610826565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff82111561159b5761159a610826565b5b6115a482610816565b9050602081019050919050565b5f6115c36115be84611581565b610884565b9050828152602081018484840111156115df576115de610812565b5b6115ea848285610d22565b509392505050565b5f82601f8301126116065761160561080e565b5b81516116168482602086016115b1565b91505092915050565b5f8151905061162d816107e4565b92915050565b5f6116456116408461089e565b610884565b90508281526020810184848401111561166157611660610812565b5b61166c848285610d22565b509392505050565b5f82601f8301126116885761168761080e565b5b8151611698848260208601611633565b91505092915050565b5f608082840312156116b6576116b5611579565b5b6116c06080610884565b90505f82015167ffffffffffffffff8111156116df576116de61157d565b5b6116eb84828501611674565b5f83015250602082015167ffffffffffffffff81111561170e5761170d61157d565b5b61171a84828501611674565b602083015250604082015167ffffffffffffffff81111561173e5761173d61157d565b5b61174a84828501611674565b604083015250606082015167ffffffffffffffff81111561176e5761176d61157d565b5b61177a84828501611674565b60608301525092915050565b5f67ffffffffffffffff8211156117a05761179f610826565b5b602082029050602081019050919050565b5f815190506117bf81610b98565b92915050565b5f604082840312156117da576117d9611579565b5b6117e46040610884565b90505f6117f3848285016117b1565b5f83015250602082015167ffffffffffffffff8111156118165761181561157d565b5b61182284828501611674565b60208301525092915050565b5f61184061183b84611786565b610884565b9050808382526020820190506020840283018581111561186357611862610ae1565b5b835b818110156118aa57805167ffffffffffffffff8111156118885761188761080e565b5b80860161189589826117c5565b85526020850194505050602081019050611865565b5050509392505050565b5f82601f8301126118c8576118c761080e565b5b81516118d884826020860161182e565b91505092915050565b5f6101a082840312156118f7576118f6611579565b5b6119026101a0610884565b90505f61191184828501611396565b5f83015250602082015167ffffffffffffffff8111156119345761193361157d565b5b611940848285016115f2565b60208301525060406119548482850161161f565b604083015250606082015167ffffffffffffffff8111156119785761197761157d565b5b611984848285016116a1565b606083015250608061199884828501611396565b60808301525060a06119ac84828501611396565b60a08301525060c082015167ffffffffffffffff8111156119d0576119cf61157d565b5b6119dc848285016118b4565b60c08301525060e06119f084828501611396565b60e083015250610100611a0584828501611396565b6101008301525061012082015167ffffffffffffffff811115611a2b57611a2a61157d565b5b611a3784828501611674565b6101208301525061014082015167ffffffffffffffff811115611a5d57611a5c61157d565b5b611a6984828501611674565b6101408301525061016082015167ffffffffffffffff811115611a8f57611a8e61157d565b5b611a9b84828501611674565b6101608301525061018082015167ffffffffffffffff811115611ac157611ac061157d565b5b611acd84828501611674565b6101808301525092915050565b5f611aec611ae78461154e565b610884565b90508083825260208201905060208402830185811115611b0f57611b0e610ae1565b5b835b81811015611b5657805167ffffffffffffffff811115611b3457611b3361080e565b5b808601611b4189826118e1565b85526020850194505050602081019050611b11565b5050509392505050565b5f82601f830112611b7457611b7361080e565b5b8151611b84848260208601611ada565b91505092915050565b5f60408284031215611ba257611ba1611579565b5b611bac6040610884565b90505f82015167ffffffffffffffff811115611bcb57611bca61157d565b5b611bd784828501611674565b5f830152506020611bea84828501611396565b60208301525092915050565b5f8060408385031215611c0c57611c0b610793565b5b5f83015167ffffffffffffffff811115611c2957611c28610797565b5b611c3585828601611b60565b925050602083015167ffffffffffffffff811115611c5657611c55610797565b5b611c6285828601611b8d565b9150509250929050565b5f60208284031215611c8157611c80610793565b5b5f82015167ffffffffffffffff811115611c9e57611c9d610797565b5b611caa848285016118e1565b9150509291505056fea26469706673582212200f262c3e6b8ff76d92a1e14eccc8782c65e08fa4ac303d2cc597f07cbb2108e564736f6c63430008140033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index b21677f25d..3564e4d877 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea26469706673582212207fe4477c3d859b2693554fce34aa78b5b6178fed4358006f6720363c82c3e61a64736f6c63430008140033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea26469706673582212203dcda167560f1c8fb3c11f4a89b20e181e1e50d985f93a819a0df6da03697e7564736f6c63430008140033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index b797846d51..6de916b489 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122046e77f6a88a4be3cbc9d7ea46351722a7a2d37b3318c5b6d0788e34350d484aa64736f6c63430008140033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220a82988036ad4b985661f0390de6424b0e38ace000700a265b64053cd745ef6a664736f6c63430008140033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index b05c3b6dac..044cae7c79 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220383dcd14dbb4c0b9470e469c942780d9bdeb224d65a2dfb2a8153bcffc7cd73064736f6c63430008140033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212205e042b28d312604c9eb9f461fa6a115a942807f99d76a60aa48515134e1ded3e64736f6c63430008140033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/foundry.toml b/contracts/foundry.toml index b0f8df1542..aaa72f417c 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -2,7 +2,7 @@ fuzz_runs = 1024 ignored_error_codes = [1878, 5574] evm_version = 'shanghai' -solc_version = '0.8.20' +solc_version = '0.8.21' cache = true force = false optimizer = false diff --git a/cosmos/go.mod b/cosmos/go.mod index b62befdf34..b173dbbbaa 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -35,9 +35,12 @@ require ( github.com/huandu/skiplist v1.2.0 // indirect github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 + github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 // indirect + github.com/stretchr/testify v1.8.4 github.com/tidwall/btree v1.7.0 // indirect + golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect google.golang.org/grpc v1.58.1 @@ -47,8 +50,6 @@ require ( pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6 ) -require github.com/spf13/cast v1.5.1 - require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -209,7 +210,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.2.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect @@ -229,7 +230,6 @@ require ( go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.13.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go new file mode 100644 index 0000000000..763ceafd5a --- /dev/null +++ b/cosmos/txpool/handler.go @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import ( + "sync/atomic" + + "cosmossdk.io/log" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/event" + + "pkg.berachain.dev/polaris/eth/core" + coretypes "pkg.berachain.dev/polaris/eth/core/types" +) + +// txChanSize is the size of channel listening to NewTxsEvent. The number is referenced from the +// size of tx pool. +const txChanSize = 4096 + +// TxSubProvider. +type TxSubProvider interface { + SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription +} + +// TxSerializer provides an interface to Serialize Geth Transactions to Bytes (via sdk.Tx). +type TxSerializer interface { + SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) +} + +// Broadcaster provides an interface to broadcast TxBytes to the comet p2p layer. +type Broadcaster interface { + BroadcastTxSync(txBytes []byte) (res *sdk.TxResponse, err error) +} + +// Subscription represents a subscription to the txpool. +type Subscription interface { + event.Subscription +} + +// handler listens for new insertions into the geth txpool and broadcasts them to the CometBFT +// layer for p2p and ABCI. +type handler struct { + // Cosmos + logger log.Logger + clientCtx Broadcaster + serializer TxSerializer + + // Ethereum + txPool TxSubProvider + txsCh chan core.NewTxsEvent + stopCh chan struct{} + txsSub Subscription + running atomic.Bool +} + +// newHandler creates a new handler. +func newHandler( + clientCtx Broadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, +) *handler { + h := &handler{ + logger: logger, + clientCtx: clientCtx, + serializer: serializer, + txPool: txPool, + txsCh: make(chan core.NewTxsEvent, txChanSize), + stopCh: make(chan struct{}), + } + return h +} + +// Start starts the handler. +func (h *handler) Start() { + go h.eventLoop() +} + +// start handles the subscription to the txpool and broadcasts transactions. +func (h *handler) eventLoop() { + // Connect to the subscription. + h.txsSub = h.txPool.SubscribeNewTxsEvent(h.txsCh) + h.running.Store(true) + + // Handle events. + var err error + for { + select { + case <-h.stopCh: + h.stop(err) + return + case err = <-h.txsSub.Err(): + h.stopCh <- struct{}{} + case event := <-h.txsCh: + h.broadcastTransactions(event.Txs) + } + } +} + +// Running returns true if the handler is running. +func (h *handler) Running() bool { + return h.running.Load() +} + +// Stop stops the handler. +func (h *handler) Stop() { + if h.Running() { + h.stopCh <- struct{}{} + } else { + panic("stopping already stopped handler") + } +} + +// stop stops the handler. +func (h *handler) stop(err error) { + // Mark as not running to prevent further events. + h.running.Store(false) + + // If we are stopping because of an error, log it. + if err != nil { + h.logger.Error("txpool handler", "error", err) + } + + // Triggers txBroadcastLoop to quit. + h.txsSub.Unsubscribe() + + // Close channels. + close(h.txsCh) + close(h.stopCh) +} + +// broadcastTransactions will propagate a batch of transactions to the CometBFT mempool. +func (h *handler) broadcastTransactions(txs coretypes.Transactions) { + h.logger.Debug("broadcasting transactions", "num_txs", len(txs)) + for _, signedEthTx := range txs { + // Serialize the transaction to Bytes + txBytes, err := h.serializer.SerializeToBytes(signedEthTx) + if err != nil { + h.logger.Error("failed to serialize transaction", "err", err) + continue + } + + // Send the transaction to the CometBFT mempool, which will gossip it to peers via + // CometBFT's p2p layer. + rsp, err := h.clientCtx.BroadcastTxSync(txBytes) + + // If we see an ABCI response error. + if rsp != nil && rsp.Code != 0 { + h.logger.Error("failed to broadcast transaction", "rsp", rsp, "err", err) + } else if err != nil { + h.logger.Error("error on transactions broadcast", "err", err) + } + } +} diff --git a/cosmos/txpool/handler_test.go b/cosmos/txpool/handler_test.go new file mode 100644 index 0000000000..57dba3f009 --- /dev/null +++ b/cosmos/txpool/handler_test.go @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import ( + "testing" + "time" + + "github.com/stretchr/testify/mock" + + "cosmossdk.io/log" + + "pkg.berachain.dev/polaris/cosmos/txpool/mocks" + "pkg.berachain.dev/polaris/eth/core" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestTxpool(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/x/evm/plugins/txpool") +} + +var _ = Describe("", func() { + var h *handler + t := GinkgoT() + + var subscription *mocks.Subscription + var serializer *mocks.TxSerializer + var broadcaster *mocks.Broadcaster + var subprovider *mocks.TxSubProvider + + BeforeEach(func() { + subscription = mocks.NewSubscription(t) + subscription.On("Err").Return(nil) + subscription.On("Unsubscribe").Return() + broadcaster = mocks.NewBroadcaster(t) + subprovider = mocks.NewTxSubProvider(t) + subprovider.On("SubscribeNewTxsEvent", mock.Anything).Return(subscription) + serializer = mocks.NewTxSerializer(t) + h = newHandler(broadcaster, subprovider, serializer, log.NewTestLogger(t)) + h.Start() + for !h.Running() { + // Wait for handler to start. + time.Sleep(50 * time.Millisecond) + } + Expect(h.Running()).To(BeTrue()) + }) + + AfterEach(func() { + h.Stop() + for h.Running() { + // Wait for handler to start. + time.Sleep(50 * time.Millisecond) + } + Expect(h.Running()).To(BeFalse()) + }) + + When("", func() { + It("should handle 1 tx", func() { + serializer.On("SerializeToBytes", mock.Anything).Return([]byte{123}, nil).Once() + broadcaster.On("BroadcastTxSync", []byte{123}).Return(nil, nil).Once() + + h.txsCh <- core.NewTxsEvent{Txs: []*coretypes.Transaction{coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5})}} + }) + + It("should handle multiple tx", func() { + serializer.On("SerializeToBytes", mock.Anything).Return([]byte{123}, nil).Twice() + broadcaster.On("BroadcastTxSync", []byte{123}).Return(nil, nil).Twice() + + h.txsCh <- core.NewTxsEvent{Txs: []*coretypes.Transaction{ + coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5}), + coretypes.NewTx(&coretypes.LegacyTx{Nonce: 6}), + }} + }) + }) + +}) diff --git a/cosmos/txpool/mocks/broadcaster.go b/cosmos/txpool/mocks/broadcaster.go new file mode 100644 index 0000000000..e76ce6ce1a --- /dev/null +++ b/cosmos/txpool/mocks/broadcaster.go @@ -0,0 +1,90 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" +) + +// Broadcaster is an autogenerated mock type for the Broadcaster type +type Broadcaster struct { + mock.Mock +} + +type Broadcaster_Expecter struct { + mock *mock.Mock +} + +func (_m *Broadcaster) EXPECT() *Broadcaster_Expecter { + return &Broadcaster_Expecter{mock: &_m.Mock} +} + +// BroadcastTxSync provides a mock function with given fields: txBytes +func (_m *Broadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, error) { + ret := _m.Called(txBytes) + + var r0 *types.TxResponse + var r1 error + if rf, ok := ret.Get(0).(func([]byte) (*types.TxResponse, error)); ok { + return rf(txBytes) + } + if rf, ok := ret.Get(0).(func([]byte) *types.TxResponse); ok { + r0 = rf(txBytes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.TxResponse) + } + } + + if rf, ok := ret.Get(1).(func([]byte) error); ok { + r1 = rf(txBytes) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Broadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync' +type Broadcaster_BroadcastTxSync_Call struct { + *mock.Call +} + +// BroadcastTxSync is a helper method to define mock.On call +// - txBytes []byte +func (_e *Broadcaster_Expecter) BroadcastTxSync(txBytes interface{}) *Broadcaster_BroadcastTxSync_Call { + return &Broadcaster_BroadcastTxSync_Call{Call: _e.mock.On("BroadcastTxSync", txBytes)} +} + +func (_c *Broadcaster_BroadcastTxSync_Call) Run(run func(txBytes []byte)) *Broadcaster_BroadcastTxSync_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]byte)) + }) + return _c +} + +func (_c *Broadcaster_BroadcastTxSync_Call) Return(res *types.TxResponse, err error) *Broadcaster_BroadcastTxSync_Call { + _c.Call.Return(res, err) + return _c +} + +func (_c *Broadcaster_BroadcastTxSync_Call) RunAndReturn(run func([]byte) (*types.TxResponse, error)) *Broadcaster_BroadcastTxSync_Call { + _c.Call.Return(run) + return _c +} + +// NewBroadcaster creates a new instance of Broadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBroadcaster(t interface { + mock.TestingT + Cleanup(func()) +}) *Broadcaster { + mock := &Broadcaster{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go new file mode 100644 index 0000000000..e1513660d2 --- /dev/null +++ b/cosmos/txpool/mocks/subscription.go @@ -0,0 +1,107 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Subscription is an autogenerated mock type for the Subscription type +type Subscription struct { + mock.Mock +} + +type Subscription_Expecter struct { + mock *mock.Mock +} + +func (_m *Subscription) EXPECT() *Subscription_Expecter { + return &Subscription_Expecter{mock: &_m.Mock} +} + +// Err provides a mock function with given fields: +func (_m *Subscription) Err() <-chan error { + ret := _m.Called() + + var r0 <-chan error + if rf, ok := ret.Get(0).(func() <-chan error); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan error) + } + } + + return r0 +} + +// Subscription_Err_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Err' +type Subscription_Err_Call struct { + *mock.Call +} + +// Err is a helper method to define mock.On call +func (_e *Subscription_Expecter) Err() *Subscription_Err_Call { + return &Subscription_Err_Call{Call: _e.mock.On("Err")} +} + +func (_c *Subscription_Err_Call) Run(run func()) *Subscription_Err_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Subscription_Err_Call) Return(_a0 <-chan error) *Subscription_Err_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Subscription_Err_Call) RunAndReturn(run func() <-chan error) *Subscription_Err_Call { + _c.Call.Return(run) + return _c +} + +// Unsubscribe provides a mock function with given fields: +func (_m *Subscription) Unsubscribe() { + _m.Called() +} + +// Subscription_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe' +type Subscription_Unsubscribe_Call struct { + *mock.Call +} + +// Unsubscribe is a helper method to define mock.On call +func (_e *Subscription_Expecter) Unsubscribe() *Subscription_Unsubscribe_Call { + return &Subscription_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe")} +} + +func (_c *Subscription_Unsubscribe_Call) Run(run func()) *Subscription_Unsubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Subscription_Unsubscribe_Call) Return() *Subscription_Unsubscribe_Call { + _c.Call.Return() + return _c +} + +func (_c *Subscription_Unsubscribe_Call) RunAndReturn(run func()) *Subscription_Unsubscribe_Call { + _c.Call.Return(run) + return _c +} + +// NewSubscription creates a new instance of Subscription. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSubscription(t interface { + mock.TestingT + Cleanup(func()) +}) *Subscription { + mock := &Subscription{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go new file mode 100644 index 0000000000..e93219295e --- /dev/null +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -0,0 +1,90 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// TxSerializer is an autogenerated mock type for the TxSerializer type +type TxSerializer struct { + mock.Mock +} + +type TxSerializer_Expecter struct { + mock *mock.Mock +} + +func (_m *TxSerializer) EXPECT() *TxSerializer_Expecter { + return &TxSerializer_Expecter{mock: &_m.Mock} +} + +// SerializeToBytes provides a mock function with given fields: signedTx +func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, error) { + ret := _m.Called(signedTx) + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(*types.Transaction) ([]byte, error)); ok { + return rf(signedTx) + } + if rf, ok := ret.Get(0).(func(*types.Transaction) []byte); ok { + r0 = rf(signedTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(*types.Transaction) error); ok { + r1 = rf(signedTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxSerializer_SerializeToBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToBytes' +type TxSerializer_SerializeToBytes_Call struct { + *mock.Call +} + +// SerializeToBytes is a helper method to define mock.On call +// - signedTx *types.Transaction +func (_e *TxSerializer_Expecter) SerializeToBytes(signedTx interface{}) *TxSerializer_SerializeToBytes_Call { + return &TxSerializer_SerializeToBytes_Call{Call: _e.mock.On("SerializeToBytes", signedTx)} +} + +func (_c *TxSerializer_SerializeToBytes_Call) Run(run func(signedTx *types.Transaction)) *TxSerializer_SerializeToBytes_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*types.Transaction)) + }) + return _c +} + +func (_c *TxSerializer_SerializeToBytes_Call) Return(_a0 []byte, _a1 error) *TxSerializer_SerializeToBytes_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxSerializer_SerializeToBytes_Call) RunAndReturn(run func(*types.Transaction) ([]byte, error)) *TxSerializer_SerializeToBytes_Call { + _c.Call.Return(run) + return _c +} + +// NewTxSerializer creates a new instance of TxSerializer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxSerializer(t interface { + mock.TestingT + Cleanup(func()) +}) *TxSerializer { + mock := &TxSerializer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go new file mode 100644 index 0000000000..a983f0bfe7 --- /dev/null +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -0,0 +1,81 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + core "github.com/ethereum/go-ethereum/core" + event "github.com/ethereum/go-ethereum/event" + + mock "github.com/stretchr/testify/mock" +) + +// TxSubProvider is an autogenerated mock type for the TxSubProvider type +type TxSubProvider struct { + mock.Mock +} + +type TxSubProvider_Expecter struct { + mock *mock.Mock +} + +func (_m *TxSubProvider) EXPECT() *TxSubProvider_Expecter { + return &TxSubProvider_Expecter{mock: &_m.Mock} +} + +// SubscribeNewTxsEvent provides a mock function with given fields: ch +func (_m *TxSubProvider) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { + ret := _m.Called(ch) + + var r0 event.Subscription + if rf, ok := ret.Get(0).(func(chan<- core.NewTxsEvent) event.Subscription); ok { + r0 = rf(ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + return r0 +} + +// TxSubProvider_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent' +type TxSubProvider_SubscribeNewTxsEvent_Call struct { + *mock.Call +} + +// SubscribeNewTxsEvent is a helper method to define mock.On call +// - ch chan<- core.NewTxsEvent +func (_e *TxSubProvider_Expecter) SubscribeNewTxsEvent(ch interface{}) *TxSubProvider_SubscribeNewTxsEvent_Call { + return &TxSubProvider_SubscribeNewTxsEvent_Call{Call: _e.mock.On("SubscribeNewTxsEvent", ch)} +} + +func (_c *TxSubProvider_SubscribeNewTxsEvent_Call) Run(run func(ch chan<- core.NewTxsEvent)) *TxSubProvider_SubscribeNewTxsEvent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(chan<- core.NewTxsEvent)) + }) + return _c +} + +func (_c *TxSubProvider_SubscribeNewTxsEvent_Call) Return(_a0 event.Subscription) *TxSubProvider_SubscribeNewTxsEvent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxSubProvider_SubscribeNewTxsEvent_Call) RunAndReturn(run func(chan<- core.NewTxsEvent) event.Subscription) *TxSubProvider_SubscribeNewTxsEvent_Call { + _c.Call.Return(run) + return _c +} + +// NewTxSubProvider creates a new instance of TxSubProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxSubProvider(t interface { + mock.TestingT + Cleanup(func()) +}) *TxSubProvider { + mock := &TxSubProvider{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/x/evm/types/tx_serializer.go b/cosmos/x/evm/types/tx_serializer.go new file mode 100644 index 0000000000..19bf3a5a98 --- /dev/null +++ b/cosmos/x/evm/types/tx_serializer.go @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package types + +import ( + "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + + "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" + coretypes "pkg.berachain.dev/polaris/eth/core/types" +) + +// TxSerializer provides an interface to serialize ethereum transactions +// to sdk.Tx's and bytes that can be used by CometBFT. +type TxSerializer interface { + SerializeToSdkTx(signedTx *coretypes.Transaction) (sdk.Tx, error) + SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) +} + +// serializer implements TxSerializer. +type serializer struct { + txConfig client.TxConfig +} + +// NewSerializer returns a new instance of TxSerializer. +func NewSerializer(txConfig client.TxConfig) TxSerializer { + return &serializer{ + txConfig: txConfig, + } +} + +// SerializeToSdkTx converts an ethereum transaction to a Cosmos native transaction. +func (s *serializer) SerializeToSdkTx(signedTx *coretypes.Transaction) (sdk.Tx, error) { + // TODO: do we really need to use extensions for anything? Since we + // are using the standard ante handler stuff I don't think we actually need to. + tx := s.txConfig.NewTxBuilder() + + // We can also retrievepothe gaslimit for the transaction from the ethereum transaction. + tx.SetGasLimit(signedTx.Gas()) + + // Thirdly, we set the nonce equal to the nonce of the transaction and also derive the PubKey + // from the V,R,S values of the transaction. This allows us for a little trick to allow + // ethereum transactions to work in the standard cosmos app-side mempool with no modifications. + // Some gigabrain shit tbh. + pkBz, err := coretypes.PubkeyFromTx( + signedTx, coretypes.LatestSignerForChainID(signedTx.ChainId()), + ) + if err != nil { + return nil, err + } + + // Create the WrappedEthereumTransaction message. + wrappedEthTx := NewFromTransaction(signedTx) + sig, err := wrappedEthTx.GetSignature() + if err != nil { + return nil, err + } + + // Lastly, we set the signature. We can pull the sequence from the nonce of the ethereum tx. + if err = tx.SetSignatures( + signingtypes.SignatureV2{ + Sequence: signedTx.Nonce(), + Data: &signingtypes.SingleSignatureData{ + // We retrieve the hash of the signed transaction from the ethereum transaction + // objects, as this was the bytes that were signed. We pass these into the + // SingleSignatureData as the SignModeHandler needs to know what data was signed + // over so that it can verify the signature in the ante handler. + Signature: sig, + }, + PubKey: ðsecp256k1.PubKey{Key: pkBz}, + }, + ); err != nil { + return nil, err + } + + // Lastly, we inject the signed ethereum transaction as a message into the Cosmos Tx. + if err = tx.SetMsgs(wrappedEthTx); err != nil { + return nil, err + } + + // Finally, we return the Cosmos Tx. + return tx.GetTx(), nil +} + +// SerializeToBytes converts an Ethereum transaction to Cosmos formatted txBytes which allows for +// it to broadcast it to CometBFT. +func (s *serializer) SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) { + // First, we convert the Ethereum transaction to a Cosmos transaction. + cosmosTx, err := s.SerializeToSdkTx(signedTx) + if err != nil { + return nil, err + } + + // Then we use the clientCtx.TxConfig.TxEncoder() to encode the Cosmos transaction into bytes. + txBytes, err := s.txConfig.TxEncoder()(cosmosTx) + if err != nil { + return nil, err + } + + // Finally, we return the txBytes. + return txBytes, nil +} diff --git a/eth/core/types/transaction.rlpgen.go b/eth/core/types/transaction.rlpgen.go index c335ec137e..5006261ca3 100644 --- a/eth/core/types/transaction.rlpgen.go +++ b/eth/core/types/transaction.rlpgen.go @@ -1,8 +1,5 @@ // Code generated by rlpgen. DO NOT EDIT. -//go:build !norlpgen -// +build !norlpgen - package types import "github.com/ethereum/go-ethereum/common" diff --git a/go.work.sum b/go.work.sum index 5518e202bb..92032792cf 100644 --- a/go.work.sum +++ b/go.work.sum @@ -186,6 +186,7 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -207,7 +208,6 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= @@ -244,6 +244,8 @@ github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/ github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= +github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= +github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= diff --git a/magefiles/constants.go b/magefiles/constants.go index b77b986728..c42e98d3b0 100644 --- a/magefiles/constants.go +++ b/magefiles/constants.go @@ -58,6 +58,7 @@ var ( goWorkSync = RunCmdV("go", "work", "sync") gitDiff = RunCmdV("git", "diff", "--stat", "--exit-code", ".", "':(exclude)*.mod' ':(exclude)*.sum'") + mockery = RunCmdV("mockery") ) /* -------------------------------------------------------------------------- */ diff --git a/magefiles/go.mod b/magefiles/go.mod index 3c1a375afb..28ad428b8d 100644 --- a/magefiles/go.mod +++ b/magefiles/go.mod @@ -14,6 +14,7 @@ require ( github.com/onsi/ginkgo/v2 v2.12.1 github.com/securego/gosec/v2 v2.17.0 github.com/segmentio/golines v0.11.0 + github.com/vektra/mockery/v2 v2.34.1 ) require ( @@ -63,6 +64,7 @@ require ( github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect + github.com/chigopher/pathlib v0.15.0 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect @@ -158,6 +160,7 @@ require ( github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/huin/goupnp v1.3.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.3 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect @@ -167,6 +170,7 @@ require ( github.com/jgautheron/goconst v1.5.1 // indirect github.com/jhump/protoreflect v1.15.2 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect + github.com/jinzhu/copier v0.3.5 // indirect github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julz/importas v0.1.0 // indirect @@ -234,6 +238,7 @@ require ( github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.9.0 // indirect + github.com/rs/zerolog v1.30.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryancurrah/gomodguard v1.3.0 // indirect github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect diff --git a/magefiles/go.sum b/magefiles/go.sum index f7abd4e743..eb6041b700 100644 --- a/magefiles/go.sum +++ b/magefiles/go.sum @@ -160,6 +160,8 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chigopher/pathlib v0.15.0 h1:1pg96WL3iC1/YyWV4UJSl3E0GBf4B+h5amBtsbAAieY= +github.com/chigopher/pathlib v0.15.0/go.mod h1:3+YPPV21mU9vyw8Mjp+F33CyCfE6iOzinpiqBcccv7I= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -183,6 +185,7 @@ github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cosmos/gosec/v2 v2.0.0-20230124142343-bf28a33fadf2 h1:4mZery7L3ltSRUP0dKlJ5mIW7yi2hQcQsBjBYtlNxNI= github.com/cosmos/gosec/v2 v2.0.0-20230124142343-bf28a33fadf2/go.mod h1:NV9RgyPGw3QjOHYKmruHuejnCZ9+fwBDruxTxJf2gak= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= @@ -332,6 +335,7 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= @@ -486,6 +490,8 @@ github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZm github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -507,6 +513,8 @@ github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIU github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -593,6 +601,7 @@ github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwM github.com/matryer/moq v0.3.2 h1:z7oltmpTxiQ9nKNg0Jc7z45TM+eO7OhCVohxRxwaudM= github.com/matryer/moq v0.3.2/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -744,6 +753,9 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= @@ -876,6 +888,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= +github.com/vektra/mockery/v2 v2.34.1 h1:H+wO4wTRlBjdY3yFUjv53GazCaDSEfhRKJugyo2aoNc= +github.com/vektra/mockery/v2 v2.34.1/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= diff --git a/magefiles/setup/setup.go b/magefiles/setup/setup.go index ec9c07454a..50ca6858fd 100644 --- a/magefiles/setup/setup.go +++ b/magefiles/setup/setup.go @@ -45,9 +45,10 @@ var ( golines = "github.com/segmentio/golines" rlpgen = "github.com/ethereum/go-ethereum/rlp/rlpgen" abigen = "github.com/ethereum/go-ethereum/cmd/abigen" + mockery = "github.com/vektra/mockery/v2" ciTools = []string{buf, gosec, golangcilint, addlicense, ginkgo, golines} - allTools = append(ciTools, []string{moq, rlpgen, abigen}...) + allTools = append(ciTools, []string{moq, rlpgen, abigen, mockery}...) ) // Setup runs the setup script for the current OS. diff --git a/magefiles/tools.go b/magefiles/tools.go index 45f98b5323..e35bcdc2cc 100644 --- a/magefiles/tools.go +++ b/magefiles/tools.go @@ -39,6 +39,10 @@ import ( // Runs `go generate` on the entire project. func Generate() error { + utils.LogGreen("Running 'mockery'") + if err := mockery(); err != nil { + return err + } utils.LogGreen("Running 'go generate' on the entire project...") if err := goInstall(moq); err != nil { return err diff --git a/magefiles/tools/tools.go b/magefiles/tools/tools.go index 43ce69a777..842810be79 100644 --- a/magefiles/tools/tools.go +++ b/magefiles/tools/tools.go @@ -45,4 +45,5 @@ import ( _ "github.com/onsi/ginkgo/v2/ginkgo" _ "github.com/securego/gosec/v2/cmd/gosec" _ "github.com/segmentio/golines" + _ "github.com/vektra/mockery/v2" ) From 6ac34655d95385a973777c00c634ca946cfc6617 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 29 Sep 2023 12:08:03 -0400 Subject: [PATCH 039/122] chore(repo): `x/evm/store -> store` --- cosmos/{x/evm => }/store/cachekv/readonly_store.go | 0 cosmos/{x/evm => }/store/cachekv/readonly_store_test.go | 2 +- cosmos/{x/evm => }/store/snapmulti/store.go | 2 +- cosmos/{x/evm => }/store/snapmulti/store_test.go | 0 cosmos/x/evm/plugins/state/plugin.go | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename cosmos/{x/evm => }/store/cachekv/readonly_store.go (100%) rename cosmos/{x/evm => }/store/cachekv/readonly_store_test.go (97%) rename cosmos/{x/evm => }/store/snapmulti/store.go (98%) rename cosmos/{x/evm => }/store/snapmulti/store_test.go (100%) diff --git a/cosmos/x/evm/store/cachekv/readonly_store.go b/cosmos/store/cachekv/readonly_store.go similarity index 100% rename from cosmos/x/evm/store/cachekv/readonly_store.go rename to cosmos/store/cachekv/readonly_store.go diff --git a/cosmos/x/evm/store/cachekv/readonly_store_test.go b/cosmos/store/cachekv/readonly_store_test.go similarity index 97% rename from cosmos/x/evm/store/cachekv/readonly_store_test.go rename to cosmos/store/cachekv/readonly_store_test.go index afcd1cd210..427a70f5cd 100644 --- a/cosmos/x/evm/store/cachekv/readonly_store_test.go +++ b/cosmos/store/cachekv/readonly_store_test.go @@ -26,8 +26,8 @@ import ( sdkcachekv "cosmossdk.io/store/cachekv" storetypes "cosmossdk.io/store/types" + "pkg.berachain.dev/polaris/cosmos/store/cachekv" "pkg.berachain.dev/polaris/cosmos/testing/types/mock" - "pkg.berachain.dev/polaris/cosmos/x/evm/store/cachekv" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" diff --git a/cosmos/x/evm/store/snapmulti/store.go b/cosmos/store/snapmulti/store.go similarity index 98% rename from cosmos/x/evm/store/snapmulti/store.go rename to cosmos/store/snapmulti/store.go index f7383e8618..842d253dfa 100644 --- a/cosmos/x/evm/store/snapmulti/store.go +++ b/cosmos/store/snapmulti/store.go @@ -24,7 +24,7 @@ import ( "cosmossdk.io/store/cachekv" storetypes "cosmossdk.io/store/types" - polariscachekv "pkg.berachain.dev/polaris/cosmos/x/evm/store/cachekv" + polariscachekv "pkg.berachain.dev/polaris/cosmos/store/cachekv" "pkg.berachain.dev/polaris/lib/ds" "pkg.berachain.dev/polaris/lib/ds/stack" "pkg.berachain.dev/polaris/lib/utils" diff --git a/cosmos/x/evm/store/snapmulti/store_test.go b/cosmos/store/snapmulti/store_test.go similarity index 100% rename from cosmos/x/evm/store/snapmulti/store_test.go rename to cosmos/store/snapmulti/store_test.go diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index bf6504c8f7..797fee06a2 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -30,9 +30,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "pkg.berachain.dev/polaris/cosmos/store/snapmulti" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events" - "pkg.berachain.dev/polaris/cosmos/x/evm/store/snapmulti" "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" From b6f379d343247e29f3d3f71579937cd6e16cb62b Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 29 Sep 2023 13:19:07 -0400 Subject: [PATCH 040/122] feat(txpool): `sdkmempool.Mempool` wrapper. (#1160) --- .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- cosmos/txpool/handler.go | 20 +++ cosmos/txpool/mempool.go | 88 +++++++++++ cosmos/txpool/mempool_test.go | 90 ++++++++++++ cosmos/txpool/mocks/geth_tx_pool.go | 133 +++++++++++++++++ cosmos/txpool/mocks/handler.go | 137 ++++++++++++++++++ cosmos/txpool/mocks/sdk_tx.go | 133 +++++++++++++++++ cosmos/txpool/mocks/tx_serializer.go | 55 +++++++ 14 files changed, 663 insertions(+), 7 deletions(-) create mode 100644 cosmos/txpool/mempool.go create mode 100644 cosmos/txpool/mempool_test.go create mode 100644 cosmos/txpool/mocks/geth_tx_pool.go create mode 100644 cosmos/txpool/mocks/handler.go create mode 100644 cosmos/txpool/mocks/sdk_tx.go diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index c4ee848a6d..8ae378d30f 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -53,7 +53,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102118061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631acc976f146100435780632ff6e5df1461005f578063426ce1a91461007b575b5f80fd5b61005d600480360381019061005891906100ca565b610097565b005b6100796004803603810190610074919061012f565b61009a565b005b61009560048036038101906100909190610194565b61009d565b005b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f60a082840312156100c1576100c06100a8565b5b81905092915050565b5f602082840312156100df576100de6100a0565b5b5f82013567ffffffffffffffff8111156100fc576100fb6100a4565b5b610108848285016100ac565b91505092915050565b5f60408284031215610126576101256100a8565b5b81905092915050565b5f60208284031215610144576101436100a0565b5b5f82013567ffffffffffffffff811115610161576101606100a4565b5b61016d84828501610111565b91505092915050565b5f6040828403121561018b5761018a6100a8565b5b81905092915050565b5f602082840312156101a9576101a86100a0565b5b5f82013567ffffffffffffffff8111156101c6576101c56100a4565b5b6101d284828501610176565b9150509291505056fea264697066735822122015e30edb9e27c41d56fb4bfa53a31f05390368387a2fc2162a847aff41cbd03f64736f6c63430008140033", + Bin: "0x608060405234801561000f575f80fd5b506102118061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631acc976f146100435780632ff6e5df1461005f578063426ce1a91461007b575b5f80fd5b61005d600480360381019061005891906100ca565b610097565b005b6100796004803603810190610074919061012f565b61009a565b005b61009560048036038101906100909190610194565b61009d565b005b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f60a082840312156100c1576100c06100a8565b5b81905092915050565b5f602082840312156100df576100de6100a0565b5b5f82013567ffffffffffffffff8111156100fc576100fb6100a4565b5b610108848285016100ac565b91505092915050565b5f60408284031215610126576101256100a8565b5b81905092915050565b5f60208284031215610144576101436100a0565b5b5f82013567ffffffffffffffff811115610161576101606100a4565b5b61016d84828501610111565b91505092915050565b5f6040828403121561018b5761018a6100a8565b5b81905092915050565b5f602082840312156101a9576101a86100a0565b5b5f82013567ffffffffffffffff8111156101c6576101c56100a4565b5b6101d284828501610176565b9150509291505056fea26469706673582212209aab16f351eb9960748ce609cf022485ffc8384536c515505e4e7382a8e40a2264736f6c63430008150033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index e6a63d51a6..7f38d198c2 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220cf53a89b858bcd89a9f376c9fc26e35242e2b2c6d3caa86630baa63414ba767d64736f6c63430008140033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index 7b666b0450..d93b55b6c7 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212202e148d4d850cdba2cbe51678ae1a7f68fe0fa2f96b110fc952cd1dda2cd446f064736f6c63430008140033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220cde67f8d39a80b562a47d0eb927cf26fff03e14a2b87ad2fc525d455d27a95f964736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index 18c2f176af..ab4698628c 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -63,7 +63,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proposal\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b5060405162001ec038038062001ec083398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051611ce9620001d75f395f6104e90152611ce95ff3fe608060405260043610610073575f3560e01c8063566fbd001161004d578063566fbd001461012157806376cdb03b14610151578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061094a565b6101f3565b6040516100b191906109d0565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a63565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a7c565b6102bd565b604051610118929190610ab6565b60405180910390f35b61013b60048036038101906101369190610bc2565b61035f565b6040516101489190610c53565b60405180910390f35b34801561015c575f80fd5b506101656104e7565b6040516101729190610c8c565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610ca5565b61050b565b6040516101ae919061112e565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a7c565b6105c0565b6040516101ea919061128e565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611305565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061136b565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c53565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906113aa565b91509150915091565b5f80600167ffffffffffffffff81111561037c5761037b610826565b5b6040519080825280602002602001820160405280156103b557816020015b6103a2610669565b81526020019060019003908161039a5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061040f5761040e6113e8565b5b60200260200101516020018190525082815f81518110610432576104316113e8565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d238313688886040518363ffffffff1660e01b815260040161049b929190611451565b6020604051808303815f875af11580156104b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104db9190611473565b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610515610682565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b8152600401610571929190611520565b5f60405180830381865afa15801561058b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b39190611bf6565b5090508092505050919050565b6105c86106c5565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b81526004016106209190610c53565b5f60405180830381865afa15801561063a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106629190611c6c565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f9610762565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b78161079b565b81146107c1575f80fd5b50565b5f813590506107d2816107ae565b92915050565b5f8160030b9050919050565b6107ed816107d8565b81146107f7575f80fd5b50565b5f81359050610808816107e4565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085c82610816565b810181811067ffffffffffffffff8211171561087b5761087a610826565b5b80604052505050565b5f61088d61078a565b90506108998282610853565b919050565b5f67ffffffffffffffff8211156108b8576108b7610826565b5b6108c182610816565b9050602081019050919050565b828183375f83830152505050565b5f6108ee6108e98461089e565b610884565b90508281526020810184848401111561090a57610909610812565b5b6109158482856108ce565b509392505050565b5f82601f8301126109315761093061080e565b5b81356109418482602086016108dc565b91505092915050565b5f805f6060848603121561096157610960610793565b5b5f61096e868287016107c4565b935050602061097f868287016107fa565b925050604084013567ffffffffffffffff8111156109a05761099f610797565b5b6109ac8682870161091d565b9150509250925092565b5f8115159050919050565b6109ca816109b6565b82525050565b5f6020820190506109e35f8301846109c1565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a2b610a26610a21846109e9565b610a08565b6109e9565b9050919050565b5f610a3c82610a11565b9050919050565b5f610a4d82610a32565b9050919050565b610a5d81610a43565b82525050565b5f602082019050610a765f830184610a54565b92915050565b5f60208284031215610a9157610a90610793565b5b5f610a9e848285016107c4565b91505092915050565b610ab08161079b565b82525050565b5f604082019050610ac95f830185610aa7565b610ad66020830184610aa7565b9392505050565b5f80fd5b5f80fd5b5f8083601f840112610afa57610af961080e565b5b8235905067ffffffffffffffff811115610b1757610b16610add565b5b602083019150836001820283011115610b3357610b32610ae1565b5b9250929050565b5f8083601f840112610b4f57610b4e61080e565b5b8235905067ffffffffffffffff811115610b6c57610b6b610add565b5b602083019150836001820283011115610b8857610b87610ae1565b5b9250929050565b5f819050919050565b610ba181610b8f565b8114610bab575f80fd5b50565b5f81359050610bbc81610b98565b92915050565b5f805f805f60608688031215610bdb57610bda610793565b5b5f86013567ffffffffffffffff811115610bf857610bf7610797565b5b610c0488828901610ae5565b9550955050602086013567ffffffffffffffff811115610c2757610c26610797565b5b610c3388828901610b3a565b93509350506040610c4688828901610bae565b9150509295509295909350565b5f602082019050610c665f830184610aa7565b92915050565b5f610c7682610a32565b9050919050565b610c8681610c6c565b82525050565b5f602082019050610c9f5f830184610c7d565b92915050565b5f60208284031215610cba57610cb9610793565b5b5f610cc7848285016107fa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610d028161079b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d3f578082015181840152602081019050610d24565b5f8484015250505050565b5f610d5482610d08565b610d5e8185610d12565b9350610d6e818560208601610d22565b610d7781610816565b840191505092915050565b610d8b816107d8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610db582610d91565b610dbf8185610d9b565b9350610dcf818560208601610d22565b610dd881610816565b840191505092915050565b5f608083015f8301518482035f860152610dfd8282610dab565b91505060208301518482036020860152610e178282610dab565b91505060408301518482036040860152610e318282610dab565b91505060608301518482036060860152610e4b8282610dab565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610e8a81610b8f565b82525050565b5f604083015f830151610ea55f860182610e81565b5060208301518482036020860152610ebd8282610dab565b9150508091505092915050565b5f610ed58383610e90565b905092915050565b5f602082019050919050565b5f610ef382610e58565b610efd8185610e62565b935083602082028501610f0f85610e72565b805f5b85811015610f4a5784840389528151610f2b8582610eca565b9450610f3683610edd565b925060208a01995050600181019050610f12565b50829750879550505050505092915050565b5f6101a083015f830151610f725f860182610cf9565b5060208301518482036020860152610f8a8282610d4a565b9150506040830151610f9f6040860182610d82565b5060608301518482036060860152610fb78282610de3565b9150506080830151610fcc6080860182610cf9565b5060a0830151610fdf60a0860182610cf9565b5060c083015184820360c0860152610ff78282610ee9565b91505060e083015161100c60e0860182610cf9565b50610100830151611021610100860182610cf9565b5061012083015184820361012086015261103b8282610dab565b9150506101408301518482036101408601526110578282610dab565b9150506101608301518482036101608601526110738282610dab565b91505061018083015184820361018086015261108f8282610dab565b9150508091505092915050565b5f6110a78383610f5c565b905092915050565b5f602082019050919050565b5f6110c582610cd0565b6110cf8185610cda565b9350836020820285016110e185610cea565b805f5b8581101561111c57848403895281516110fd858261109c565b9450611108836110af565b925060208a019950506001810190506110e4565b50829750879550505050505092915050565b5f6020820190508181035f83015261114681846110bb565b905092915050565b5f6101a083015f8301516111645f860182610cf9565b506020830151848203602086015261117c8282610d4a565b91505060408301516111916040860182610d82565b50606083015184820360608601526111a98282610de3565b91505060808301516111be6080860182610cf9565b5060a08301516111d160a0860182610cf9565b5060c083015184820360c08601526111e98282610ee9565b91505060e08301516111fe60e0860182610cf9565b50610100830151611213610100860182610cf9565b5061012083015184820361012086015261122d8282610dab565b9150506101408301518482036101408601526112498282610dab565b9150506101608301518482036101608601526112658282610dab565b9150506101808301518482036101808601526112818282610dab565b9150508091505092915050565b5f6020820190508181035f8301526112a6818461114e565b905092915050565b6112b7816107d8565b82525050565b5f82825260208201905092915050565b5f6112d782610d91565b6112e181856112bd565b93506112f1818560208601610d22565b6112fa81610816565b840191505092915050565b5f6060820190506113185f830186610aa7565b61132560208301856112ae565b818103604083015261133781846112cd565b9050949350505050565b61134a816109b6565b8114611354575f80fd5b50565b5f8151905061136581611341565b92915050565b5f602082840312156113805761137f610793565b5b5f61138d84828501611357565b91505092915050565b5f815190506113a4816107ae565b92915050565b5f80604083850312156113c0576113bf610793565b5b5f6113cd85828601611396565b92505060206113de85828601611396565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6114308385611415565b935061143d8385846108ce565b61144683610816565b840190509392505050565b5f6020820190508181035f83015261146a818486611425565b90509392505050565b5f6020828403121561148857611487610793565b5b5f61149584828501611396565b91505092915050565b6114a7816109b6565b82525050565b5f60a083015f8301518482035f8601526114c78282610dab565b91505060208301516114dc6020860182610cf9565b5060408301516114ef6040860182610cf9565b506060830151611502606086018261149e565b506080830151611515608086018261149e565b508091505092915050565b5f6040820190506115335f8301856112ae565b818103602083015261154581846114ad565b90509392505050565b5f67ffffffffffffffff82111561156857611567610826565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff82111561159b5761159a610826565b5b6115a482610816565b9050602081019050919050565b5f6115c36115be84611581565b610884565b9050828152602081018484840111156115df576115de610812565b5b6115ea848285610d22565b509392505050565b5f82601f8301126116065761160561080e565b5b81516116168482602086016115b1565b91505092915050565b5f8151905061162d816107e4565b92915050565b5f6116456116408461089e565b610884565b90508281526020810184848401111561166157611660610812565b5b61166c848285610d22565b509392505050565b5f82601f8301126116885761168761080e565b5b8151611698848260208601611633565b91505092915050565b5f608082840312156116b6576116b5611579565b5b6116c06080610884565b90505f82015167ffffffffffffffff8111156116df576116de61157d565b5b6116eb84828501611674565b5f83015250602082015167ffffffffffffffff81111561170e5761170d61157d565b5b61171a84828501611674565b602083015250604082015167ffffffffffffffff81111561173e5761173d61157d565b5b61174a84828501611674565b604083015250606082015167ffffffffffffffff81111561176e5761176d61157d565b5b61177a84828501611674565b60608301525092915050565b5f67ffffffffffffffff8211156117a05761179f610826565b5b602082029050602081019050919050565b5f815190506117bf81610b98565b92915050565b5f604082840312156117da576117d9611579565b5b6117e46040610884565b90505f6117f3848285016117b1565b5f83015250602082015167ffffffffffffffff8111156118165761181561157d565b5b61182284828501611674565b60208301525092915050565b5f61184061183b84611786565b610884565b9050808382526020820190506020840283018581111561186357611862610ae1565b5b835b818110156118aa57805167ffffffffffffffff8111156118885761188761080e565b5b80860161189589826117c5565b85526020850194505050602081019050611865565b5050509392505050565b5f82601f8301126118c8576118c761080e565b5b81516118d884826020860161182e565b91505092915050565b5f6101a082840312156118f7576118f6611579565b5b6119026101a0610884565b90505f61191184828501611396565b5f83015250602082015167ffffffffffffffff8111156119345761193361157d565b5b611940848285016115f2565b60208301525060406119548482850161161f565b604083015250606082015167ffffffffffffffff8111156119785761197761157d565b5b611984848285016116a1565b606083015250608061199884828501611396565b60808301525060a06119ac84828501611396565b60a08301525060c082015167ffffffffffffffff8111156119d0576119cf61157d565b5b6119dc848285016118b4565b60c08301525060e06119f084828501611396565b60e083015250610100611a0584828501611396565b6101008301525061012082015167ffffffffffffffff811115611a2b57611a2a61157d565b5b611a3784828501611674565b6101208301525061014082015167ffffffffffffffff811115611a5d57611a5c61157d565b5b611a6984828501611674565b6101408301525061016082015167ffffffffffffffff811115611a8f57611a8e61157d565b5b611a9b84828501611674565b6101608301525061018082015167ffffffffffffffff811115611ac157611ac061157d565b5b611acd84828501611674565b6101808301525092915050565b5f611aec611ae78461154e565b610884565b90508083825260208201905060208402830185811115611b0f57611b0e610ae1565b5b835b81811015611b5657805167ffffffffffffffff811115611b3457611b3361080e565b5b808601611b4189826118e1565b85526020850194505050602081019050611b11565b5050509392505050565b5f82601f830112611b7457611b7361080e565b5b8151611b84848260208601611ada565b91505092915050565b5f60408284031215611ba257611ba1611579565b5b611bac6040610884565b90505f82015167ffffffffffffffff811115611bcb57611bca61157d565b5b611bd784828501611674565b5f830152506020611bea84828501611396565b60208301525092915050565b5f8060408385031215611c0c57611c0b610793565b5b5f83015167ffffffffffffffff811115611c2957611c28610797565b5b611c3585828601611b60565b925050602083015167ffffffffffffffff811115611c5657611c55610797565b5b611c6285828601611b8d565b9150509250929050565b5f60208284031215611c8157611c80610793565b5b5f82015167ffffffffffffffff811115611c9e57611c9d610797565b5b611caa848285016118e1565b9150509291505056fea26469706673582212200f262c3e6b8ff76d92a1e14eccc8782c65e08fa4ac303d2cc597f07cbb2108e564736f6c63430008140033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b5060405162001ec038038062001ec083398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051611ce9620001d75f395f6104e90152611ce95ff3fe608060405260043610610073575f3560e01c8063566fbd001161004d578063566fbd001461012157806376cdb03b14610151578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061094a565b6101f3565b6040516100b191906109d0565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a63565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a7c565b6102bd565b604051610118929190610ab6565b60405180910390f35b61013b60048036038101906101369190610bc2565b61035f565b6040516101489190610c53565b60405180910390f35b34801561015c575f80fd5b506101656104e7565b6040516101729190610c8c565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610ca5565b61050b565b6040516101ae919061112e565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a7c565b6105c0565b6040516101ea919061128e565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611305565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061136b565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c53565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906113aa565b91509150915091565b5f80600167ffffffffffffffff81111561037c5761037b610826565b5b6040519080825280602002602001820160405280156103b557816020015b6103a2610669565b81526020019060019003908161039a5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061040f5761040e6113e8565b5b60200260200101516020018190525082815f81518110610432576104316113e8565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d238313688886040518363ffffffff1660e01b815260040161049b929190611451565b6020604051808303815f875af11580156104b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104db9190611473565b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610515610682565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b8152600401610571929190611520565b5f60405180830381865afa15801561058b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b39190611bf6565b5090508092505050919050565b6105c86106c5565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b81526004016106209190610c53565b5f60405180830381865afa15801561063a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106629190611c6c565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f9610762565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b78161079b565b81146107c1575f80fd5b50565b5f813590506107d2816107ae565b92915050565b5f8160030b9050919050565b6107ed816107d8565b81146107f7575f80fd5b50565b5f81359050610808816107e4565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085c82610816565b810181811067ffffffffffffffff8211171561087b5761087a610826565b5b80604052505050565b5f61088d61078a565b90506108998282610853565b919050565b5f67ffffffffffffffff8211156108b8576108b7610826565b5b6108c182610816565b9050602081019050919050565b828183375f83830152505050565b5f6108ee6108e98461089e565b610884565b90508281526020810184848401111561090a57610909610812565b5b6109158482856108ce565b509392505050565b5f82601f8301126109315761093061080e565b5b81356109418482602086016108dc565b91505092915050565b5f805f6060848603121561096157610960610793565b5b5f61096e868287016107c4565b935050602061097f868287016107fa565b925050604084013567ffffffffffffffff8111156109a05761099f610797565b5b6109ac8682870161091d565b9150509250925092565b5f8115159050919050565b6109ca816109b6565b82525050565b5f6020820190506109e35f8301846109c1565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a2b610a26610a21846109e9565b610a08565b6109e9565b9050919050565b5f610a3c82610a11565b9050919050565b5f610a4d82610a32565b9050919050565b610a5d81610a43565b82525050565b5f602082019050610a765f830184610a54565b92915050565b5f60208284031215610a9157610a90610793565b5b5f610a9e848285016107c4565b91505092915050565b610ab08161079b565b82525050565b5f604082019050610ac95f830185610aa7565b610ad66020830184610aa7565b9392505050565b5f80fd5b5f80fd5b5f8083601f840112610afa57610af961080e565b5b8235905067ffffffffffffffff811115610b1757610b16610add565b5b602083019150836001820283011115610b3357610b32610ae1565b5b9250929050565b5f8083601f840112610b4f57610b4e61080e565b5b8235905067ffffffffffffffff811115610b6c57610b6b610add565b5b602083019150836001820283011115610b8857610b87610ae1565b5b9250929050565b5f819050919050565b610ba181610b8f565b8114610bab575f80fd5b50565b5f81359050610bbc81610b98565b92915050565b5f805f805f60608688031215610bdb57610bda610793565b5b5f86013567ffffffffffffffff811115610bf857610bf7610797565b5b610c0488828901610ae5565b9550955050602086013567ffffffffffffffff811115610c2757610c26610797565b5b610c3388828901610b3a565b93509350506040610c4688828901610bae565b9150509295509295909350565b5f602082019050610c665f830184610aa7565b92915050565b5f610c7682610a32565b9050919050565b610c8681610c6c565b82525050565b5f602082019050610c9f5f830184610c7d565b92915050565b5f60208284031215610cba57610cb9610793565b5b5f610cc7848285016107fa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610d028161079b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d3f578082015181840152602081019050610d24565b5f8484015250505050565b5f610d5482610d08565b610d5e8185610d12565b9350610d6e818560208601610d22565b610d7781610816565b840191505092915050565b610d8b816107d8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610db582610d91565b610dbf8185610d9b565b9350610dcf818560208601610d22565b610dd881610816565b840191505092915050565b5f608083015f8301518482035f860152610dfd8282610dab565b91505060208301518482036020860152610e178282610dab565b91505060408301518482036040860152610e318282610dab565b91505060608301518482036060860152610e4b8282610dab565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610e8a81610b8f565b82525050565b5f604083015f830151610ea55f860182610e81565b5060208301518482036020860152610ebd8282610dab565b9150508091505092915050565b5f610ed58383610e90565b905092915050565b5f602082019050919050565b5f610ef382610e58565b610efd8185610e62565b935083602082028501610f0f85610e72565b805f5b85811015610f4a5784840389528151610f2b8582610eca565b9450610f3683610edd565b925060208a01995050600181019050610f12565b50829750879550505050505092915050565b5f6101a083015f830151610f725f860182610cf9565b5060208301518482036020860152610f8a8282610d4a565b9150506040830151610f9f6040860182610d82565b5060608301518482036060860152610fb78282610de3565b9150506080830151610fcc6080860182610cf9565b5060a0830151610fdf60a0860182610cf9565b5060c083015184820360c0860152610ff78282610ee9565b91505060e083015161100c60e0860182610cf9565b50610100830151611021610100860182610cf9565b5061012083015184820361012086015261103b8282610dab565b9150506101408301518482036101408601526110578282610dab565b9150506101608301518482036101608601526110738282610dab565b91505061018083015184820361018086015261108f8282610dab565b9150508091505092915050565b5f6110a78383610f5c565b905092915050565b5f602082019050919050565b5f6110c582610cd0565b6110cf8185610cda565b9350836020820285016110e185610cea565b805f5b8581101561111c57848403895281516110fd858261109c565b9450611108836110af565b925060208a019950506001810190506110e4565b50829750879550505050505092915050565b5f6020820190508181035f83015261114681846110bb565b905092915050565b5f6101a083015f8301516111645f860182610cf9565b506020830151848203602086015261117c8282610d4a565b91505060408301516111916040860182610d82565b50606083015184820360608601526111a98282610de3565b91505060808301516111be6080860182610cf9565b5060a08301516111d160a0860182610cf9565b5060c083015184820360c08601526111e98282610ee9565b91505060e08301516111fe60e0860182610cf9565b50610100830151611213610100860182610cf9565b5061012083015184820361012086015261122d8282610dab565b9150506101408301518482036101408601526112498282610dab565b9150506101608301518482036101608601526112658282610dab565b9150506101808301518482036101808601526112818282610dab565b9150508091505092915050565b5f6020820190508181035f8301526112a6818461114e565b905092915050565b6112b7816107d8565b82525050565b5f82825260208201905092915050565b5f6112d782610d91565b6112e181856112bd565b93506112f1818560208601610d22565b6112fa81610816565b840191505092915050565b5f6060820190506113185f830186610aa7565b61132560208301856112ae565b818103604083015261133781846112cd565b9050949350505050565b61134a816109b6565b8114611354575f80fd5b50565b5f8151905061136581611341565b92915050565b5f602082840312156113805761137f610793565b5b5f61138d84828501611357565b91505092915050565b5f815190506113a4816107ae565b92915050565b5f80604083850312156113c0576113bf610793565b5b5f6113cd85828601611396565b92505060206113de85828601611396565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6114308385611415565b935061143d8385846108ce565b61144683610816565b840190509392505050565b5f6020820190508181035f83015261146a818486611425565b90509392505050565b5f6020828403121561148857611487610793565b5b5f61149584828501611396565b91505092915050565b6114a7816109b6565b82525050565b5f60a083015f8301518482035f8601526114c78282610dab565b91505060208301516114dc6020860182610cf9565b5060408301516114ef6040860182610cf9565b506060830151611502606086018261149e565b506080830151611515608086018261149e565b508091505092915050565b5f6040820190506115335f8301856112ae565b818103602083015261154581846114ad565b90509392505050565b5f67ffffffffffffffff82111561156857611567610826565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff82111561159b5761159a610826565b5b6115a482610816565b9050602081019050919050565b5f6115c36115be84611581565b610884565b9050828152602081018484840111156115df576115de610812565b5b6115ea848285610d22565b509392505050565b5f82601f8301126116065761160561080e565b5b81516116168482602086016115b1565b91505092915050565b5f8151905061162d816107e4565b92915050565b5f6116456116408461089e565b610884565b90508281526020810184848401111561166157611660610812565b5b61166c848285610d22565b509392505050565b5f82601f8301126116885761168761080e565b5b8151611698848260208601611633565b91505092915050565b5f608082840312156116b6576116b5611579565b5b6116c06080610884565b90505f82015167ffffffffffffffff8111156116df576116de61157d565b5b6116eb84828501611674565b5f83015250602082015167ffffffffffffffff81111561170e5761170d61157d565b5b61171a84828501611674565b602083015250604082015167ffffffffffffffff81111561173e5761173d61157d565b5b61174a84828501611674565b604083015250606082015167ffffffffffffffff81111561176e5761176d61157d565b5b61177a84828501611674565b60608301525092915050565b5f67ffffffffffffffff8211156117a05761179f610826565b5b602082029050602081019050919050565b5f815190506117bf81610b98565b92915050565b5f604082840312156117da576117d9611579565b5b6117e46040610884565b90505f6117f3848285016117b1565b5f83015250602082015167ffffffffffffffff8111156118165761181561157d565b5b61182284828501611674565b60208301525092915050565b5f61184061183b84611786565b610884565b9050808382526020820190506020840283018581111561186357611862610ae1565b5b835b818110156118aa57805167ffffffffffffffff8111156118885761188761080e565b5b80860161189589826117c5565b85526020850194505050602081019050611865565b5050509392505050565b5f82601f8301126118c8576118c761080e565b5b81516118d884826020860161182e565b91505092915050565b5f6101a082840312156118f7576118f6611579565b5b6119026101a0610884565b90505f61191184828501611396565b5f83015250602082015167ffffffffffffffff8111156119345761193361157d565b5b611940848285016115f2565b60208301525060406119548482850161161f565b604083015250606082015167ffffffffffffffff8111156119785761197761157d565b5b611984848285016116a1565b606083015250608061199884828501611396565b60808301525060a06119ac84828501611396565b60a08301525060c082015167ffffffffffffffff8111156119d0576119cf61157d565b5b6119dc848285016118b4565b60c08301525060e06119f084828501611396565b60e083015250610100611a0584828501611396565b6101008301525061012082015167ffffffffffffffff811115611a2b57611a2a61157d565b5b611a3784828501611674565b6101208301525061014082015167ffffffffffffffff811115611a5d57611a5c61157d565b5b611a6984828501611674565b6101408301525061016082015167ffffffffffffffff811115611a8f57611a8e61157d565b5b611a9b84828501611674565b6101608301525061018082015167ffffffffffffffff811115611ac157611ac061157d565b5b611acd84828501611674565b6101808301525092915050565b5f611aec611ae78461154e565b610884565b90508083825260208201905060208402830185811115611b0f57611b0e610ae1565b5b835b81811015611b5657805167ffffffffffffffff811115611b3457611b3361080e565b5b808601611b4189826118e1565b85526020850194505050602081019050611b11565b5050509392505050565b5f82601f830112611b7457611b7361080e565b5b8151611b84848260208601611ada565b91505092915050565b5f60408284031215611ba257611ba1611579565b5b611bac6040610884565b90505f82015167ffffffffffffffff811115611bcb57611bca61157d565b5b611bd784828501611674565b5f830152506020611bea84828501611396565b60208301525092915050565b5f8060408385031215611c0c57611c0b610793565b5b5f83015167ffffffffffffffff811115611c2957611c28610797565b5b611c3585828601611b60565b925050602083015167ffffffffffffffff811115611c5657611c55610797565b5b611c6285828601611b8d565b9150509250929050565b5f60208284031215611c8157611c80610793565b5b5f82015167ffffffffffffffff811115611c9e57611c9d610797565b5b611caa848285016118e1565b9150509291505056fea2646970667358221220da8f16972d0cd9d19a50f85d4b99f4471a098bbe3528987ff5e29119a7e43d1064736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 3564e4d877..93701ebe01 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea26469706673582212203dcda167560f1c8fb3c11f4a89b20e181e1e50d985f93a819a0df6da03697e7564736f6c63430008140033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220079e02caa6bbbf9e48d6a5926442bfcc806d49e3f57c6b4bc5723a5f1b8ed36b64736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index 6de916b489..b9a898365f 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220a82988036ad4b985661f0390de6424b0e38ace000700a265b64053cd745ef6a664736f6c63430008140033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122039725cd7e0fb643ea87b00765a9952cab02ff3d77839f1609f570b90cbc41ed164736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index 044cae7c79..c218458a7f 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212205e042b28d312604c9eb9f461fa6a115a942807f99d76a60aa48515134e1ded3e64736f6c63430008140033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212202f9e989e9b2ff3a4fcaad72685a6f794dee6f5c95219c347a03a27bdad80c1f864736f6c63430008150033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index 763ceafd5a..4c97fc7e01 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -37,6 +37,11 @@ import ( // size of tx pool. const txChanSize = 4096 +// SdkTx is used to generate mocks. +type SdkTx interface { + sdk.Tx +} + // TxSubProvider. type TxSubProvider interface { SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription @@ -44,6 +49,7 @@ type TxSubProvider interface { // TxSerializer provides an interface to Serialize Geth Transactions to Bytes (via sdk.Tx). type TxSerializer interface { + SerializeToSdkTx(signedTx *coretypes.Transaction) (sdk.Tx, error) SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) } @@ -57,6 +63,13 @@ type Subscription interface { event.Subscription } +// Handler exposes a basic interface to utilize the Handler. +type Handler interface { + Start() + Running() bool + Stop() +} + // handler listens for new insertions into the geth txpool and broadcasts them to the CometBFT // layer for p2p and ABCI. type handler struct { @@ -73,6 +86,13 @@ type handler struct { running atomic.Bool } +// NewHandler creates a new Handler. +func NewHandler( + clientCtx Broadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, +) Handler { + return newHandler(clientCtx, txPool, serializer, logger) +} + // newHandler creates a new handler. func newHandler( clientCtx Broadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go new file mode 100644 index 0000000000..e51f515aa8 --- /dev/null +++ b/cosmos/txpool/mempool.go @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import ( + "context" + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/mempool" + + "pkg.berachain.dev/polaris/cosmos/x/evm/types" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/lib/utils" +) + +// Mempool implements the mempool.Mempool interface. +var _ mempool.Mempool = (*Mempool)(nil) + +// GethTxPool represents the interface to interact with the geth txpool. +type GethTxPool interface { + Add([]*coretypes.Transaction, bool, bool) []error + Stats() (int, int) +} + +// Mempool is a mempool that adheres to the cosmos mempool interface. +// It purposefully does not implement `Select` or `Remove` as the purpose of this mempool +// is to allow for transactions coming in from CometBFT's gossip to be added to the underlying +// geth txpool during `CheckTx`, that is the only purpose of `Mempool“. +type Mempool struct { + txpool GethTxPool +} + +// Insert attempts to insert a Tx into the app-side mempool returning +// an error upon failure. +func (m *Mempool) Insert(_ context.Context, sdkTx sdk.Tx) error { + msgs := sdkTx.GetMsgs() + if len(msgs) != 1 { + return errors.New("only one message is supported") + } + + if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); !ok { + return errors.New("only WrappedEthereumTransactions are supported") + } else if errs := m.txpool.Add([]*coretypes.Transaction{wet.AsTransaction()}, false, false); len(errs) != 0 { + return errs[0] + } + + return nil +} + +// SetTxPool sets the underlying txpool. +func (m *Mempool) SetTxPool(txpool GethTxPool) { + m.txpool = txpool +} + +// CountTx returns the number of transactions currently in the mempool. +func (m *Mempool) CountTx() int { + runnable, blocked := m.txpool.Stats() + return runnable + blocked +} + +// Select is an intentional no-op as we use a custom prepare proposal. +func (m *Mempool) Select(context.Context, [][]byte) mempool.Iterator { + return nil +} + +// Remove is an intentional no-op as the eth txpool handles removals. +func (m *Mempool) Remove(sdk.Tx) error { + return nil +} diff --git a/cosmos/txpool/mempool_test.go b/cosmos/txpool/mempool_test.go new file mode 100644 index 0000000000..ac99e3ca1e --- /dev/null +++ b/cosmos/txpool/mempool_test.go @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import ( + "context" + "errors" + + "github.com/stretchr/testify/mock" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "pkg.berachain.dev/polaris/cosmos/txpool/mocks" + evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("", func() { + + var ( + t = GinkgoT() + txPool *mocks.GethTxPool + sdkTx *mocks.SdkTx + mempool *Mempool + ctx = context.Background() + ) + + BeforeEach(func() { + txPool = mocks.NewGethTxPool(t) + sdkTx = mocks.NewSdkTx(t) + mempool = &Mempool{txpool: txPool} + }) + + When("we call insert", func() { + When("the txpool does not error", func() { + It("does not error", func() { + sdkTx.On("GetMsgs").Return([]sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}).Once() + txPool.On("Add", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() + Expect(mempool.Insert(ctx, sdkTx)).ToNot(HaveOccurred()) + }) + }) + When("the txpool errors", func() { + It("does error", func() { + sdkTx.On("GetMsgs").Return([]sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}).Once() + txPool.On("Add", mock.Anything, mock.Anything, mock.Anything).Return([]error{errors.New("mock error")}).Once() + Expect(mempool.Insert(ctx, sdkTx)).To(HaveOccurred()) + }) + }) + When("we use an sdkTx with no messages", func() { + It("errors", func() { + sdkTx.On("GetMsgs").Return([]sdk.Msg{}).Once() + Expect(mempool.Insert(ctx, sdkTx)).To(HaveOccurred()) + }) + }) + When("we use an that is not an ethereum msg", func() { + It("errors", func() { + sdkTx.On("GetMsgs").Return([]sdk.Msg{nil}).Once() + Expect(mempool.Insert(ctx, sdkTx)).To(HaveOccurred()) + }) + }) + }) + + When("we call stats", func() { + It("returns", func() { + txPool.On("Stats").Return(16, 12).Once() + Expect(mempool.CountTx()).To(Equal(28)) + }) + }) +}) diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go new file mode 100644 index 0000000000..9bbefaaaae --- /dev/null +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -0,0 +1,133 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// GethTxPool is an autogenerated mock type for the GethTxPool type +type GethTxPool struct { + mock.Mock +} + +type GethTxPool_Expecter struct { + mock *mock.Mock +} + +func (_m *GethTxPool) EXPECT() *GethTxPool_Expecter { + return &GethTxPool_Expecter{mock: &_m.Mock} +} + +// Add provides a mock function with given fields: _a0, _a1, _a2 +func (_m *GethTxPool) Add(_a0 []*types.Transaction, _a1 bool, _a2 bool) []error { + ret := _m.Called(_a0, _a1, _a2) + + var r0 []error + if rf, ok := ret.Get(0).(func([]*types.Transaction, bool, bool) []error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]error) + } + } + + return r0 +} + +// GethTxPool_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' +type GethTxPool_Add_Call struct { + *mock.Call +} + +// Add is a helper method to define mock.On call +// - _a0 []*types.Transaction +// - _a1 bool +// - _a2 bool +func (_e *GethTxPool_Expecter) Add(_a0 interface{}, _a1 interface{}, _a2 interface{}) *GethTxPool_Add_Call { + return &GethTxPool_Add_Call{Call: _e.mock.On("Add", _a0, _a1, _a2)} +} + +func (_c *GethTxPool_Add_Call) Run(run func(_a0 []*types.Transaction, _a1 bool, _a2 bool)) *GethTxPool_Add_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]*types.Transaction), args[1].(bool), args[2].(bool)) + }) + return _c +} + +func (_c *GethTxPool_Add_Call) Return(_a0 []error) *GethTxPool_Add_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GethTxPool_Add_Call) RunAndReturn(run func([]*types.Transaction, bool, bool) []error) *GethTxPool_Add_Call { + _c.Call.Return(run) + return _c +} + +// Stats provides a mock function with given fields: +func (_m *GethTxPool) Stats() (int, int) { + ret := _m.Called() + + var r0 int + var r1 int + if rf, ok := ret.Get(0).(func() (int, int)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + if rf, ok := ret.Get(1).(func() int); ok { + r1 = rf() + } else { + r1 = ret.Get(1).(int) + } + + return r0, r1 +} + +// GethTxPool_Stats_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stats' +type GethTxPool_Stats_Call struct { + *mock.Call +} + +// Stats is a helper method to define mock.On call +func (_e *GethTxPool_Expecter) Stats() *GethTxPool_Stats_Call { + return &GethTxPool_Stats_Call{Call: _e.mock.On("Stats")} +} + +func (_c *GethTxPool_Stats_Call) Run(run func()) *GethTxPool_Stats_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *GethTxPool_Stats_Call) Return(_a0 int, _a1 int) *GethTxPool_Stats_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *GethTxPool_Stats_Call) RunAndReturn(run func() (int, int)) *GethTxPool_Stats_Call { + _c.Call.Return(run) + return _c +} + +// NewGethTxPool creates a new instance of GethTxPool. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewGethTxPool(t interface { + mock.TestingT + Cleanup(func()) +}) *GethTxPool { + mock := &GethTxPool{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/handler.go b/cosmos/txpool/mocks/handler.go new file mode 100644 index 0000000000..ad9174180f --- /dev/null +++ b/cosmos/txpool/mocks/handler.go @@ -0,0 +1,137 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Handler is an autogenerated mock type for the Handler type +type Handler struct { + mock.Mock +} + +type Handler_Expecter struct { + mock *mock.Mock +} + +func (_m *Handler) EXPECT() *Handler_Expecter { + return &Handler_Expecter{mock: &_m.Mock} +} + +// Running provides a mock function with given fields: +func (_m *Handler) Running() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Handler_Running_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Running' +type Handler_Running_Call struct { + *mock.Call +} + +// Running is a helper method to define mock.On call +func (_e *Handler_Expecter) Running() *Handler_Running_Call { + return &Handler_Running_Call{Call: _e.mock.On("Running")} +} + +func (_c *Handler_Running_Call) Run(run func()) *Handler_Running_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Handler_Running_Call) Return(_a0 bool) *Handler_Running_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Handler_Running_Call) RunAndReturn(run func() bool) *Handler_Running_Call { + _c.Call.Return(run) + return _c +} + +// Start provides a mock function with given fields: +func (_m *Handler) Start() { + _m.Called() +} + +// Handler_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type Handler_Start_Call struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +func (_e *Handler_Expecter) Start() *Handler_Start_Call { + return &Handler_Start_Call{Call: _e.mock.On("Start")} +} + +func (_c *Handler_Start_Call) Run(run func()) *Handler_Start_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Handler_Start_Call) Return() *Handler_Start_Call { + _c.Call.Return() + return _c +} + +func (_c *Handler_Start_Call) RunAndReturn(run func()) *Handler_Start_Call { + _c.Call.Return(run) + return _c +} + +// Stop provides a mock function with given fields: +func (_m *Handler) Stop() { + _m.Called() +} + +// Handler_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +type Handler_Stop_Call struct { + *mock.Call +} + +// Stop is a helper method to define mock.On call +func (_e *Handler_Expecter) Stop() *Handler_Stop_Call { + return &Handler_Stop_Call{Call: _e.mock.On("Stop")} +} + +func (_c *Handler_Stop_Call) Run(run func()) *Handler_Stop_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Handler_Stop_Call) Return() *Handler_Stop_Call { + _c.Call.Return() + return _c +} + +func (_c *Handler_Stop_Call) RunAndReturn(run func()) *Handler_Stop_Call { + _c.Call.Return(run) + return _c +} + +// NewHandler creates a new instance of Handler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewHandler(t interface { + mock.TestingT + Cleanup(func()) +}) *Handler { + mock := &Handler{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go new file mode 100644 index 0000000000..561510d2ce --- /dev/null +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -0,0 +1,133 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + proto "github.com/cosmos/gogoproto/proto" + mock "github.com/stretchr/testify/mock" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +// SdkTx is an autogenerated mock type for the SdkTx type +type SdkTx struct { + mock.Mock +} + +type SdkTx_Expecter struct { + mock *mock.Mock +} + +func (_m *SdkTx) EXPECT() *SdkTx_Expecter { + return &SdkTx_Expecter{mock: &_m.Mock} +} + +// GetMsgs provides a mock function with given fields: +func (_m *SdkTx) GetMsgs() []proto.Message { + ret := _m.Called() + + var r0 []proto.Message + if rf, ok := ret.Get(0).(func() []proto.Message); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]proto.Message) + } + } + + return r0 +} + +// SdkTx_GetMsgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgs' +type SdkTx_GetMsgs_Call struct { + *mock.Call +} + +// GetMsgs is a helper method to define mock.On call +func (_e *SdkTx_Expecter) GetMsgs() *SdkTx_GetMsgs_Call { + return &SdkTx_GetMsgs_Call{Call: _e.mock.On("GetMsgs")} +} + +func (_c *SdkTx_GetMsgs_Call) Run(run func()) *SdkTx_GetMsgs_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SdkTx_GetMsgs_Call) Return(_a0 []proto.Message) *SdkTx_GetMsgs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SdkTx_GetMsgs_Call) RunAndReturn(run func() []proto.Message) *SdkTx_GetMsgs_Call { + _c.Call.Return(run) + return _c +} + +// GetMsgsV2 provides a mock function with given fields: +func (_m *SdkTx) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { + ret := _m.Called() + + var r0 []protoreflect.ProtoMessage + var r1 error + if rf, ok := ret.Get(0).(func() ([]protoreflect.ProtoMessage, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() []protoreflect.ProtoMessage); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]protoreflect.ProtoMessage) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SdkTx_GetMsgsV2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgsV2' +type SdkTx_GetMsgsV2_Call struct { + *mock.Call +} + +// GetMsgsV2 is a helper method to define mock.On call +func (_e *SdkTx_Expecter) GetMsgsV2() *SdkTx_GetMsgsV2_Call { + return &SdkTx_GetMsgsV2_Call{Call: _e.mock.On("GetMsgsV2")} +} + +func (_c *SdkTx_GetMsgsV2_Call) Run(run func()) *SdkTx_GetMsgsV2_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SdkTx_GetMsgsV2_Call) Return(_a0 []protoreflect.ProtoMessage, _a1 error) *SdkTx_GetMsgsV2_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SdkTx_GetMsgsV2_Call) RunAndReturn(run func() ([]protoreflect.ProtoMessage, error)) *SdkTx_GetMsgsV2_Call { + _c.Call.Return(run) + return _c +} + +// NewSdkTx creates a new instance of SdkTx. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSdkTx(t interface { + mock.TestingT + Cleanup(func()) +}) *SdkTx { + mock := &SdkTx{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index e93219295e..e4048e44ad 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -3,6 +3,7 @@ package mocks import ( + cosmos_sdktypes "github.com/cosmos/cosmos-sdk/types" mock "github.com/stretchr/testify/mock" types "github.com/ethereum/go-ethereum/core/types" @@ -75,6 +76,60 @@ func (_c *TxSerializer_SerializeToBytes_Call) RunAndReturn(run func(*types.Trans return _c } +// SerializeToSdkTx provides a mock function with given fields: signedTx +func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sdktypes.Tx, error) { + ret := _m.Called(signedTx) + + var r0 cosmos_sdktypes.Tx + var r1 error + if rf, ok := ret.Get(0).(func(*types.Transaction) (cosmos_sdktypes.Tx, error)); ok { + return rf(signedTx) + } + if rf, ok := ret.Get(0).(func(*types.Transaction) cosmos_sdktypes.Tx); ok { + r0 = rf(signedTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(cosmos_sdktypes.Tx) + } + } + + if rf, ok := ret.Get(1).(func(*types.Transaction) error); ok { + r1 = rf(signedTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxSerializer_SerializeToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToSdkTx' +type TxSerializer_SerializeToSdkTx_Call struct { + *mock.Call +} + +// SerializeToSdkTx is a helper method to define mock.On call +// - signedTx *types.Transaction +func (_e *TxSerializer_Expecter) SerializeToSdkTx(signedTx interface{}) *TxSerializer_SerializeToSdkTx_Call { + return &TxSerializer_SerializeToSdkTx_Call{Call: _e.mock.On("SerializeToSdkTx", signedTx)} +} + +func (_c *TxSerializer_SerializeToSdkTx_Call) Run(run func(signedTx *types.Transaction)) *TxSerializer_SerializeToSdkTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*types.Transaction)) + }) + return _c +} + +func (_c *TxSerializer_SerializeToSdkTx_Call) Return(_a0 cosmos_sdktypes.Tx, _a1 error) *TxSerializer_SerializeToSdkTx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxSerializer_SerializeToSdkTx_Call) RunAndReturn(run func(*types.Transaction) (cosmos_sdktypes.Tx, error)) *TxSerializer_SerializeToSdkTx_Call { + _c.Call.Return(run) + return _c +} + // NewTxSerializer creates a new instance of TxSerializer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewTxSerializer(t interface { From ccea4432d8eec10f24a0df21bd428eef0c240403 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 29 Sep 2023 13:21:03 -0400 Subject: [PATCH 041/122] chore(repo): typos --- cosmos/txpool/handler_test.go | 2 +- magefiles/ci.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cosmos/txpool/handler_test.go b/cosmos/txpool/handler_test.go index 57dba3f009..62873ea945 100644 --- a/cosmos/txpool/handler_test.go +++ b/cosmos/txpool/handler_test.go @@ -38,7 +38,7 @@ import ( func TestTxpool(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/txpool") + RunSpecs(t, "cosmos/txpool") } var _ = Describe("", func() { diff --git a/magefiles/ci.go b/magefiles/ci.go index daa9247636..4c1148ed75 100644 --- a/magefiles/ci.go +++ b/magefiles/ci.go @@ -113,7 +113,7 @@ func TestE2E() error { return err } utils.LogGreen("Running all e2e tests") - return testE2E(".") + return testE2E("./e2e") } func testE2E(path string) error { From d08c28218e0df0fa6641e35c426dd7484b430820 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 29 Sep 2023 14:30:40 -0400 Subject: [PATCH 042/122] feat(sdb): Return `[]byte{0x01}` for `GetCode(..)` of precompile contracts (#1161) --- .mockery.yaml | 9 +- cosmos/x/evm/keeper/host.go | 6 +- eth/core/chain.go | 2 +- eth/core/chain_resources.go | 2 +- eth/core/processor.go | 7 +- eth/core/processor_test.go | 4 +- eth/core/state/journal/mocks/accesslist.go | 389 ++++++ eth/core/state/journal/mocks/log.go | 426 +++++++ eth/core/state/journal/mocks/refund.go | 332 +++++ .../mocks/self_destruct_state_plugin.go | 160 +++ .../state/journal/mocks/self_destructs.go | 378 ++++++ .../state/journal/mocks/transient_storage.go | 307 +++++ eth/core/state/mock/state.go | 4 +- eth/core/state/mocks/plugin.go | 1077 +++++++++++++++++ eth/core/state/mocks/precompile_plugin.go | 77 ++ eth/core/state/statedb.go | 39 +- eth/core/state/statedb_test.go | 12 +- eth/miner/miner.go | 13 +- 18 files changed, 3218 insertions(+), 26 deletions(-) create mode 100644 eth/core/state/journal/mocks/accesslist.go create mode 100644 eth/core/state/journal/mocks/log.go create mode 100644 eth/core/state/journal/mocks/refund.go create mode 100644 eth/core/state/journal/mocks/self_destruct_state_plugin.go create mode 100644 eth/core/state/journal/mocks/self_destructs.go create mode 100644 eth/core/state/journal/mocks/transient_storage.go create mode 100644 eth/core/state/mocks/plugin.go create mode 100644 eth/core/state/mocks/precompile_plugin.go diff --git a/.mockery.yaml b/.mockery.yaml index 2ce327a5ef..5f455e0c3b 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -7,4 +7,11 @@ packages: config: all: True recursive: True - with-expecter: true \ No newline at end of file + with-expecter: true + pkg.berachain.dev/polaris/eth/core/state: + config: + all: True + recursive: True + with-expecter: true + + \ No newline at end of file diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index e99590d692..8734b430eb 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -101,8 +101,10 @@ func (h *host) Setup( qc func(height int64, prove bool) (sdk.Context, error), ) { // Setup the state, precompile, historical, and txpool plugins - h.sp = state.NewPlugin(ak, storeKey, log.NewFactory(h.pcs().GetPrecompiles())) - h.pp = precompile.NewPlugin(h.pcs().GetPrecompiles()) + precompiles := h.pcs().GetPrecompiles() + h.pp = precompile.NewPlugin(precompiles) + h.sp = state.NewPlugin(ak, storeKey, log.NewFactory(precompiles)) + // TODO: re-enable historical plugin using ABCI listener. h.hp = historical.NewPlugin(h.cp, h.bp, nil, storeKey) h.txp.SetNonceRetriever(h.sp) diff --git a/eth/core/chain.go b/eth/core/chain.go index 49bcae0e28..92d7d7dc58 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -117,7 +117,7 @@ func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used scope: event.SubscriptionScope{}, logger: log.Root(), } - bc.statedb = state.NewStateDB(bc.sp) + bc.statedb = state.NewStateDB(bc.sp, bc.pp) bc.currentBlock.Store(nil) bc.finalizedBlock.Store(nil) diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 914ac8b9b7..44c9ecffc1 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -39,7 +39,7 @@ func (bc *blockchain) StateAtBlockNumber(number uint64) (vm.GethStateDB, error) if err != nil { return nil, err } - return state.NewStateDB(sp), nil + return state.NewStateDB(sp, bc.pp), nil } // GetVMConfig returns the vm.Config for the current chain. diff --git a/eth/core/processor.go b/eth/core/processor.go index 12fc731a0d..8e43d2ed36 100644 --- a/eth/core/processor.go +++ b/eth/core/processor.go @@ -87,12 +87,6 @@ func NewStateProcessor( statedb: statedb, } - if sp.pp == nil { - sp.pp = precompile.NewDefaultPlugin() - } else { - sp.BuildAndRegisterPrecompiles(sp.pp.GetPrecompiles(nil)) - } - return sp } @@ -124,6 +118,7 @@ func (sp *StateProcessor) Prepare(evm *vm.GethEVM, header *types.Header) { // *technically* the precompiles change based on the chain config rules, to be fully correct, // we should check every block. sp.BuildAndRegisterPrecompiles(precompile.GetDefaultPrecompiles(&rules)) + sp.BuildAndRegisterPrecompiles(sp.pp.GetPrecompiles(&rules)) sp.evm = evm } diff --git a/eth/core/processor_test.go b/eth/core/processor_test.go index 500f952bb4..5b36f3ac2a 100644 --- a/eth/core/processor_test.go +++ b/eth/core/processor_test.go @@ -187,12 +187,12 @@ var _ = Describe("StateProcessor", func() { var _ = Describe("No precompile plugin provided", func() { It("should use the default plugin if none is provided", func() { - _, bp, cp, gp, _, _, _, _ := mock.NewMockHostAndPlugins() + _, bp, cp, gp, _, pp, _, _ := mock.NewMockHostAndPlugins() gp.SetBlockGasLimit(uint64(blockGasLimit)) bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) } - sp := core.NewStateProcessor(cp, nil, vmmock.NewEmptyStateDB(), &vm.Config{}) + sp := core.NewStateProcessor(cp, pp, vmmock.NewEmptyStateDB(), &vm.Config{}) Expect(func() { sp.Prepare(nil, &types.Header{ GasLimit: uint64(blockGasLimit), diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go new file mode 100644 index 0000000000..fc075f17a1 --- /dev/null +++ b/eth/core/state/journal/mocks/accesslist.go @@ -0,0 +1,389 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + journal "pkg.berachain.dev/polaris/eth/core/state/journal" + + mock "github.com/stretchr/testify/mock" +) + +// Accesslist is an autogenerated mock type for the Accesslist type +type Accesslist struct { + mock.Mock +} + +type Accesslist_Expecter struct { + mock *mock.Mock +} + +func (_m *Accesslist) EXPECT() *Accesslist_Expecter { + return &Accesslist_Expecter{mock: &_m.Mock} +} + +// AddAddressToAccessList provides a mock function with given fields: _a0 +func (_m *Accesslist) AddAddressToAccessList(_a0 common.Address) { + _m.Called(_a0) +} + +// Accesslist_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList' +type Accesslist_AddAddressToAccessList_Call struct { + *mock.Call +} + +// AddAddressToAccessList is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Accesslist_Expecter) AddAddressToAccessList(_a0 interface{}) *Accesslist_AddAddressToAccessList_Call { + return &Accesslist_AddAddressToAccessList_Call{Call: _e.mock.On("AddAddressToAccessList", _a0)} +} + +func (_c *Accesslist_AddAddressToAccessList_Call) Run(run func(_a0 common.Address)) *Accesslist_AddAddressToAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Accesslist_AddAddressToAccessList_Call) Return() *Accesslist_AddAddressToAccessList_Call { + _c.Call.Return() + return _c +} + +func (_c *Accesslist_AddAddressToAccessList_Call) RunAndReturn(run func(common.Address)) *Accesslist_AddAddressToAccessList_Call { + _c.Call.Return(run) + return _c +} + +// AddSlotToAccessList provides a mock function with given fields: _a0, _a1 +func (_m *Accesslist) AddSlotToAccessList(_a0 common.Address, _a1 common.Hash) { + _m.Called(_a0, _a1) +} + +// Accesslist_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList' +type Accesslist_AddSlotToAccessList_Call struct { + *mock.Call +} + +// AddSlotToAccessList is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *Accesslist_Expecter) AddSlotToAccessList(_a0 interface{}, _a1 interface{}) *Accesslist_AddSlotToAccessList_Call { + return &Accesslist_AddSlotToAccessList_Call{Call: _e.mock.On("AddSlotToAccessList", _a0, _a1)} +} + +func (_c *Accesslist_AddSlotToAccessList_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *Accesslist_AddSlotToAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *Accesslist_AddSlotToAccessList_Call) Return() *Accesslist_AddSlotToAccessList_Call { + _c.Call.Return() + return _c +} + +func (_c *Accesslist_AddSlotToAccessList_Call) RunAndReturn(run func(common.Address, common.Hash)) *Accesslist_AddSlotToAccessList_Call { + _c.Call.Return(run) + return _c +} + +// AddressInAccessList provides a mock function with given fields: _a0 +func (_m *Accesslist) AddressInAccessList(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Accesslist_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList' +type Accesslist_AddressInAccessList_Call struct { + *mock.Call +} + +// AddressInAccessList is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Accesslist_Expecter) AddressInAccessList(_a0 interface{}) *Accesslist_AddressInAccessList_Call { + return &Accesslist_AddressInAccessList_Call{Call: _e.mock.On("AddressInAccessList", _a0)} +} + +func (_c *Accesslist_AddressInAccessList_Call) Run(run func(_a0 common.Address)) *Accesslist_AddressInAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Accesslist_AddressInAccessList_Call) Return(_a0 bool) *Accesslist_AddressInAccessList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Accesslist_AddressInAccessList_Call) RunAndReturn(run func(common.Address) bool) *Accesslist_AddressInAccessList_Call { + _c.Call.Return(run) + return _c +} + +// Clone provides a mock function with given fields: +func (_m *Accesslist) Clone() journal.Accesslist { + ret := _m.Called() + + var r0 journal.Accesslist + if rf, ok := ret.Get(0).(func() journal.Accesslist); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(journal.Accesslist) + } + } + + return r0 +} + +// Accesslist_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +type Accesslist_Clone_Call struct { + *mock.Call +} + +// Clone is a helper method to define mock.On call +func (_e *Accesslist_Expecter) Clone() *Accesslist_Clone_Call { + return &Accesslist_Clone_Call{Call: _e.mock.On("Clone")} +} + +func (_c *Accesslist_Clone_Call) Run(run func()) *Accesslist_Clone_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Accesslist_Clone_Call) Return(_a0 journal.Accesslist) *Accesslist_Clone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Accesslist_Clone_Call) RunAndReturn(run func() journal.Accesslist) *Accesslist_Clone_Call { + _c.Call.Return(run) + return _c +} + +// Finalize provides a mock function with given fields: +func (_m *Accesslist) Finalize() { + _m.Called() +} + +// Accesslist_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +type Accesslist_Finalize_Call struct { + *mock.Call +} + +// Finalize is a helper method to define mock.On call +func (_e *Accesslist_Expecter) Finalize() *Accesslist_Finalize_Call { + return &Accesslist_Finalize_Call{Call: _e.mock.On("Finalize")} +} + +func (_c *Accesslist_Finalize_Call) Run(run func()) *Accesslist_Finalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Accesslist_Finalize_Call) Return() *Accesslist_Finalize_Call { + _c.Call.Return() + return _c +} + +func (_c *Accesslist_Finalize_Call) RunAndReturn(run func()) *Accesslist_Finalize_Call { + _c.Call.Return(run) + return _c +} + +// RegistryKey provides a mock function with given fields: +func (_m *Accesslist) RegistryKey() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Accesslist_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +type Accesslist_RegistryKey_Call struct { + *mock.Call +} + +// RegistryKey is a helper method to define mock.On call +func (_e *Accesslist_Expecter) RegistryKey() *Accesslist_RegistryKey_Call { + return &Accesslist_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} +} + +func (_c *Accesslist_RegistryKey_Call) Run(run func()) *Accesslist_RegistryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Accesslist_RegistryKey_Call) Return(_a0 string) *Accesslist_RegistryKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Accesslist_RegistryKey_Call) RunAndReturn(run func() string) *Accesslist_RegistryKey_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *Accesslist) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// Accesslist_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type Accesslist_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *Accesslist_Expecter) RevertToSnapshot(_a0 interface{}) *Accesslist_RevertToSnapshot_Call { + return &Accesslist_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *Accesslist_RevertToSnapshot_Call) Run(run func(_a0 int)) *Accesslist_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *Accesslist_RevertToSnapshot_Call) Return() *Accesslist_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *Accesslist_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Accesslist_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SlotInAccessList provides a mock function with given fields: _a0, _a1 +func (_m *Accesslist) SlotInAccessList(_a0 common.Address, _a1 common.Hash) (bool, bool) { + ret := _m.Called(_a0, _a1) + + var r0 bool + var r1 bool + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) (bool, bool)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) bool); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(common.Address, common.Hash) bool); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// Accesslist_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList' +type Accesslist_SlotInAccessList_Call struct { + *mock.Call +} + +// SlotInAccessList is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *Accesslist_Expecter) SlotInAccessList(_a0 interface{}, _a1 interface{}) *Accesslist_SlotInAccessList_Call { + return &Accesslist_SlotInAccessList_Call{Call: _e.mock.On("SlotInAccessList", _a0, _a1)} +} + +func (_c *Accesslist_SlotInAccessList_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *Accesslist_SlotInAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *Accesslist_SlotInAccessList_Call) Return(addressPresent bool, slotPresent bool) *Accesslist_SlotInAccessList_Call { + _c.Call.Return(addressPresent, slotPresent) + return _c +} + +func (_c *Accesslist_SlotInAccessList_Call) RunAndReturn(run func(common.Address, common.Hash) (bool, bool)) *Accesslist_SlotInAccessList_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *Accesslist) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// Accesslist_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type Accesslist_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *Accesslist_Expecter) Snapshot() *Accesslist_Snapshot_Call { + return &Accesslist_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *Accesslist_Snapshot_Call) Run(run func()) *Accesslist_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Accesslist_Snapshot_Call) Return(_a0 int) *Accesslist_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Accesslist_Snapshot_Call) RunAndReturn(run func() int) *Accesslist_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// NewAccesslist creates a new instance of Accesslist. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAccesslist(t interface { + mock.TestingT + Cleanup(func()) +}) *Accesslist { + mock := &Accesslist{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go new file mode 100644 index 0000000000..041bf76672 --- /dev/null +++ b/eth/core/state/journal/mocks/log.go @@ -0,0 +1,426 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + journal "pkg.berachain.dev/polaris/eth/core/state/journal" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// Log is an autogenerated mock type for the Log type +type Log struct { + mock.Mock +} + +type Log_Expecter struct { + mock *mock.Mock +} + +func (_m *Log) EXPECT() *Log_Expecter { + return &Log_Expecter{mock: &_m.Mock} +} + +// AddLog provides a mock function with given fields: _a0 +func (_m *Log) AddLog(_a0 *types.Log) { + _m.Called(_a0) +} + +// Log_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog' +type Log_AddLog_Call struct { + *mock.Call +} + +// AddLog is a helper method to define mock.On call +// - _a0 *types.Log +func (_e *Log_Expecter) AddLog(_a0 interface{}) *Log_AddLog_Call { + return &Log_AddLog_Call{Call: _e.mock.On("AddLog", _a0)} +} + +func (_c *Log_AddLog_Call) Run(run func(_a0 *types.Log)) *Log_AddLog_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*types.Log)) + }) + return _c +} + +func (_c *Log_AddLog_Call) Return() *Log_AddLog_Call { + _c.Call.Return() + return _c +} + +func (_c *Log_AddLog_Call) RunAndReturn(run func(*types.Log)) *Log_AddLog_Call { + _c.Call.Return(run) + return _c +} + +// Clone provides a mock function with given fields: +func (_m *Log) Clone() journal.Log { + ret := _m.Called() + + var r0 journal.Log + if rf, ok := ret.Get(0).(func() journal.Log); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(journal.Log) + } + } + + return r0 +} + +// Log_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +type Log_Clone_Call struct { + *mock.Call +} + +// Clone is a helper method to define mock.On call +func (_e *Log_Expecter) Clone() *Log_Clone_Call { + return &Log_Clone_Call{Call: _e.mock.On("Clone")} +} + +func (_c *Log_Clone_Call) Run(run func()) *Log_Clone_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Log_Clone_Call) Return(_a0 journal.Log) *Log_Clone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Log_Clone_Call) RunAndReturn(run func() journal.Log) *Log_Clone_Call { + _c.Call.Return(run) + return _c +} + +// Finalize provides a mock function with given fields: +func (_m *Log) Finalize() { + _m.Called() +} + +// Log_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +type Log_Finalize_Call struct { + *mock.Call +} + +// Finalize is a helper method to define mock.On call +func (_e *Log_Expecter) Finalize() *Log_Finalize_Call { + return &Log_Finalize_Call{Call: _e.mock.On("Finalize")} +} + +func (_c *Log_Finalize_Call) Run(run func()) *Log_Finalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Log_Finalize_Call) Return() *Log_Finalize_Call { + _c.Call.Return() + return _c +} + +func (_c *Log_Finalize_Call) RunAndReturn(run func()) *Log_Finalize_Call { + _c.Call.Return(run) + return _c +} + +// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash +func (_m *Log) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { + ret := _m.Called(hash, blockNumber, blockHash) + + var r0 []*types.Log + if rf, ok := ret.Get(0).(func(common.Hash, uint64, common.Hash) []*types.Log); ok { + r0 = rf(hash, blockNumber, blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Log) + } + } + + return r0 +} + +// Log_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs' +type Log_GetLogs_Call struct { + *mock.Call +} + +// GetLogs is a helper method to define mock.On call +// - hash common.Hash +// - blockNumber uint64 +// - blockHash common.Hash +func (_e *Log_Expecter) GetLogs(hash interface{}, blockNumber interface{}, blockHash interface{}) *Log_GetLogs_Call { + return &Log_GetLogs_Call{Call: _e.mock.On("GetLogs", hash, blockNumber, blockHash)} +} + +func (_c *Log_GetLogs_Call) Run(run func(hash common.Hash, blockNumber uint64, blockHash common.Hash)) *Log_GetLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(uint64), args[2].(common.Hash)) + }) + return _c +} + +func (_c *Log_GetLogs_Call) Return(_a0 []*types.Log) *Log_GetLogs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Log_GetLogs_Call) RunAndReturn(run func(common.Hash, uint64, common.Hash) []*types.Log) *Log_GetLogs_Call { + _c.Call.Return(run) + return _c +} + +// Logs provides a mock function with given fields: +func (_m *Log) Logs() []*types.Log { + ret := _m.Called() + + var r0 []*types.Log + if rf, ok := ret.Get(0).(func() []*types.Log); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Log) + } + } + + return r0 +} + +// Log_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs' +type Log_Logs_Call struct { + *mock.Call +} + +// Logs is a helper method to define mock.On call +func (_e *Log_Expecter) Logs() *Log_Logs_Call { + return &Log_Logs_Call{Call: _e.mock.On("Logs")} +} + +func (_c *Log_Logs_Call) Run(run func()) *Log_Logs_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Log_Logs_Call) Return(_a0 []*types.Log) *Log_Logs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Log_Logs_Call) RunAndReturn(run func() []*types.Log) *Log_Logs_Call { + _c.Call.Return(run) + return _c +} + +// RegistryKey provides a mock function with given fields: +func (_m *Log) RegistryKey() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Log_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +type Log_RegistryKey_Call struct { + *mock.Call +} + +// RegistryKey is a helper method to define mock.On call +func (_e *Log_Expecter) RegistryKey() *Log_RegistryKey_Call { + return &Log_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} +} + +func (_c *Log_RegistryKey_Call) Run(run func()) *Log_RegistryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Log_RegistryKey_Call) Return(_a0 string) *Log_RegistryKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Log_RegistryKey_Call) RunAndReturn(run func() string) *Log_RegistryKey_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *Log) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// Log_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type Log_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *Log_Expecter) RevertToSnapshot(_a0 interface{}) *Log_RevertToSnapshot_Call { + return &Log_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *Log_RevertToSnapshot_Call) Run(run func(_a0 int)) *Log_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *Log_RevertToSnapshot_Call) Return() *Log_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *Log_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Log_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SetTxContext provides a mock function with given fields: thash, ti +func (_m *Log) SetTxContext(thash common.Hash, ti int) { + _m.Called(thash, ti) +} + +// Log_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext' +type Log_SetTxContext_Call struct { + *mock.Call +} + +// SetTxContext is a helper method to define mock.On call +// - thash common.Hash +// - ti int +func (_e *Log_Expecter) SetTxContext(thash interface{}, ti interface{}) *Log_SetTxContext_Call { + return &Log_SetTxContext_Call{Call: _e.mock.On("SetTxContext", thash, ti)} +} + +func (_c *Log_SetTxContext_Call) Run(run func(thash common.Hash, ti int)) *Log_SetTxContext_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(int)) + }) + return _c +} + +func (_c *Log_SetTxContext_Call) Return() *Log_SetTxContext_Call { + _c.Call.Return() + return _c +} + +func (_c *Log_SetTxContext_Call) RunAndReturn(run func(common.Hash, int)) *Log_SetTxContext_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *Log) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// Log_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type Log_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *Log_Expecter) Snapshot() *Log_Snapshot_Call { + return &Log_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *Log_Snapshot_Call) Run(run func()) *Log_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Log_Snapshot_Call) Return(_a0 int) *Log_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Log_Snapshot_Call) RunAndReturn(run func() int) *Log_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// TxIndex provides a mock function with given fields: +func (_m *Log) TxIndex() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// Log_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex' +type Log_TxIndex_Call struct { + *mock.Call +} + +// TxIndex is a helper method to define mock.On call +func (_e *Log_Expecter) TxIndex() *Log_TxIndex_Call { + return &Log_TxIndex_Call{Call: _e.mock.On("TxIndex")} +} + +func (_c *Log_TxIndex_Call) Run(run func()) *Log_TxIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Log_TxIndex_Call) Return(_a0 int) *Log_TxIndex_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Log_TxIndex_Call) RunAndReturn(run func() int) *Log_TxIndex_Call { + _c.Call.Return(run) + return _c +} + +// NewLog creates a new instance of Log. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLog(t interface { + mock.TestingT + Cleanup(func()) +}) *Log { + mock := &Log{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go new file mode 100644 index 0000000000..5edf7e3d03 --- /dev/null +++ b/eth/core/state/journal/mocks/refund.go @@ -0,0 +1,332 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + journal "pkg.berachain.dev/polaris/eth/core/state/journal" +) + +// Refund is an autogenerated mock type for the Refund type +type Refund struct { + mock.Mock +} + +type Refund_Expecter struct { + mock *mock.Mock +} + +func (_m *Refund) EXPECT() *Refund_Expecter { + return &Refund_Expecter{mock: &_m.Mock} +} + +// AddRefund provides a mock function with given fields: gas +func (_m *Refund) AddRefund(gas uint64) { + _m.Called(gas) +} + +// Refund_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund' +type Refund_AddRefund_Call struct { + *mock.Call +} + +// AddRefund is a helper method to define mock.On call +// - gas uint64 +func (_e *Refund_Expecter) AddRefund(gas interface{}) *Refund_AddRefund_Call { + return &Refund_AddRefund_Call{Call: _e.mock.On("AddRefund", gas)} +} + +func (_c *Refund_AddRefund_Call) Run(run func(gas uint64)) *Refund_AddRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *Refund_AddRefund_Call) Return() *Refund_AddRefund_Call { + _c.Call.Return() + return _c +} + +func (_c *Refund_AddRefund_Call) RunAndReturn(run func(uint64)) *Refund_AddRefund_Call { + _c.Call.Return(run) + return _c +} + +// Clone provides a mock function with given fields: +func (_m *Refund) Clone() journal.Refund { + ret := _m.Called() + + var r0 journal.Refund + if rf, ok := ret.Get(0).(func() journal.Refund); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(journal.Refund) + } + } + + return r0 +} + +// Refund_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +type Refund_Clone_Call struct { + *mock.Call +} + +// Clone is a helper method to define mock.On call +func (_e *Refund_Expecter) Clone() *Refund_Clone_Call { + return &Refund_Clone_Call{Call: _e.mock.On("Clone")} +} + +func (_c *Refund_Clone_Call) Run(run func()) *Refund_Clone_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Refund_Clone_Call) Return(_a0 journal.Refund) *Refund_Clone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Refund_Clone_Call) RunAndReturn(run func() journal.Refund) *Refund_Clone_Call { + _c.Call.Return(run) + return _c +} + +// Finalize provides a mock function with given fields: +func (_m *Refund) Finalize() { + _m.Called() +} + +// Refund_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +type Refund_Finalize_Call struct { + *mock.Call +} + +// Finalize is a helper method to define mock.On call +func (_e *Refund_Expecter) Finalize() *Refund_Finalize_Call { + return &Refund_Finalize_Call{Call: _e.mock.On("Finalize")} +} + +func (_c *Refund_Finalize_Call) Run(run func()) *Refund_Finalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Refund_Finalize_Call) Return() *Refund_Finalize_Call { + _c.Call.Return() + return _c +} + +func (_c *Refund_Finalize_Call) RunAndReturn(run func()) *Refund_Finalize_Call { + _c.Call.Return(run) + return _c +} + +// GetRefund provides a mock function with given fields: +func (_m *Refund) GetRefund() uint64 { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// Refund_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund' +type Refund_GetRefund_Call struct { + *mock.Call +} + +// GetRefund is a helper method to define mock.On call +func (_e *Refund_Expecter) GetRefund() *Refund_GetRefund_Call { + return &Refund_GetRefund_Call{Call: _e.mock.On("GetRefund")} +} + +func (_c *Refund_GetRefund_Call) Run(run func()) *Refund_GetRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Refund_GetRefund_Call) Return(_a0 uint64) *Refund_GetRefund_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Refund_GetRefund_Call) RunAndReturn(run func() uint64) *Refund_GetRefund_Call { + _c.Call.Return(run) + return _c +} + +// RegistryKey provides a mock function with given fields: +func (_m *Refund) RegistryKey() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Refund_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +type Refund_RegistryKey_Call struct { + *mock.Call +} + +// RegistryKey is a helper method to define mock.On call +func (_e *Refund_Expecter) RegistryKey() *Refund_RegistryKey_Call { + return &Refund_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} +} + +func (_c *Refund_RegistryKey_Call) Run(run func()) *Refund_RegistryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Refund_RegistryKey_Call) Return(_a0 string) *Refund_RegistryKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Refund_RegistryKey_Call) RunAndReturn(run func() string) *Refund_RegistryKey_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *Refund) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// Refund_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type Refund_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *Refund_Expecter) RevertToSnapshot(_a0 interface{}) *Refund_RevertToSnapshot_Call { + return &Refund_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *Refund_RevertToSnapshot_Call) Run(run func(_a0 int)) *Refund_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *Refund_RevertToSnapshot_Call) Return() *Refund_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *Refund_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Refund_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *Refund) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// Refund_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type Refund_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *Refund_Expecter) Snapshot() *Refund_Snapshot_Call { + return &Refund_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *Refund_Snapshot_Call) Run(run func()) *Refund_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Refund_Snapshot_Call) Return(_a0 int) *Refund_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Refund_Snapshot_Call) RunAndReturn(run func() int) *Refund_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// SubRefund provides a mock function with given fields: gas +func (_m *Refund) SubRefund(gas uint64) { + _m.Called(gas) +} + +// Refund_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund' +type Refund_SubRefund_Call struct { + *mock.Call +} + +// SubRefund is a helper method to define mock.On call +// - gas uint64 +func (_e *Refund_Expecter) SubRefund(gas interface{}) *Refund_SubRefund_Call { + return &Refund_SubRefund_Call{Call: _e.mock.On("SubRefund", gas)} +} + +func (_c *Refund_SubRefund_Call) Run(run func(gas uint64)) *Refund_SubRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *Refund_SubRefund_Call) Return() *Refund_SubRefund_Call { + _c.Call.Return() + return _c +} + +func (_c *Refund_SubRefund_Call) RunAndReturn(run func(uint64)) *Refund_SubRefund_Call { + _c.Call.Return(run) + return _c +} + +// NewRefund creates a new instance of Refund. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRefund(t interface { + mock.TestingT + Cleanup(func()) +}) *Refund { + mock := &Refund{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go new file mode 100644 index 0000000000..865b33b1bb --- /dev/null +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -0,0 +1,160 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" +) + +// SelfDestructStatePlugin is an autogenerated mock type for the selfDestructStatePlugin type +type SelfDestructStatePlugin struct { + mock.Mock +} + +type SelfDestructStatePlugin_Expecter struct { + mock *mock.Mock +} + +func (_m *SelfDestructStatePlugin) EXPECT() *SelfDestructStatePlugin_Expecter { + return &SelfDestructStatePlugin_Expecter{mock: &_m.Mock} +} + +// GetBalance provides a mock function with given fields: _a0 +func (_m *SelfDestructStatePlugin) GetBalance(_a0 common.Address) *big.Int { + ret := _m.Called(_a0) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(common.Address) *big.Int); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + return r0 +} + +// SelfDestructStatePlugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type SelfDestructStatePlugin_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - _a0 common.Address +func (_e *SelfDestructStatePlugin_Expecter) GetBalance(_a0 interface{}) *SelfDestructStatePlugin_GetBalance_Call { + return &SelfDestructStatePlugin_GetBalance_Call{Call: _e.mock.On("GetBalance", _a0)} +} + +func (_c *SelfDestructStatePlugin_GetBalance_Call) Run(run func(_a0 common.Address)) *SelfDestructStatePlugin_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *SelfDestructStatePlugin_GetBalance_Call) Return(_a0 *big.Int) *SelfDestructStatePlugin_GetBalance_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructStatePlugin_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int) *SelfDestructStatePlugin_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetCodeHash provides a mock function with given fields: _a0 +func (_m *SelfDestructStatePlugin) GetCodeHash(_a0 common.Address) common.Hash { + ret := _m.Called(_a0) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// SelfDestructStatePlugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' +type SelfDestructStatePlugin_GetCodeHash_Call struct { + *mock.Call +} + +// GetCodeHash is a helper method to define mock.On call +// - _a0 common.Address +func (_e *SelfDestructStatePlugin_Expecter) GetCodeHash(_a0 interface{}) *SelfDestructStatePlugin_GetCodeHash_Call { + return &SelfDestructStatePlugin_GetCodeHash_Call{Call: _e.mock.On("GetCodeHash", _a0)} +} + +func (_c *SelfDestructStatePlugin_GetCodeHash_Call) Run(run func(_a0 common.Address)) *SelfDestructStatePlugin_GetCodeHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *SelfDestructStatePlugin_GetCodeHash_Call) Return(_a0 common.Hash) *SelfDestructStatePlugin_GetCodeHash_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructStatePlugin_GetCodeHash_Call) RunAndReturn(run func(common.Address) common.Hash) *SelfDestructStatePlugin_GetCodeHash_Call { + _c.Call.Return(run) + return _c +} + +// SubBalance provides a mock function with given fields: _a0, _a1 +func (_m *SelfDestructStatePlugin) SubBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// SelfDestructStatePlugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' +type SelfDestructStatePlugin_SubBalance_Call struct { + *mock.Call +} + +// SubBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *SelfDestructStatePlugin_Expecter) SubBalance(_a0 interface{}, _a1 interface{}) *SelfDestructStatePlugin_SubBalance_Call { + return &SelfDestructStatePlugin_SubBalance_Call{Call: _e.mock.On("SubBalance", _a0, _a1)} +} + +func (_c *SelfDestructStatePlugin_SubBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *SelfDestructStatePlugin_SubBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *SelfDestructStatePlugin_SubBalance_Call) Return() *SelfDestructStatePlugin_SubBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *SelfDestructStatePlugin_SubBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *SelfDestructStatePlugin_SubBalance_Call { + _c.Call.Return(run) + return _c +} + +// NewSelfDestructStatePlugin creates a new instance of SelfDestructStatePlugin. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSelfDestructStatePlugin(t interface { + mock.TestingT + Cleanup(func()) +}) *SelfDestructStatePlugin { + mock := &SelfDestructStatePlugin{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go new file mode 100644 index 0000000000..f45bd5a027 --- /dev/null +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -0,0 +1,378 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + journal "pkg.berachain.dev/polaris/eth/core/state/journal" + + mock "github.com/stretchr/testify/mock" +) + +// SelfDestructs is an autogenerated mock type for the SelfDestructs type +type SelfDestructs struct { + mock.Mock +} + +type SelfDestructs_Expecter struct { + mock *mock.Mock +} + +func (_m *SelfDestructs) EXPECT() *SelfDestructs_Expecter { + return &SelfDestructs_Expecter{mock: &_m.Mock} +} + +// Clone provides a mock function with given fields: +func (_m *SelfDestructs) Clone() journal.SelfDestructs { + ret := _m.Called() + + var r0 journal.SelfDestructs + if rf, ok := ret.Get(0).(func() journal.SelfDestructs); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(journal.SelfDestructs) + } + } + + return r0 +} + +// SelfDestructs_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +type SelfDestructs_Clone_Call struct { + *mock.Call +} + +// Clone is a helper method to define mock.On call +func (_e *SelfDestructs_Expecter) Clone() *SelfDestructs_Clone_Call { + return &SelfDestructs_Clone_Call{Call: _e.mock.On("Clone")} +} + +func (_c *SelfDestructs_Clone_Call) Run(run func()) *SelfDestructs_Clone_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SelfDestructs_Clone_Call) Return(_a0 journal.SelfDestructs) *SelfDestructs_Clone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructs_Clone_Call) RunAndReturn(run func() journal.SelfDestructs) *SelfDestructs_Clone_Call { + _c.Call.Return(run) + return _c +} + +// Finalize provides a mock function with given fields: +func (_m *SelfDestructs) Finalize() { + _m.Called() +} + +// SelfDestructs_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +type SelfDestructs_Finalize_Call struct { + *mock.Call +} + +// Finalize is a helper method to define mock.On call +func (_e *SelfDestructs_Expecter) Finalize() *SelfDestructs_Finalize_Call { + return &SelfDestructs_Finalize_Call{Call: _e.mock.On("Finalize")} +} + +func (_c *SelfDestructs_Finalize_Call) Run(run func()) *SelfDestructs_Finalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SelfDestructs_Finalize_Call) Return() *SelfDestructs_Finalize_Call { + _c.Call.Return() + return _c +} + +func (_c *SelfDestructs_Finalize_Call) RunAndReturn(run func()) *SelfDestructs_Finalize_Call { + _c.Call.Return(run) + return _c +} + +// GetSelfDestructs provides a mock function with given fields: +func (_m *SelfDestructs) GetSelfDestructs() []common.Address { + ret := _m.Called() + + var r0 []common.Address + if rf, ok := ret.Get(0).(func() []common.Address); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Address) + } + } + + return r0 +} + +// SelfDestructs_GetSelfDestructs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSelfDestructs' +type SelfDestructs_GetSelfDestructs_Call struct { + *mock.Call +} + +// GetSelfDestructs is a helper method to define mock.On call +func (_e *SelfDestructs_Expecter) GetSelfDestructs() *SelfDestructs_GetSelfDestructs_Call { + return &SelfDestructs_GetSelfDestructs_Call{Call: _e.mock.On("GetSelfDestructs")} +} + +func (_c *SelfDestructs_GetSelfDestructs_Call) Run(run func()) *SelfDestructs_GetSelfDestructs_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SelfDestructs_GetSelfDestructs_Call) Return(_a0 []common.Address) *SelfDestructs_GetSelfDestructs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructs_GetSelfDestructs_Call) RunAndReturn(run func() []common.Address) *SelfDestructs_GetSelfDestructs_Call { + _c.Call.Return(run) + return _c +} + +// HasSelfDestructed provides a mock function with given fields: _a0 +func (_m *SelfDestructs) HasSelfDestructed(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// SelfDestructs_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed' +type SelfDestructs_HasSelfDestructed_Call struct { + *mock.Call +} + +// HasSelfDestructed is a helper method to define mock.On call +// - _a0 common.Address +func (_e *SelfDestructs_Expecter) HasSelfDestructed(_a0 interface{}) *SelfDestructs_HasSelfDestructed_Call { + return &SelfDestructs_HasSelfDestructed_Call{Call: _e.mock.On("HasSelfDestructed", _a0)} +} + +func (_c *SelfDestructs_HasSelfDestructed_Call) Run(run func(_a0 common.Address)) *SelfDestructs_HasSelfDestructed_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *SelfDestructs_HasSelfDestructed_Call) Return(_a0 bool) *SelfDestructs_HasSelfDestructed_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructs_HasSelfDestructed_Call) RunAndReturn(run func(common.Address) bool) *SelfDestructs_HasSelfDestructed_Call { + _c.Call.Return(run) + return _c +} + +// RegistryKey provides a mock function with given fields: +func (_m *SelfDestructs) RegistryKey() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// SelfDestructs_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +type SelfDestructs_RegistryKey_Call struct { + *mock.Call +} + +// RegistryKey is a helper method to define mock.On call +func (_e *SelfDestructs_Expecter) RegistryKey() *SelfDestructs_RegistryKey_Call { + return &SelfDestructs_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} +} + +func (_c *SelfDestructs_RegistryKey_Call) Run(run func()) *SelfDestructs_RegistryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SelfDestructs_RegistryKey_Call) Return(_a0 string) *SelfDestructs_RegistryKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructs_RegistryKey_Call) RunAndReturn(run func() string) *SelfDestructs_RegistryKey_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *SelfDestructs) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// SelfDestructs_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type SelfDestructs_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *SelfDestructs_Expecter) RevertToSnapshot(_a0 interface{}) *SelfDestructs_RevertToSnapshot_Call { + return &SelfDestructs_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *SelfDestructs_RevertToSnapshot_Call) Run(run func(_a0 int)) *SelfDestructs_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *SelfDestructs_RevertToSnapshot_Call) Return() *SelfDestructs_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *SelfDestructs_RevertToSnapshot_Call) RunAndReturn(run func(int)) *SelfDestructs_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SelfDestruct provides a mock function with given fields: _a0 +func (_m *SelfDestructs) SelfDestruct(_a0 common.Address) { + _m.Called(_a0) +} + +// SelfDestructs_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct' +type SelfDestructs_SelfDestruct_Call struct { + *mock.Call +} + +// SelfDestruct is a helper method to define mock.On call +// - _a0 common.Address +func (_e *SelfDestructs_Expecter) SelfDestruct(_a0 interface{}) *SelfDestructs_SelfDestruct_Call { + return &SelfDestructs_SelfDestruct_Call{Call: _e.mock.On("SelfDestruct", _a0)} +} + +func (_c *SelfDestructs_SelfDestruct_Call) Run(run func(_a0 common.Address)) *SelfDestructs_SelfDestruct_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *SelfDestructs_SelfDestruct_Call) Return() *SelfDestructs_SelfDestruct_Call { + _c.Call.Return() + return _c +} + +func (_c *SelfDestructs_SelfDestruct_Call) RunAndReturn(run func(common.Address)) *SelfDestructs_SelfDestruct_Call { + _c.Call.Return(run) + return _c +} + +// Selfdestruct6780 provides a mock function with given fields: _a0 +func (_m *SelfDestructs) Selfdestruct6780(_a0 common.Address) { + _m.Called(_a0) +} + +// SelfDestructs_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780' +type SelfDestructs_Selfdestruct6780_Call struct { + *mock.Call +} + +// Selfdestruct6780 is a helper method to define mock.On call +// - _a0 common.Address +func (_e *SelfDestructs_Expecter) Selfdestruct6780(_a0 interface{}) *SelfDestructs_Selfdestruct6780_Call { + return &SelfDestructs_Selfdestruct6780_Call{Call: _e.mock.On("Selfdestruct6780", _a0)} +} + +func (_c *SelfDestructs_Selfdestruct6780_Call) Run(run func(_a0 common.Address)) *SelfDestructs_Selfdestruct6780_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *SelfDestructs_Selfdestruct6780_Call) Return() *SelfDestructs_Selfdestruct6780_Call { + _c.Call.Return() + return _c +} + +func (_c *SelfDestructs_Selfdestruct6780_Call) RunAndReturn(run func(common.Address)) *SelfDestructs_Selfdestruct6780_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *SelfDestructs) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// SelfDestructs_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type SelfDestructs_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *SelfDestructs_Expecter) Snapshot() *SelfDestructs_Snapshot_Call { + return &SelfDestructs_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *SelfDestructs_Snapshot_Call) Run(run func()) *SelfDestructs_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SelfDestructs_Snapshot_Call) Return(_a0 int) *SelfDestructs_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SelfDestructs_Snapshot_Call) RunAndReturn(run func() int) *SelfDestructs_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// NewSelfDestructs creates a new instance of SelfDestructs. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSelfDestructs(t interface { + mock.TestingT + Cleanup(func()) +}) *SelfDestructs { + mock := &SelfDestructs{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go new file mode 100644 index 0000000000..fb334993bb --- /dev/null +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -0,0 +1,307 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + journal "pkg.berachain.dev/polaris/eth/core/state/journal" + + mock "github.com/stretchr/testify/mock" +) + +// TransientStorage is an autogenerated mock type for the TransientStorage type +type TransientStorage struct { + mock.Mock +} + +type TransientStorage_Expecter struct { + mock *mock.Mock +} + +func (_m *TransientStorage) EXPECT() *TransientStorage_Expecter { + return &TransientStorage_Expecter{mock: &_m.Mock} +} + +// Clone provides a mock function with given fields: +func (_m *TransientStorage) Clone() journal.TransientStorage { + ret := _m.Called() + + var r0 journal.TransientStorage + if rf, ok := ret.Get(0).(func() journal.TransientStorage); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(journal.TransientStorage) + } + } + + return r0 +} + +// TransientStorage_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +type TransientStorage_Clone_Call struct { + *mock.Call +} + +// Clone is a helper method to define mock.On call +func (_e *TransientStorage_Expecter) Clone() *TransientStorage_Clone_Call { + return &TransientStorage_Clone_Call{Call: _e.mock.On("Clone")} +} + +func (_c *TransientStorage_Clone_Call) Run(run func()) *TransientStorage_Clone_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TransientStorage_Clone_Call) Return(_a0 journal.TransientStorage) *TransientStorage_Clone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TransientStorage_Clone_Call) RunAndReturn(run func() journal.TransientStorage) *TransientStorage_Clone_Call { + _c.Call.Return(run) + return _c +} + +// Finalize provides a mock function with given fields: +func (_m *TransientStorage) Finalize() { + _m.Called() +} + +// TransientStorage_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +type TransientStorage_Finalize_Call struct { + *mock.Call +} + +// Finalize is a helper method to define mock.On call +func (_e *TransientStorage_Expecter) Finalize() *TransientStorage_Finalize_Call { + return &TransientStorage_Finalize_Call{Call: _e.mock.On("Finalize")} +} + +func (_c *TransientStorage_Finalize_Call) Run(run func()) *TransientStorage_Finalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TransientStorage_Finalize_Call) Return() *TransientStorage_Finalize_Call { + _c.Call.Return() + return _c +} + +func (_c *TransientStorage_Finalize_Call) RunAndReturn(run func()) *TransientStorage_Finalize_Call { + _c.Call.Return(run) + return _c +} + +// GetTransientState provides a mock function with given fields: addr, key +func (_m *TransientStorage) GetTransientState(addr common.Address, key common.Hash) common.Hash { + ret := _m.Called(addr, key) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(addr, key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// TransientStorage_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState' +type TransientStorage_GetTransientState_Call struct { + *mock.Call +} + +// GetTransientState is a helper method to define mock.On call +// - addr common.Address +// - key common.Hash +func (_e *TransientStorage_Expecter) GetTransientState(addr interface{}, key interface{}) *TransientStorage_GetTransientState_Call { + return &TransientStorage_GetTransientState_Call{Call: _e.mock.On("GetTransientState", addr, key)} +} + +func (_c *TransientStorage_GetTransientState_Call) Run(run func(addr common.Address, key common.Hash)) *TransientStorage_GetTransientState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *TransientStorage_GetTransientState_Call) Return(_a0 common.Hash) *TransientStorage_GetTransientState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TransientStorage_GetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *TransientStorage_GetTransientState_Call { + _c.Call.Return(run) + return _c +} + +// RegistryKey provides a mock function with given fields: +func (_m *TransientStorage) RegistryKey() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// TransientStorage_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +type TransientStorage_RegistryKey_Call struct { + *mock.Call +} + +// RegistryKey is a helper method to define mock.On call +func (_e *TransientStorage_Expecter) RegistryKey() *TransientStorage_RegistryKey_Call { + return &TransientStorage_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} +} + +func (_c *TransientStorage_RegistryKey_Call) Run(run func()) *TransientStorage_RegistryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TransientStorage_RegistryKey_Call) Return(_a0 string) *TransientStorage_RegistryKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TransientStorage_RegistryKey_Call) RunAndReturn(run func() string) *TransientStorage_RegistryKey_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *TransientStorage) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// TransientStorage_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type TransientStorage_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *TransientStorage_Expecter) RevertToSnapshot(_a0 interface{}) *TransientStorage_RevertToSnapshot_Call { + return &TransientStorage_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *TransientStorage_RevertToSnapshot_Call) Run(run func(_a0 int)) *TransientStorage_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *TransientStorage_RevertToSnapshot_Call) Return() *TransientStorage_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *TransientStorage_RevertToSnapshot_Call) RunAndReturn(run func(int)) *TransientStorage_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SetTransientState provides a mock function with given fields: addr, key, value +func (_m *TransientStorage) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { + _m.Called(addr, key, value) +} + +// TransientStorage_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState' +type TransientStorage_SetTransientState_Call struct { + *mock.Call +} + +// SetTransientState is a helper method to define mock.On call +// - addr common.Address +// - key common.Hash +// - value common.Hash +func (_e *TransientStorage_Expecter) SetTransientState(addr interface{}, key interface{}, value interface{}) *TransientStorage_SetTransientState_Call { + return &TransientStorage_SetTransientState_Call{Call: _e.mock.On("SetTransientState", addr, key, value)} +} + +func (_c *TransientStorage_SetTransientState_Call) Run(run func(addr common.Address, key common.Hash, value common.Hash)) *TransientStorage_SetTransientState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) + }) + return _c +} + +func (_c *TransientStorage_SetTransientState_Call) Return() *TransientStorage_SetTransientState_Call { + _c.Call.Return() + return _c +} + +func (_c *TransientStorage_SetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *TransientStorage_SetTransientState_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *TransientStorage) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// TransientStorage_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type TransientStorage_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *TransientStorage_Expecter) Snapshot() *TransientStorage_Snapshot_Call { + return &TransientStorage_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *TransientStorage_Snapshot_Call) Run(run func()) *TransientStorage_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TransientStorage_Snapshot_Call) Return(_a0 int) *TransientStorage_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TransientStorage_Snapshot_Call) RunAndReturn(run func() int) *TransientStorage_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// NewTransientStorage creates a new instance of TransientStorage. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTransientStorage(t interface { + mock.TestingT + Cleanup(func()) +}) *TransientStorage { + mock := &TransientStorage{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/mock/state.go b/eth/core/state/mock/state.go index 19dbc0a2f6..6da6acb57c 100644 --- a/eth/core/state/mock/state.go +++ b/eth/core/state/mock/state.go @@ -83,13 +83,13 @@ func NewEmptyStatePlugin() *PluginMock { }, GetBalanceFunc: func(address common.Address) *big.Int { if _, ok := Accounts[address]; !ok { - panic("acct doesnt exist") + return new(big.Int).SetUint64(0) } return Accounts[address].Balance }, GetCodeFunc: func(address common.Address) []byte { if _, ok := Accounts[address]; !ok { - panic("acct doesnt exist") + return nil } return Accounts[address].Code }, diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go new file mode 100644 index 0000000000..e3bc4fb604 --- /dev/null +++ b/eth/core/state/mocks/plugin.go @@ -0,0 +1,1077 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + state "pkg.berachain.dev/polaris/eth/core/state" +) + +// Plugin is an autogenerated mock type for the Plugin type +type Plugin struct { + mock.Mock +} + +type Plugin_Expecter struct { + mock *mock.Mock +} + +func (_m *Plugin) EXPECT() *Plugin_Expecter { + return &Plugin_Expecter{mock: &_m.Mock} +} + +// AddBalance provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) AddBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// Plugin_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance' +type Plugin_AddBalance_Call struct { + *mock.Call +} + +// AddBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *Plugin_Expecter) AddBalance(_a0 interface{}, _a1 interface{}) *Plugin_AddBalance_Call { + return &Plugin_AddBalance_Call{Call: _e.mock.On("AddBalance", _a0, _a1)} +} + +func (_c *Plugin_AddBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *Plugin_AddBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *Plugin_AddBalance_Call) Return() *Plugin_AddBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_AddBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *Plugin_AddBalance_Call { + _c.Call.Return(run) + return _c +} + +// Clone provides a mock function with given fields: +func (_m *Plugin) Clone() state.Plugin { + ret := _m.Called() + + var r0 state.Plugin + if rf, ok := ret.Get(0).(func() state.Plugin); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(state.Plugin) + } + } + + return r0 +} + +// Plugin_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +type Plugin_Clone_Call struct { + *mock.Call +} + +// Clone is a helper method to define mock.On call +func (_e *Plugin_Expecter) Clone() *Plugin_Clone_Call { + return &Plugin_Clone_Call{Call: _e.mock.On("Clone")} +} + +func (_c *Plugin_Clone_Call) Run(run func()) *Plugin_Clone_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Plugin_Clone_Call) Return(_a0 state.Plugin) *Plugin_Clone_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_Clone_Call) RunAndReturn(run func() state.Plugin) *Plugin_Clone_Call { + _c.Call.Return(run) + return _c +} + +// CreateAccount provides a mock function with given fields: _a0 +func (_m *Plugin) CreateAccount(_a0 common.Address) { + _m.Called(_a0) +} + +// Plugin_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount' +type Plugin_CreateAccount_Call struct { + *mock.Call +} + +// CreateAccount is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) CreateAccount(_a0 interface{}) *Plugin_CreateAccount_Call { + return &Plugin_CreateAccount_Call{Call: _e.mock.On("CreateAccount", _a0)} +} + +func (_c *Plugin_CreateAccount_Call) Run(run func(_a0 common.Address)) *Plugin_CreateAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_CreateAccount_Call) Return() *Plugin_CreateAccount_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_CreateAccount_Call) RunAndReturn(run func(common.Address)) *Plugin_CreateAccount_Call { + _c.Call.Return(run) + return _c +} + +// DeleteAccounts provides a mock function with given fields: _a0 +func (_m *Plugin) DeleteAccounts(_a0 []common.Address) { + _m.Called(_a0) +} + +// Plugin_DeleteAccounts_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccounts' +type Plugin_DeleteAccounts_Call struct { + *mock.Call +} + +// DeleteAccounts is a helper method to define mock.On call +// - _a0 []common.Address +func (_e *Plugin_Expecter) DeleteAccounts(_a0 interface{}) *Plugin_DeleteAccounts_Call { + return &Plugin_DeleteAccounts_Call{Call: _e.mock.On("DeleteAccounts", _a0)} +} + +func (_c *Plugin_DeleteAccounts_Call) Run(run func(_a0 []common.Address)) *Plugin_DeleteAccounts_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]common.Address)) + }) + return _c +} + +func (_c *Plugin_DeleteAccounts_Call) Return() *Plugin_DeleteAccounts_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_DeleteAccounts_Call) RunAndReturn(run func([]common.Address)) *Plugin_DeleteAccounts_Call { + _c.Call.Return(run) + return _c +} + +// Empty provides a mock function with given fields: _a0 +func (_m *Plugin) Empty(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Plugin_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty' +type Plugin_Empty_Call struct { + *mock.Call +} + +// Empty is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) Empty(_a0 interface{}) *Plugin_Empty_Call { + return &Plugin_Empty_Call{Call: _e.mock.On("Empty", _a0)} +} + +func (_c *Plugin_Empty_Call) Run(run func(_a0 common.Address)) *Plugin_Empty_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_Empty_Call) Return(_a0 bool) *Plugin_Empty_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_Empty_Call) RunAndReturn(run func(common.Address) bool) *Plugin_Empty_Call { + _c.Call.Return(run) + return _c +} + +// Error provides a mock function with given fields: +func (_m *Plugin) Error() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Plugin_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' +type Plugin_Error_Call struct { + *mock.Call +} + +// Error is a helper method to define mock.On call +func (_e *Plugin_Expecter) Error() *Plugin_Error_Call { + return &Plugin_Error_Call{Call: _e.mock.On("Error")} +} + +func (_c *Plugin_Error_Call) Run(run func()) *Plugin_Error_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Plugin_Error_Call) Return(_a0 error) *Plugin_Error_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_Error_Call) RunAndReturn(run func() error) *Plugin_Error_Call { + _c.Call.Return(run) + return _c +} + +// Exist provides a mock function with given fields: _a0 +func (_m *Plugin) Exist(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Plugin_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist' +type Plugin_Exist_Call struct { + *mock.Call +} + +// Exist is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) Exist(_a0 interface{}) *Plugin_Exist_Call { + return &Plugin_Exist_Call{Call: _e.mock.On("Exist", _a0)} +} + +func (_c *Plugin_Exist_Call) Run(run func(_a0 common.Address)) *Plugin_Exist_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_Exist_Call) Return(_a0 bool) *Plugin_Exist_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_Exist_Call) RunAndReturn(run func(common.Address) bool) *Plugin_Exist_Call { + _c.Call.Return(run) + return _c +} + +// Finalize provides a mock function with given fields: +func (_m *Plugin) Finalize() { + _m.Called() +} + +// Plugin_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +type Plugin_Finalize_Call struct { + *mock.Call +} + +// Finalize is a helper method to define mock.On call +func (_e *Plugin_Expecter) Finalize() *Plugin_Finalize_Call { + return &Plugin_Finalize_Call{Call: _e.mock.On("Finalize")} +} + +func (_c *Plugin_Finalize_Call) Run(run func()) *Plugin_Finalize_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Plugin_Finalize_Call) Return() *Plugin_Finalize_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_Finalize_Call) RunAndReturn(run func()) *Plugin_Finalize_Call { + _c.Call.Return(run) + return _c +} + +// ForEachStorage provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) ForEachStorage(_a0 common.Address, _a1 func(common.Hash, common.Hash) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(common.Address, func(common.Hash, common.Hash) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Plugin_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage' +type Plugin_ForEachStorage_Call struct { + *mock.Call +} + +// ForEachStorage is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 func(common.Hash , common.Hash) bool +func (_e *Plugin_Expecter) ForEachStorage(_a0 interface{}, _a1 interface{}) *Plugin_ForEachStorage_Call { + return &Plugin_ForEachStorage_Call{Call: _e.mock.On("ForEachStorage", _a0, _a1)} +} + +func (_c *Plugin_ForEachStorage_Call) Run(run func(_a0 common.Address, _a1 func(common.Hash, common.Hash) bool)) *Plugin_ForEachStorage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(func(common.Hash, common.Hash) bool)) + }) + return _c +} + +func (_c *Plugin_ForEachStorage_Call) Return(_a0 error) *Plugin_ForEachStorage_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_ForEachStorage_Call) RunAndReturn(run func(common.Address, func(common.Hash, common.Hash) bool) error) *Plugin_ForEachStorage_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: _a0 +func (_m *Plugin) GetBalance(_a0 common.Address) *big.Int { + ret := _m.Called(_a0) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(common.Address) *big.Int); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + return r0 +} + +// Plugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type Plugin_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) GetBalance(_a0 interface{}) *Plugin_GetBalance_Call { + return &Plugin_GetBalance_Call{Call: _e.mock.On("GetBalance", _a0)} +} + +func (_c *Plugin_GetBalance_Call) Run(run func(_a0 common.Address)) *Plugin_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_GetBalance_Call) Return(_a0 *big.Int) *Plugin_GetBalance_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int) *Plugin_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetCode provides a mock function with given fields: _a0 +func (_m *Plugin) GetCode(_a0 common.Address) []byte { + ret := _m.Called(_a0) + + var r0 []byte + if rf, ok := ret.Get(0).(func(common.Address) []byte); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// Plugin_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode' +type Plugin_GetCode_Call struct { + *mock.Call +} + +// GetCode is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) GetCode(_a0 interface{}) *Plugin_GetCode_Call { + return &Plugin_GetCode_Call{Call: _e.mock.On("GetCode", _a0)} +} + +func (_c *Plugin_GetCode_Call) Run(run func(_a0 common.Address)) *Plugin_GetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_GetCode_Call) Return(_a0 []byte) *Plugin_GetCode_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetCode_Call) RunAndReturn(run func(common.Address) []byte) *Plugin_GetCode_Call { + _c.Call.Return(run) + return _c +} + +// GetCodeHash provides a mock function with given fields: _a0 +func (_m *Plugin) GetCodeHash(_a0 common.Address) common.Hash { + ret := _m.Called(_a0) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// Plugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' +type Plugin_GetCodeHash_Call struct { + *mock.Call +} + +// GetCodeHash is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) GetCodeHash(_a0 interface{}) *Plugin_GetCodeHash_Call { + return &Plugin_GetCodeHash_Call{Call: _e.mock.On("GetCodeHash", _a0)} +} + +func (_c *Plugin_GetCodeHash_Call) Run(run func(_a0 common.Address)) *Plugin_GetCodeHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_GetCodeHash_Call) Return(_a0 common.Hash) *Plugin_GetCodeHash_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetCodeHash_Call) RunAndReturn(run func(common.Address) common.Hash) *Plugin_GetCodeHash_Call { + _c.Call.Return(run) + return _c +} + +// GetCommittedState provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) GetCommittedState(_a0 common.Address, _a1 common.Hash) common.Hash { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// Plugin_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState' +type Plugin_GetCommittedState_Call struct { + *mock.Call +} + +// GetCommittedState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *Plugin_Expecter) GetCommittedState(_a0 interface{}, _a1 interface{}) *Plugin_GetCommittedState_Call { + return &Plugin_GetCommittedState_Call{Call: _e.mock.On("GetCommittedState", _a0, _a1)} +} + +func (_c *Plugin_GetCommittedState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *Plugin_GetCommittedState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *Plugin_GetCommittedState_Call) Return(_a0 common.Hash) *Plugin_GetCommittedState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetCommittedState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *Plugin_GetCommittedState_Call { + _c.Call.Return(run) + return _c +} + +// GetContext provides a mock function with given fields: +func (_m *Plugin) GetContext() context.Context { + ret := _m.Called() + + var r0 context.Context + if rf, ok := ret.Get(0).(func() context.Context); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(context.Context) + } + } + + return r0 +} + +// Plugin_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext' +type Plugin_GetContext_Call struct { + *mock.Call +} + +// GetContext is a helper method to define mock.On call +func (_e *Plugin_Expecter) GetContext() *Plugin_GetContext_Call { + return &Plugin_GetContext_Call{Call: _e.mock.On("GetContext")} +} + +func (_c *Plugin_GetContext_Call) Run(run func()) *Plugin_GetContext_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Plugin_GetContext_Call) Return(_a0 context.Context) *Plugin_GetContext_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetContext_Call) RunAndReturn(run func() context.Context) *Plugin_GetContext_Call { + _c.Call.Return(run) + return _c +} + +// GetNonce provides a mock function with given fields: _a0 +func (_m *Plugin) GetNonce(_a0 common.Address) uint64 { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(common.Address) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// Plugin_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce' +type Plugin_GetNonce_Call struct { + *mock.Call +} + +// GetNonce is a helper method to define mock.On call +// - _a0 common.Address +func (_e *Plugin_Expecter) GetNonce(_a0 interface{}) *Plugin_GetNonce_Call { + return &Plugin_GetNonce_Call{Call: _e.mock.On("GetNonce", _a0)} +} + +func (_c *Plugin_GetNonce_Call) Run(run func(_a0 common.Address)) *Plugin_GetNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *Plugin_GetNonce_Call) Return(_a0 uint64) *Plugin_GetNonce_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetNonce_Call) RunAndReturn(run func(common.Address) uint64) *Plugin_GetNonce_Call { + _c.Call.Return(run) + return _c +} + +// GetState provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// Plugin_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState' +type Plugin_GetState_Call struct { + *mock.Call +} + +// GetState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *Plugin_Expecter) GetState(_a0 interface{}, _a1 interface{}) *Plugin_GetState_Call { + return &Plugin_GetState_Call{Call: _e.mock.On("GetState", _a0, _a1)} +} + +func (_c *Plugin_GetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *Plugin_GetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *Plugin_GetState_Call) Return(_a0 common.Hash) *Plugin_GetState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_GetState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *Plugin_GetState_Call { + _c.Call.Return(run) + return _c +} + +// Prepare provides a mock function with given fields: _a0 +func (_m *Plugin) Prepare(_a0 context.Context) { + _m.Called(_a0) +} + +// Plugin_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare' +type Plugin_Prepare_Call struct { + *mock.Call +} + +// Prepare is a helper method to define mock.On call +// - _a0 context.Context +func (_e *Plugin_Expecter) Prepare(_a0 interface{}) *Plugin_Prepare_Call { + return &Plugin_Prepare_Call{Call: _e.mock.On("Prepare", _a0)} +} + +func (_c *Plugin_Prepare_Call) Run(run func(_a0 context.Context)) *Plugin_Prepare_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *Plugin_Prepare_Call) Return() *Plugin_Prepare_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_Prepare_Call) RunAndReturn(run func(context.Context)) *Plugin_Prepare_Call { + _c.Call.Return(run) + return _c +} + +// RegistryKey provides a mock function with given fields: +func (_m *Plugin) RegistryKey() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Plugin_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +type Plugin_RegistryKey_Call struct { + *mock.Call +} + +// RegistryKey is a helper method to define mock.On call +func (_e *Plugin_Expecter) RegistryKey() *Plugin_RegistryKey_Call { + return &Plugin_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} +} + +func (_c *Plugin_RegistryKey_Call) Run(run func()) *Plugin_RegistryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Plugin_RegistryKey_Call) Return(_a0 string) *Plugin_RegistryKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_RegistryKey_Call) RunAndReturn(run func() string) *Plugin_RegistryKey_Call { + _c.Call.Return(run) + return _c +} + +// Reset provides a mock function with given fields: _a0 +func (_m *Plugin) Reset(_a0 context.Context) { + _m.Called(_a0) +} + +// Plugin_Reset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reset' +type Plugin_Reset_Call struct { + *mock.Call +} + +// Reset is a helper method to define mock.On call +// - _a0 context.Context +func (_e *Plugin_Expecter) Reset(_a0 interface{}) *Plugin_Reset_Call { + return &Plugin_Reset_Call{Call: _e.mock.On("Reset", _a0)} +} + +func (_c *Plugin_Reset_Call) Run(run func(_a0 context.Context)) *Plugin_Reset_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *Plugin_Reset_Call) Return() *Plugin_Reset_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_Reset_Call) RunAndReturn(run func(context.Context)) *Plugin_Reset_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *Plugin) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// Plugin_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type Plugin_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *Plugin_Expecter) RevertToSnapshot(_a0 interface{}) *Plugin_RevertToSnapshot_Call { + return &Plugin_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *Plugin_RevertToSnapshot_Call) Run(run func(_a0 int)) *Plugin_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *Plugin_RevertToSnapshot_Call) Return() *Plugin_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Plugin_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SetBalance provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) SetBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// Plugin_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance' +type Plugin_SetBalance_Call struct { + *mock.Call +} + +// SetBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *Plugin_Expecter) SetBalance(_a0 interface{}, _a1 interface{}) *Plugin_SetBalance_Call { + return &Plugin_SetBalance_Call{Call: _e.mock.On("SetBalance", _a0, _a1)} +} + +func (_c *Plugin_SetBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *Plugin_SetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *Plugin_SetBalance_Call) Return() *Plugin_SetBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_SetBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *Plugin_SetBalance_Call { + _c.Call.Return(run) + return _c +} + +// SetCode provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) SetCode(_a0 common.Address, _a1 []byte) { + _m.Called(_a0, _a1) +} + +// Plugin_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode' +type Plugin_SetCode_Call struct { + *mock.Call +} + +// SetCode is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 []byte +func (_e *Plugin_Expecter) SetCode(_a0 interface{}, _a1 interface{}) *Plugin_SetCode_Call { + return &Plugin_SetCode_Call{Call: _e.mock.On("SetCode", _a0, _a1)} +} + +func (_c *Plugin_SetCode_Call) Run(run func(_a0 common.Address, _a1 []byte)) *Plugin_SetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].([]byte)) + }) + return _c +} + +func (_c *Plugin_SetCode_Call) Return() *Plugin_SetCode_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_SetCode_Call) RunAndReturn(run func(common.Address, []byte)) *Plugin_SetCode_Call { + _c.Call.Return(run) + return _c +} + +// SetNonce provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) SetNonce(_a0 common.Address, _a1 uint64) { + _m.Called(_a0, _a1) +} + +// Plugin_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce' +type Plugin_SetNonce_Call struct { + *mock.Call +} + +// SetNonce is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 uint64 +func (_e *Plugin_Expecter) SetNonce(_a0 interface{}, _a1 interface{}) *Plugin_SetNonce_Call { + return &Plugin_SetNonce_Call{Call: _e.mock.On("SetNonce", _a0, _a1)} +} + +func (_c *Plugin_SetNonce_Call) Run(run func(_a0 common.Address, _a1 uint64)) *Plugin_SetNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(uint64)) + }) + return _c +} + +func (_c *Plugin_SetNonce_Call) Return() *Plugin_SetNonce_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_SetNonce_Call) RunAndReturn(run func(common.Address, uint64)) *Plugin_SetNonce_Call { + _c.Call.Return(run) + return _c +} + +// SetState provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Plugin) SetState(_a0 common.Address, _a1 common.Hash, _a2 common.Hash) { + _m.Called(_a0, _a1, _a2) +} + +// Plugin_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState' +type Plugin_SetState_Call struct { + *mock.Call +} + +// SetState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +// - _a2 common.Hash +func (_e *Plugin_Expecter) SetState(_a0 interface{}, _a1 interface{}, _a2 interface{}) *Plugin_SetState_Call { + return &Plugin_SetState_Call{Call: _e.mock.On("SetState", _a0, _a1, _a2)} +} + +func (_c *Plugin_SetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash, _a2 common.Hash)) *Plugin_SetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) + }) + return _c +} + +func (_c *Plugin_SetState_Call) Return() *Plugin_SetState_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_SetState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *Plugin_SetState_Call { + _c.Call.Return(run) + return _c +} + +// SetStorage provides a mock function with given fields: addr, storage +func (_m *Plugin) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { + _m.Called(addr, storage) +} + +// Plugin_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage' +type Plugin_SetStorage_Call struct { + *mock.Call +} + +// SetStorage is a helper method to define mock.On call +// - addr common.Address +// - storage map[common.Hash]common.Hash +func (_e *Plugin_Expecter) SetStorage(addr interface{}, storage interface{}) *Plugin_SetStorage_Call { + return &Plugin_SetStorage_Call{Call: _e.mock.On("SetStorage", addr, storage)} +} + +func (_c *Plugin_SetStorage_Call) Run(run func(addr common.Address, storage map[common.Hash]common.Hash)) *Plugin_SetStorage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(map[common.Hash]common.Hash)) + }) + return _c +} + +func (_c *Plugin_SetStorage_Call) Return() *Plugin_SetStorage_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_SetStorage_Call) RunAndReturn(run func(common.Address, map[common.Hash]common.Hash)) *Plugin_SetStorage_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *Plugin) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// Plugin_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type Plugin_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *Plugin_Expecter) Snapshot() *Plugin_Snapshot_Call { + return &Plugin_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *Plugin_Snapshot_Call) Run(run func()) *Plugin_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Plugin_Snapshot_Call) Return(_a0 int) *Plugin_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Plugin_Snapshot_Call) RunAndReturn(run func() int) *Plugin_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// SubBalance provides a mock function with given fields: _a0, _a1 +func (_m *Plugin) SubBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// Plugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' +type Plugin_SubBalance_Call struct { + *mock.Call +} + +// SubBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *Plugin_Expecter) SubBalance(_a0 interface{}, _a1 interface{}) *Plugin_SubBalance_Call { + return &Plugin_SubBalance_Call{Call: _e.mock.On("SubBalance", _a0, _a1)} +} + +func (_c *Plugin_SubBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *Plugin_SubBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *Plugin_SubBalance_Call) Return() *Plugin_SubBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *Plugin_SubBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *Plugin_SubBalance_Call { + _c.Call.Return(run) + return _c +} + +// NewPlugin creates a new instance of Plugin. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewPlugin(t interface { + mock.TestingT + Cleanup(func()) +}) *Plugin { + mock := &Plugin{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go new file mode 100644 index 0000000000..79b4af28ee --- /dev/null +++ b/eth/core/state/mocks/precompile_plugin.go @@ -0,0 +1,77 @@ +// Code generated by mockery v2.34.1. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + mock "github.com/stretchr/testify/mock" +) + +// PrecompilePlugin is an autogenerated mock type for the PrecompilePlugin type +type PrecompilePlugin struct { + mock.Mock +} + +type PrecompilePlugin_Expecter struct { + mock *mock.Mock +} + +func (_m *PrecompilePlugin) EXPECT() *PrecompilePlugin_Expecter { + return &PrecompilePlugin_Expecter{mock: &_m.Mock} +} + +// Has provides a mock function with given fields: _a0 +func (_m *PrecompilePlugin) Has(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// PrecompilePlugin_Has_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Has' +type PrecompilePlugin_Has_Call struct { + *mock.Call +} + +// Has is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PrecompilePlugin_Expecter) Has(_a0 interface{}) *PrecompilePlugin_Has_Call { + return &PrecompilePlugin_Has_Call{Call: _e.mock.On("Has", _a0)} +} + +func (_c *PrecompilePlugin_Has_Call) Run(run func(_a0 common.Address)) *PrecompilePlugin_Has_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PrecompilePlugin_Has_Call) Return(_a0 bool) *PrecompilePlugin_Has_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PrecompilePlugin_Has_Call) RunAndReturn(run func(common.Address) bool) *PrecompilePlugin_Has_Call { + _c.Call.Return(run) + return _c +} + +// NewPrecompilePlugin creates a new instance of PrecompilePlugin. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewPrecompilePlugin(t interface { + mock.TestingT + Cleanup(func()) +}) *PrecompilePlugin { + mock := &PrecompilePlugin{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index b6d3b8c81f..9e79abcb9a 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -32,10 +32,17 @@ import ( libtypes "pkg.berachain.dev/polaris/lib/types" ) +// PrecompilePlugin defines the interface to check for the existence of a precompile at an +// address. +type PrecompilePlugin interface { + Has(common.Address) bool +} + // stateDB is a struct that holds the plugins and controller to manage Ethereum state. type stateDB struct { // Plugin is injected by the chain running the Polaris EVM. Plugin + pp PrecompilePlugin // Journals built internally and required for the stateDB. journal.Log @@ -49,18 +56,24 @@ type stateDB struct { } // NewStateDB returns a vm.PolarisStateDB with the given StatePlugin and new journals. -func NewStateDB(sp Plugin) vm.PolarisStateDB { +func NewStateDB(sp Plugin, pp PrecompilePlugin) vm.PolarisStateDB { return newStateDBWithJournals( - sp, journal.NewLogs(), journal.NewRefund(), journal.NewAccesslist(), + sp, pp, journal.NewLogs(), journal.NewRefund(), journal.NewAccesslist(), journal.NewSelfDestructs(sp), journal.NewTransientStorage(), ) } // newStateDBWithJournals returns a vm.PolarisStateDB with the given StatePlugin and journals. func newStateDBWithJournals( - sp Plugin, lj journal.Log, rj journal.Refund, aj journal.Accesslist, + sp Plugin, pp PrecompilePlugin, lj journal.Log, rj journal.Refund, aj journal.Accesslist, sj journal.SelfDestructs, tj journal.TransientStorage, ) vm.PolarisStateDB { + if sp == nil { + panic("StatePlugin is nil in newStateDBWithJournals") + } else if pp == nil { + panic("PrecompilePlugin is nil in newStateDBWithJournals") + } + // Build the controller and register the plugins and journals ctrl := snapshot.NewController[string, libtypes.Controllable[string]]() _ = ctrl.Register(sp) @@ -72,6 +85,7 @@ func newStateDBWithJournals( return &stateDB{ Plugin: sp, + pp: pp, Log: lj, Refund: rj, Accesslist: aj, @@ -115,8 +129,9 @@ func (sdb *stateDB) Finalise(bool) { sdb.ctrl.Finalize() } -func (sdb *stateDB) Commit(block uint64, deleteEmptyObjects bool) (common.Hash, error) { - _ = block // todo figure out what to do here. +// Commit implements vm.PolarisStateDB. +// TODO: determine sideaffects of this function. +func (sdb *stateDB) Commit(_ uint64, deleteEmptyObjects bool) (common.Hash, error) { sdb.Finalise(deleteEmptyObjects) return common.Hash{}, nil } @@ -169,9 +184,19 @@ func (sdb *stateDB) Preimages() map[common.Hash][]byte { } // ============================================================================= -// Code Size +// Code // ============================================================================= +// GetCodeSize implements the vm.PolarisStateDB interface by returning the size of the +// code associated with the given account. +func (sdb *stateDB) GetCode(addr common.Address) []byte { + // We return a single byte for client compatibility w/precompiles. + if sdb.pp.Has(addr) { + return []byte{0x01} + } + return sdb.Plugin.GetCode(addr) +} + // GetCodeSize implements the vm.PolarisStateDB interface by returning the size of the // code associated with the given account. func (sdb *stateDB) GetCodeSize(addr common.Address) int { @@ -189,7 +214,7 @@ func (sdb *stateDB) Copy() StateDBI { panic("failed to clone logs") } statedb, ok := newStateDBWithJournals( - sdb.Plugin.Clone(), logs, sdb.Refund.Clone(), + sdb.Plugin.Clone(), sdb.pp, logs, sdb.Refund.Clone(), sdb.Accesslist.Clone(), sdb.SelfDestructs.Clone(), sdb.TransientStorage.Clone(), ).(StateDBI) if !ok { diff --git a/eth/core/state/statedb_test.go b/eth/core/state/statedb_test.go index 2aae048a97..54af659dd1 100644 --- a/eth/core/state/statedb_test.go +++ b/eth/core/state/statedb_test.go @@ -27,6 +27,7 @@ import ( "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/state/mock" + "pkg.berachain.dev/polaris/eth/core/state/mocks" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/params" @@ -44,10 +45,12 @@ var ( var _ = Describe("StateDB", func() { var sdb vm.PolarisStateDB var sp *mock.PluginMock + var pp *mocks.PrecompilePlugin BeforeEach(func() { sp = mock.NewEmptyStatePlugin() - sdb = state.NewStateDB(sp) + pp = mocks.NewPrecompilePlugin(GinkgoT()) + sdb = state.NewStateDB(sp, pp) }) It("Should SelfDestruct correctly", func() { @@ -127,4 +130,11 @@ var _ = Describe("StateDB", func() { Expect(err).To(HaveOccurred()) Expect(err.Error()).To(Equal("mocked saved error")) }) + + It("should return code for precompiles", func() { + pp.On("Has", common.Address{0x7}).Return(true).Once() + Expect(sdb.GetCode(common.Address{0x7})).To(Equal([]byte{0x1})) + pp.On("Has", common.Address{0x7}).Return(false).Once() + Expect(sdb.GetCode(common.Address{0x7})).To(Equal([]byte{})) + }) }) diff --git a/eth/miner/miner.go b/eth/miner/miner.go index d527c5179d..3ca9166c15 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -29,6 +29,7 @@ import ( "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/txpool" "pkg.berachain.dev/polaris/eth/core/types" @@ -69,6 +70,7 @@ type miner struct { bp core.BlockPlugin cp core.ConfigurationPlugin gp core.GasPlugin + pp core.PrecompilePlugin sp core.StatePlugin logger log.Logger vmConfig vm.Config @@ -100,9 +102,13 @@ func NewMiner(backend Backend) Miner { logger: log.Root(), // todo: fix. } - m.statedb = state.NewStateDB(m.sp) + m.pp = host.GetPrecompilePlugin() + if m.pp == nil { + m.pp = precompile.NewDefaultPlugin() + } + m.statedb = state.NewStateDB(m.sp, m.pp) m.processor = core.NewStateProcessor( - m.cp, host.GetPrecompilePlugin(), m.statedb, &m.vmConfig, + m.cp, m.pp, m.statedb, &m.vmConfig, ) return m @@ -198,7 +204,8 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { context = core.NewEVMBlockContext(m.pendingHeader, m.chain, &m.pendingHeader.Coinbase) vmenv = vm.NewGethEVMWithPrecompiles(context, vm.TxContext{}, m.statedb, chainConfig, m.vmConfig, - m.backend.Host().GetPrecompilePlugin()) + m.pp, + ) ) // Prepare the State Processor, StateDB and the EVM for the block. From b5d1044b9f7ba046b53130de9ecb9bea80875628 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 29 Sep 2023 14:52:19 -0400 Subject: [PATCH 043/122] chore(txpool): Use updated serializer type (#1162) --- cosmos/x/evm/plugins/txpool/plugin.go | 22 +---- cosmos/x/evm/plugins/txpool/serializer.go | 106 ---------------------- 2 files changed, 5 insertions(+), 123 deletions(-) delete mode 100644 cosmos/x/evm/plugins/txpool/serializer.go diff --git a/cosmos/x/evm/plugins/txpool/plugin.go b/cosmos/x/evm/plugins/txpool/plugin.go index 3661cf7948..34e96310f0 100644 --- a/cosmos/x/evm/plugins/txpool/plugin.go +++ b/cosmos/x/evm/plugins/txpool/plugin.go @@ -25,11 +25,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/event" + "pkg.berachain.dev/polaris/cosmos/txpool" mempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" + "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" errorslib "pkg.berachain.dev/polaris/lib/errors" @@ -50,6 +51,7 @@ type plugin struct { *mempool.EthTxPool clientContext client.Context + serializer txpool.TxSerializer // txFeed and scope is used to send new batch transactions to new txs subscribers when the // batch is added to the mempool. @@ -67,6 +69,7 @@ func NewPlugin(ethTxMempool *mempool.EthTxPool) Plugin { // SetClientContext implements the Plugin interface. func (p *plugin) SetClientContext(ctx client.Context) { p.clientContext = ctx + p.serializer = types.NewSerializer(p.clientContext.TxConfig) } // SubscribeNewTxsEvent returns a new event subscription for the new txs feed. @@ -79,7 +82,7 @@ func (p *plugin) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscrip // broadcasted to the network. func (p *plugin) SendTx(signedEthTx *coretypes.Transaction) error { // Serialize the transaction to Bytes - txBytes, err := SerializeToBytes(p.clientContext, signedEthTx) + txBytes, err := p.serializer.SerializeToBytes(signedEthTx) if err != nil { return errorslib.Wrap(err, "failed to serialize transaction") } @@ -103,18 +106,3 @@ func (p *plugin) SendTx(signedEthTx *coretypes.Transaction) error { p.txFeed.Send(core.NewTxsEvent{Txs: coretypes.Transactions{signedEthTx}}) return nil } - -// SendPrivTx sends a private transaction to the transaction pool. It takes in a signed ethereum -// transaction from the rpc backend and wraps it in a Cosmos transaction. The Cosmos transaction is -// injected into the local mempool, but is NOT gossiped to peers. -func (p *plugin) SendPrivTx(signedTx *coretypes.Transaction) error { - cosmosTx, err := SerializeToSdkTx(p.clientContext, signedTx) - if err != nil { - return err - } - - // We insert into the local mempool, without gossiping to peers. We use a blank sdk.Context{} - // as the context, as we don't need to use it anyways. We set the priority as the gas price of - // the tx. - return p.EthTxPool.Insert(sdk.Context{}.WithPriority(signedTx.GasPrice().Int64()), cosmosTx) -} diff --git a/cosmos/x/evm/plugins/txpool/serializer.go b/cosmos/x/evm/plugins/txpool/serializer.go deleted file mode 100644 index d2e2af7331..0000000000 --- a/cosmos/x/evm/plugins/txpool/serializer.go +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package txpool - -import ( - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" - - "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - coretypes "pkg.berachain.dev/polaris/eth/core/types" -) - -// SerializeToSdkTx converts an ethereum transaction to a Cosmos native transaction. -func SerializeToSdkTx( - clientCtx client.Context, signedTx *coretypes.Transaction, -) (sdk.Tx, error) { - // Create a new, empty TxBuilder. - tx := clientCtx.TxConfig.NewTxBuilder() - - // We can also retrieve the gaslimit for the transaction from the ethereum transaction. - tx.SetGasLimit(signedTx.Gas()) - - // Thirdly, we set the nonce equal to the nonce of the transaction and also derive the PubKey - // from the V,R,S values of the transaction. This allows us for a little trick to allow - // ethereum transactions to work in the standard cosmos app-side mempool with no modifications. - // Some gigabrain shit tbh. - pkBz, err := coretypes.PubkeyFromTx( - signedTx, coretypes.LatestSignerForChainID(signedTx.ChainId()), - ) - if err != nil { - return nil, err - } - - // Create the WrappedEthereumTransaction message. - wrappedEthTx := types.NewFromTransaction(signedTx) - sig, err := wrappedEthTx.GetSignature() - if err != nil { - return nil, err - } - - // Lastly, we set the signature. We can pull the sequence from the nonce of the ethereum tx. - if err = tx.SetSignatures( - signingtypes.SignatureV2{ - Sequence: signedTx.Nonce(), - Data: &signingtypes.SingleSignatureData{ - // We retrieve the hash of the signed transaction from the ethereum transaction - // objects, as this was the bytes that were signed. We pass these into the - // SingleSignatureData as the SignModeHandler needs to know what data was signed - // over so that it can verify the signature in the ante handler. - Signature: sig, - }, - PubKey: ðsecp256k1.PubKey{Key: pkBz}, - }, - ); err != nil { - return nil, err - } - - // Lastly, we inject the signed ethereum transaction as a message into the Cosmos Tx. - if err = tx.SetMsgs(wrappedEthTx); err != nil { - return nil, err - } - - // Finally, we return the Cosmos Tx. - return tx.GetTx(), nil -} - -// SerializeToBytes converts an Ethereum transaction to Cosmos formatted txBytes which allows for -// it to broadcast it to CometBFT. -func SerializeToBytes( - clientCtx client.Context, signedTx *coretypes.Transaction, -) ([]byte, error) { - // First, we convert the Ethereum transaction to a Cosmos transaction. - cosmosTx, err := SerializeToSdkTx(clientCtx, signedTx) - if err != nil { - return nil, err - } - - // Then we use the clientCtx.TxConfig.TxEncoder() to encode the Cosmos transaction into bytes. - txBytes, err := clientCtx.TxConfig.TxEncoder()(cosmosTx) - if err != nil { - return nil, err - } - - // Finally, we return the txBytes. - return txBytes, nil -} From 46d455fb110b94392166a412f5d2337fb6c12a43 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sat, 30 Sep 2023 22:54:30 -0400 Subject: [PATCH 044/122] feat(txpool): add constructor --- cosmos/txpool/mempool.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index e51f515aa8..a4d055030e 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -49,6 +49,13 @@ type Mempool struct { txpool GethTxPool } +// NewMempool creates a new Mempool. +func NewMempool(txpool GethTxPool) *Mempool { + return &Mempool{ + txpool: txpool, + } +} + // Insert attempts to insert a Tx into the app-side mempool returning // an error upon failure. func (m *Mempool) Insert(_ context.Context, sdkTx sdk.Tx) error { @@ -66,11 +73,6 @@ func (m *Mempool) Insert(_ context.Context, sdkTx sdk.Tx) error { return nil } -// SetTxPool sets the underlying txpool. -func (m *Mempool) SetTxPool(txpool GethTxPool) { - m.txpool = txpool -} - // CountTx returns the number of transactions currently in the mempool. func (m *Mempool) CountTx() int { runnable, blocked := m.txpool.Stats() From 47524ad2c1c769e41b794310d4648249f545665d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 2 Oct 2023 15:51:46 -0400 Subject: [PATCH 045/122] refactor(build): Replace `mage` with Makefile (#1163) --- .github/workflows/codeql.yml | 3 - .github/workflows/e2e.yml | 71 +-- .github/workflows/pipeline.yml | 13 +- .gitignore | 3 +- .golangci.yaml | 2 +- Makefile | 446 ++++++++++++++++- README.md | 10 +- .../distribution_testing_helper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- contracts/lib/ERC20.sol | 46 +- contracts/lib/IERC20.sol | 4 +- contracts/lib/Owned.sol | 2 +- cosmos/README.md | 96 ---- cosmos/txpool/mocks/broadcaster.go | 2 +- cosmos/txpool/mocks/geth_tx_pool.go | 2 +- cosmos/txpool/mocks/handler.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- cosmos/x/evm/genesis.go | 21 +- .../pages/docs/precompile-cosmos-overview.mdx | 2 +- .../docs/running-a-node/running-locally.mdx | 5 +- e2e/hive/clients/polard/hive-init.sh | 2 +- e2e/hive/simulators/README.md | 20 +- e2e/localnet/network/localnet_test.go | 2 +- e2e/precompile/polard/Dockerfile | 11 +- e2e/precompile/polard/start-node.sh | 2 +- e2e/testapp/docker/local/docker-init.sh | 2 +- e2e/testapp/docker/rpc/Dockerfile | 23 - e2e/testapp/docker/sentry/Dockerfile | 23 - e2e/testapp/entrypoint.sh | 14 +- e2e/testapp/polard/cmd/root.go | 10 +- eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- eth/go.mod | 3 + eth/go.sum | 1 + go.work | 2 +- go.work.sum | 451 +++++++++++++++++- magefiles/ci.go | 126 ----- magefiles/cmd/mage.go | 34 -- magefiles/constants.go | 105 ---- magefiles/contracts.go | 107 ----- magefiles/cosmos.go | 191 -------- magefiles/eth.go | 58 --- magefiles/helpers.go | 141 ------ magefiles/hive.go | 144 ------ magefiles/lint.go | 109 ----- magefiles/localnet.go | 47 -- magefiles/namespaces.go | 51 -- magefiles/proto.go | 76 --- magefiles/setup/setup.go | 107 ----- magefiles/tags.go | 83 ---- magefiles/test.go | 50 -- magefiles/tools.go | 93 ---- magefiles/utils/logger.go | 85 ---- scripts/constants.mk | 6 + scripts/cosmos.mk | 96 ++++ {magefiles => tools}/LICENSE | 0 {magefiles => tools}/LICENSE.header | 0 {magefiles => tools}/go.mod | 5 +- {magefiles => tools}/go.sum | 22 - {magefiles/tools => tools}/tools.go | 0 71 files changed, 1093 insertions(+), 1971 deletions(-) delete mode 100644 cosmos/README.md delete mode 100644 e2e/testapp/docker/rpc/Dockerfile delete mode 100644 e2e/testapp/docker/sentry/Dockerfile delete mode 100644 magefiles/ci.go delete mode 100644 magefiles/cmd/mage.go delete mode 100644 magefiles/constants.go delete mode 100644 magefiles/contracts.go delete mode 100644 magefiles/cosmos.go delete mode 100644 magefiles/eth.go delete mode 100644 magefiles/helpers.go delete mode 100644 magefiles/hive.go delete mode 100644 magefiles/lint.go delete mode 100644 magefiles/localnet.go delete mode 100644 magefiles/namespaces.go delete mode 100644 magefiles/proto.go delete mode 100644 magefiles/setup/setup.go delete mode 100644 magefiles/tags.go delete mode 100644 magefiles/test.go delete mode 100644 magefiles/tools.go delete mode 100644 magefiles/utils/logger.go create mode 100644 scripts/constants.mk create mode 100644 scripts/cosmos.mk rename {magefiles => tools}/LICENSE (100%) rename {magefiles => tools}/LICENSE.header (100%) rename {magefiles => tools}/go.mod (99%) rename {magefiles => tools}/go.sum (98%) rename {magefiles/tools => tools}/tools.go (100%) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1fc56b66b6..4242f4c71a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -79,9 +79,6 @@ # key: ${{ runner.os }}-golang-codeql-${{ hashFiles('**/go.sum') }} # restore-keys: | # ${{ runner.os }}-golang-codeql- -# - name: Install Go Tools -# run: | -# go run magefiles/setup/setup.go ci # - name: Perform CodeQL Analysis # uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 216f4fc220..d3579c6a5b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -30,32 +30,33 @@ jobs: build-base: strategy: matrix: - namespace: [cosmos] - docker-version: [base] + docker-type: [base] # Changed docker-version to docker-type for consistency with the Makefile os: [polaris-linux-latest] go-version: [1.21.1] - go-arch: [amd64] + arch: [amd64] # Changed go-arch to arch for consistency with the Makefile image-name: ["polard/base:v0.0.0"] export-name: [base-image] - runs-on: polaris-linux-latest + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v3 + - name: Setup Golang uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - name: Run ${{ matrix.namespace }}:docker ${{ matrix.docker-version }} ${{ matrix.go-arch }} - uses: magefile/mage-action@v2 - with: - version: latest - args: ${{ matrix.namespace }}:docker ${{ matrix.docker-version }} ${{ matrix.go-arch }} + + - name: Build Docker Image using Makefile + run: make docker-build DOCKER_TYPE=${{ matrix.docker-type }} ARCH=${{ matrix.arch }} GO_VERSION=${{ matrix.go-version }} env: GOPATH: /home/runner/go + - name: Save base image run: docker save ${{ matrix.image-name }} -o ${{ matrix.export-name }}.tar + - name: Upload image artifact uses: actions/upload-artifact@v2 with: @@ -67,10 +68,10 @@ jobs: strategy: matrix: namespace: [cosmos] - docker-version: [localnet] + docker-type: [localnet] # Changed docker-version to docker-type for consistency with the Makefile os: [polaris-linux-latest] go-version: [1.21.1] - go-arch: [amd64] + arch: [amd64] # Changed go-arch to arch for consistency with the Makefile base-image: [base-image] image-name: ["polard/localnet:v0.0.0"] export-name: [localnet] @@ -78,27 +79,31 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + - name: Setup Golang uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + - name: Download image artifact uses: actions/download-artifact@v2 with: name: ${{ matrix.base-image }} + - name: Load image run: docker load -i ${{ matrix.base-image }}.tar - - name: Run ${{ matrix.namespace }}:docker ${{ matrix.docker-version }} ${{ matrix.go-arch }} - uses: magefile/mage-action@v2 - with: - version: latest - args: ${{ matrix.namespace }}:docker ${{ matrix.docker-version }} ${{ matrix.go-arch }} + + - name: Build Docker Image using Makefile + run: make docker-build DOCKER_TYPE=${{ matrix.docker-type }} ARCH=${{ matrix.arch }} GO_VERSION=${{ matrix.go-version }} env: GOPATH: /home/runner/go + - name: Save base image run: docker save ${{ matrix.image-name }} -o ${{ matrix.export-name }}.tar + - name: Upload image artifact uses: actions/upload-artifact@v2 with: @@ -109,8 +114,6 @@ jobs: needs: build-base strategy: matrix: - simulator: [polaris/rpc] - namespace: [cosmos] os: [polaris-linux-latest] go-version: [1.21.1] base-image: [base-image] @@ -122,8 +125,6 @@ jobs: uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - name: Download image artifact uses: actions/download-artifact@v2 with: @@ -139,11 +140,8 @@ jobs: key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-golang- - - name: Run ${{ matrix.namespace }}:testhive ${{ matrix.simulator }} - uses: magefile/mage-action@v2 - with: - version: latest - args: ${{ matrix.namespace }}:testhive ${{ matrix.simulator }} + - name: Run `make test-hive` + run: make hive-setup test-hive env: GOPATH: /home/runner/go @@ -151,7 +149,7 @@ jobs: needs: build-localnet strategy: matrix: - namespace: ["", "localnet"] + namespace: ["e2e", "localnet"] os: [polaris-linux-latest] go-version: [1.21.1] base-image: [localnet] @@ -163,8 +161,6 @@ jobs: uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - name: Download image artifact uses: actions/download-artifact@v2 with: @@ -180,22 +176,7 @@ jobs: key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-golang- - - name: Install Go Tools - run: | - go run magefiles/setup/setup.go ci - - name: Run ${{ matrix.namespace }}:test - uses: magefile/mage-action@v2 - with: - version: latest - args: ${{ matrix.namespace }}:test - env: - GOPATH: /home/runner/go - if: ${{ matrix.namespace == 'localnet' }} - - name: Run teste2e - uses: magefile/mage-action@v2 - with: - version: latest - args: teste2e + - name: Run ${{ matrix.namespace }} + run: make test-${{ matrix.namespace }} env: GOPATH: /home/runner/go - if: ${{ matrix.namespace == '' }} diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 6017ee8c38..745bdb95f7 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -30,7 +30,7 @@ jobs: ci: strategy: matrix: - args: ["build", "lint", "testunitrace", "testunitcover"] + args: ["build", "lint", "test-unit-race", "test-unit-cover"] os: [polaris-linux-latest] go-version: [1.21.1] runs-on: ${{ matrix.os }} @@ -52,14 +52,9 @@ jobs: key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-golang- - - name: Install Go Tools - run: | - go run magefiles/setup/setup.go ci - name: Run ${{ matrix.args }} - uses: magefile/mage-action@v2 - with: - version: latest - args: ${{ matrix.args }} + run: | + make ${{ matrix.args }} env: GOPATH: /home/runner/go - name: Archive code coverage results @@ -68,7 +63,7 @@ jobs: name: code-coverage-report path: coverage-${{ matrix.args }}.txt retention-days: 1 - if: ${{ matrix.args == 'testunitcover' }} + if: ${{ matrix.args == 'test-unit-cover' }} codecov: name: codecov(uploader, polaris-linux-latest) diff --git a/.gitignore b/.gitignore index b473f801b5..dcff134f02 100644 --- a/.gitignore +++ b/.gitignore @@ -225,5 +225,4 @@ out **/cache/ # integration testing coverage -coverage-testunitcover.txt -coverage-teste2ecover.txt +coverage-test-unit-cover.txt diff --git a/.golangci.yaml b/.golangci.yaml index ec7a7b6539..9014d98a83 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -320,7 +320,7 @@ issues: max-same-issues: 50 exclude-rules: - - path: "magefiles/.*\\.go" + - path: "tools/.*\\.go" linters: [forbidigo] - path: "mock/.*\\.go" linters: [funlen] diff --git a/Makefile b/Makefile index 0444bca401..34fe448b12 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +1,436 @@ #!/usr/bin/make -f +include scripts/cosmos.mk scripts/constants.mk -# Makefile # Specify the default target if none is provided -.DEFAULT_GOAL := codeqlbuild +.DEFAULT_GOAL := build -# Helper rule to display available targets -help: - @echo "This Makefile is an alias for Mage tasks. Run 'mage' to see available Mage targets." - @echo "You can use 'make ' to call the corresponding 'mage ' command." +############################################################################### +### Build ### +############################################################################### -# Required rule for gh action codeql to run. -codeqlbuild: - @mage build +BUILD_TARGETS := build install -# Rule to forward any target to Mage -%: - @mage $@ +build: BUILD_ARGS=-o $(OUT_DIR)/ -# Rule to setup the project. This is a special case because it's not a Mage target. -setup: - @go run magefiles/setup/setup.go +build-linux-amd64: + GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build -BINDIR ?= $(GOPATH)/bin -CURRENT_DIR = $(shell pwd) +build-linux-arm64: + GOOS=linux GOARCH=arm64 LEDGER_ENABLED=false $(MAKE) build -test-sim-after-import: - @echo "Running application simulation-after-import. This may take several minutes..." - @cd ${CURRENT_DIR}/e2e/testapp && $(BINDIR)/runsim -Jobs=4 -SimAppPkg=. -ExitOnFail 50 5 TestAppSimulationAfterImport +$(BUILD_TARGETS): forge-build tidy $(OUT_DIR)/ + @echo "Building ${TESTAPP_DIR}" + @cd ${CURRENT_DIR}/$(TESTAPP_DIR) && go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... + +$(OUT_DIR)/: + mkdir -p $(OUT_DIR)/ + +build-clean: + @$(MAKE) clean build + +clean: + @rm -rf .tmp/ + @rm -rf $(OUT_DIR) + @$(MAKE) forge-clean + +################# +# forge # +################# + +forge-build: | + @forge build --extra-output-files bin --extra-output-files abi --root $(CONTRACTS_DIR) + +forge-clean: | + @forge clean --root $(CONTRACTS_DIR) + + +################# +# proto # +################# + +protoImageName := "ghcr.io/cosmos/proto-builder" +protoImageVersion := "0.14.0" + +proto: + @$(MAKE) buf-lint-fix buf-lint proto-build + +proto-build: + @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./cosmos/proto/scripts/proto_generate.sh + +############################################################################### +### Docker ### +############################################################################### + +# Variables +DOCKER_TYPE ?= base +ARCH ?= arm64 +GO_VERSION ?= 1.21.1 +IMAGE_NAME ?= polard +IMAGE_VERSION ?= v0.0.0 +BASE_IMAGE ?= polard/base:$(IMAGE_VERSION) + +# Docker Paths +BASE_DOCKER_PATH = ./e2e/testapp/docker +EXEC_DOCKER_PATH = $(BASE_DOCKER_PATH)/base.Dockerfile +LOCAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/local/Dockerfile +SEED_DOCKER_PATH = $(BASE_DOCKER_PATH)/seed/Dockerfile +VAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/validator/Dockerfile +LOCALNET_CLIENT_PATH = ./e2e/precompile/polard +LOCALNET_DOCKER_PATH = $(LOCALNET_CLIENT_PATH)/Dockerfile + +# Image Build +docker-build: + @echo "Build a release docker image for the Cosmos SDK chain..." + @$(MAKE) docker-build-$(DOCKER_TYPE) + +# Docker Build Types +docker-build-base: + $(call docker-build-helper,$(EXEC_DOCKER_PATH),base) + +docker-build-local: + $(call docker-build-helper,$(LOCAL_DOCKER_PATH),local,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-seed: + $(call docker-build-helper,$(SEED_DOCKER_PATH),seed,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-validator: + $(call docker-build-helper,$(VAL_DOCKER_PATH),validator,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-localnet: + $(call docker-build-helper,$(LOCALNET_DOCKER_PATH),localnet,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +# Docker Build Function +define docker-build-helper + docker build \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --platform linux/$(ARCH) \ + --build-arg PRECOMPILE_CONTRACTS_DIR=$(CONTRACTS_DIR) \ + --build-arg GOOS=linux \ + --build-arg GOARCH=$(ARCH) \ + -f $(1) \ + -t $(IMAGE_NAME)/$(2):$(IMAGE_VERSION) \ + $(if $(3),$(3)) \ + . + +endef + +.PHONY: docker-build-localnet + +############################################################################### +### CodeGen ### +############################################################################### + +generate: + @$(MAKE) abigen-install moq-install mockery + @for module in $(MODULES); do \ + echo "Running go generate in $$module"; \ + (cd $$module && go generate ./...) || exit 1; \ + done + +abigen-install: + @echo "--> Installing abigen" + @go install github.com/ethereum/go-ethereum/cmd/abigen@latest + +moq-install: + @echo "--> Installing moq" + @go install github.com/matryer/moq@latest + +mockery-install: + @echo "--> Installing mockery" + @go install github.com/vektra/mockery/v2@latest + +mockery: + @$(MAKE) mockery-install + @echo "Running mockery..." + @mockery + + +############################################################################### +### Tests & Simulation ### +############################################################################### + +################# +# polard # +################# + +start: + @./e2e/testapp/entrypoint.sh + +################# +# unit # +################# + +install-ginkgo: + @echo "Installing ginkgo..." + @go install github.com/onsi/ginkgo/v2/ginkgo@latest + +test-unit: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... + +test-unit-race: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests with race detection..." + @ginkgo --race -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... + +test-unit-cover: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests with coverage..." + @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* \ + --junit-report out.xml --cover --coverprofile "coverage-test-unit-cover.txt" --covermode atomic \ + ./... + +################# +# forge # +################# + +forge-test: + @echo "Running forge test..." + @forge test --root $(CONTRACTS_DIR) + +################# +# e2e # +################# + +test-e2e: + @$(MAKE) test-e2e-no-build + +test-e2e-no-build: + @$(MAKE) install-ginkgo + @echo "Running e2e tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/precompile/... + + +################# +# hive # +################# + +ifndef $(GOPATH) + GOPATH=$(shell go env GOPATH) + export GOPATH +endif + +HIVE_CLONE := $(GOPATH)/src +CLONE_PATH := $(HIVE_CLONE)/.hive-e2e +SIMULATORS_ROOT := $(CLONE_PATH)/simulators +SIMULATORS_PATH := $(SIMULATORS_ROOT)/polaris/ +BASE_HIVE_DOCKER_PATH := ./e2e/hive +CLIENTS_PATH := $(CLONE_PATH)/clients/polard/ +SIMULATIONS := \ + rpc:init/genesis.json:ethclient.hive \ + rpc-compat:Dockerfile:tests \ + +# .PHONY: setup test testv view + +hive-setup: + @echo $(HIVE_CLONE) + @echo "--> Setting up Hive testing environment..." + @test ! -d $(HIVE_CLONE) && mkdir $(HIVE_CLONE) || true + @rm -rf $(CLONE_PATH) + @git clone https://github.com/ethereum/hive $(CLONE_PATH) --depth=1 + @mkdir $(SIMULATORS_PATH) + @cp -rf $(BASE_HIVE_DOCKER_PATH)/clients/polard $(CLIENTS_PATH) + @echo "Copying files..."; + @$(foreach sim,$(SIMULATIONS), \ + $(eval SIM_NAME = $(word 1, $(subst :, ,$(sim)))) \ + $(eval FILES = $(wordlist 2, $(words $(subst :, ,$(sim))), $(subst :, ,$(sim)))) \ + cp -rf $(SIMULATORS_ROOT)/ethereum/$(SIM_NAME) $(SIMULATORS_PATH); \ + $(foreach file,$(FILES), \ + cp -rf $(BASE_HIVE_DOCKER_PATH)/simulators/$(SIM_NAME)/$(file) \ + $(SIMULATORS_PATH)/$(SIM_NAME)/$(file); \ + if [ "$(file)" = "ethclient.hive" ]; then \ + cp -rf $(SIMULATORS_PATH)/$(SIM_NAME)/$(file) $(SIMULATORS_PATH)/$(SIM_NAME)/ethclient.go; \ + fi; \ + ) \ + ) + @cd $(CLONE_PATH) && go install ./... + +hive-view: + @cd $(CLONE_PATH) && \ + go build ./cmd/hiveview && \ + hiveview --serve + +# SHELL := /bin/zsh # Explicitly set to zsh as that is what you are using + +test-hive: + @cd $(CLONE_PATH) && \ + hive --sim polaris/rpc -client polard + +testv-hive: + @cd $(CLONE_PATH) && \ + hive --sim polaris/rpc -client polard --docker.output + + + +################# +# localnet # +################# + +test-localnet: + @$(MAKE) test-localnet-no-build + +test-localnet-no-build: + @$(MAKE) install-ginkgo + @echo "Running localnet tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/localnet/... + + +############################################################################### +### Formatting ### +############################################################################### + +############################################################################### +### Linting ### +############################################################################### + +format: + @$(MAKE) license-fix buf-lint-fix forge-lint-fix golines golangci-fix + +lint: + @$(MAKE) license buf-lint forge-lint golangci gosec + + +################# +# forge # +################# + +forge-lint-fix: + @echo "--> Running forge fmt" + @cd $(CONTRACTS_DIR) && forge fmt + +forge-lint: + @echo "--> Running forge lint" + @cd $(CONTRACTS_DIR) && forge fmt --check + +################# +# golangci-lint # +################# + +golangci_version=v1.54.2 + +golangci-install: + @echo "--> Installing golangci-lint $(golangci_version)" + @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version) + +golangci: + @$(MAKE) golangci-install + @echo "--> Running linter" + @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --concurrency 8 -v + +golangci-fix: + @$(MAKE) golangci-install + @echo "--> Running linter" + @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --fix --concurrency 8 -v + + +################# +# golines # +################# + +golines-install: + @echo "--> Installing golines" + @go install github.com/segmentio/golines + +golines: + @$(MAKE) golines-install + @echo "--> Running golines" + @golines --reformat-tags --shorten-comments --write-output --max-len=99 -l ./. + + +################# +# license # +################# + +license-install: + @echo "--> Installing google/addlicense" + @go install github.com/google/addlicense + +license: + @$(MAKE) license-install + @echo "--> Running addlicense with -check" + @for module in $(MODULES); do \ + (cd $$module && addlicense -check -v -f ./LICENSE.header ./.) || exit 1; \ + done + +license-fix: + @$(MAKE) license-install + @echo "--> Running addlicense" + @for module in $(MODULES); do \ + (cd $$module && addlicense -v -f ./LICENSE.header ./.) || exit 1; \ + done + + +################# +# gosec # +################# + +gosec-install: + @echo "--> Installing gosec" + @go install github.com/securego/gosec/v2/cmd/gosec + +gosec: + @$(MAKE) gosec-install + @echo "--> Running gosec" + @gosec -exclude-generated ./... + + +################# +# proto # +################# + +protoDir := "cosmos/proto" + +buf-install: + @echo "--> Installing buf" + @go install github.com/bufbuild/buf/cmd/buf + +buf-lint-fix: + @$(MAKE) buf-install + @echo "--> Running buf format" + @buf format -w --error-format=json $(protoDir) + +buf-lint: + @$(MAKE) buf-install + @echo "--> Running buf lint" + @buf lint --error-format=json $(protoDir) + + +############################################################################### +### Dependencies ### +############################################################################### + +sync: | + @for module in $(MODULES); do \ + echo "Running go mod download in $$module"; \ + (cd $$module && go mod download) || exit 1; \ + done + @echo "Running go mod sync" + @go work sync + +tidy: | + @for module in $(MODULES); do \ + echo "Running go mod tidy in $$module"; \ + (cd $$module && go mod tidy) || exit 1; \ + done + +repo-rinse: | + git clean -xfd + git submodule foreach --recursive git clean -xfd + git submodule foreach --recursive git reset --hard + git submodule update --init --recursive + + +.PHONY: build build-linux-amd64 build-linux-arm64 \ + $(BUILD_TARGETS) $(OUT_DIR)/ build-clean clean \ + forge-build forge-clean proto proto-build docker-build \ + docker-build-base docker-build-local docker-build-seed \ + docker-build-validator docker-build-localnet generate \ + abigen-install moq-install mockery-install mockery \ + start test-unit test-unit-race test-unit-cover forge-test \ + test-e2e test-e2e-no-build hive-setup hive-view test-hive \ + testv-hive test-localnet test-localnet-no-build format lint \ + forge-lint-fix forge-lint golangci-install golangci golangci-fix \ + golines-install golines license-install license license-fix \ + gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse diff --git a/README.md b/README.md index 8711d72f4f..bb0be6fdca 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,6 @@ Go Reference - - Built with Mage - Telegram Chat @@ -55,7 +52,7 @@ If you want to help contribute to the framework, check out the [Framework Specs] ├── e2e: End-to-end testing utilities. ├── eth: The Core of the Polaris Ethereum Framework. ├── lib: A collection of libraries used throughout the repo. -├── magefiles: Build scripts and utils. +├── tools: Package for holding tooling deps. @@ -96,14 +93,13 @@ If you want to help contribute to the framework, check out the [Framework Specs] git clone https://github.com/berachain/polaris cd polaris git checkout main - go run magefiles/setup/setup.go - mage cosmos:test + make test-unit ``` 4. Start a local development network: ```sh - mage start + make start ``` ## 🚧 WARNING: UNDER CONSTRUCTION 🚧 diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index d93b55b6c7..e3174443fc 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220cde67f8d39a80b562a47d0eb927cf26fff03e14a2b87ad2fc525d455d27a95f964736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212203b9bf03ac37088fd143e3bf5b92a98badf7b709ac1dd6737c320f93bef88aaf464736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 93701ebe01..112320da86 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220079e02caa6bbbf9e48d6a5926442bfcc806d49e3f57c6b4bc5723a5f1b8ed36b64736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220ffe51574d39382285f7847c507828f1e710505bc2a0cd23abe20e32e5e6a937964736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index b9a898365f..4448815142 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122039725cd7e0fb643ea87b00765a9952cab02ff3d77839f1609f570b90cbc41ed164736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220ba7c46fa5a278f44112a075b73098f4738cd207fd10d95a41d3df083fc5b6c2b64736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index c218458a7f..ee50028de0 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212202f9e989e9b2ff3a4fcaad72685a6f794dee6f5c95219c347a03a27bdad80c1f864736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/lib/ERC20.sol b/contracts/lib/ERC20.sol index 18757675f4..6fb2df73af 100644 --- a/contracts/lib/ERC20.sol +++ b/contracts/lib/ERC20.sol @@ -43,11 +43,7 @@ abstract contract ERC20 is IERC20 { CONSTRUCTOR //////////////////////////////////////////////////////////////*/ - constructor( - string memory _name, - string memory _symbol, - uint8 _decimals - ) { + constructor(string memory _name, string memory _symbol, uint8 _decimals) { name = _name; symbol = _symbol; decimals = _decimals; @@ -82,11 +78,7 @@ abstract contract ERC20 is IERC20 { return true; } - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual returns (bool) { + function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; @@ -108,15 +100,10 @@ abstract contract ERC20 is IERC20 { EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual { + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + public + virtual + { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing @@ -159,16 +146,15 @@ abstract contract ERC20 is IERC20 { } function computeDomainSeparator() internal view virtual returns (bytes32) { - return - keccak256( - abi.encode( - keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), - keccak256(bytes(name)), - keccak256("1"), - block.chainid, - address(this) - ) - ); + return keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + block.chainid, + address(this) + ) + ); } /*////////////////////////////////////////////////////////////// @@ -198,4 +184,4 @@ abstract contract ERC20 is IERC20 { emit Transfer(from, address(0), amount); } -} \ No newline at end of file +} diff --git a/contracts/lib/IERC20.sol b/contracts/lib/IERC20.sol index d4fa1d22bf..dac4fa84a9 100644 --- a/contracts/lib/IERC20.sol +++ b/contracts/lib/IERC20.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.0; * @author OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) */ interface IERC20 { - /** + /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * @@ -49,4 +49,4 @@ interface IERC20 { * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); -} \ No newline at end of file +} diff --git a/contracts/lib/Owned.sol b/contracts/lib/Owned.sol index 14c8492043..2e355f690a 100644 --- a/contracts/lib/Owned.sol +++ b/contracts/lib/Owned.sol @@ -41,4 +41,4 @@ abstract contract Owned { emit OwnershipTransferred(msg.sender, newOwner); } -} \ No newline at end of file +} diff --git a/cosmos/README.md b/cosmos/README.md deleted file mode 100644 index d0bfd725f3..0000000000 --- a/cosmos/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Polaris Integrated Cosmos Chain - -## Installation - -### From Binary - -The easiest way to install a Cosmos-SDK Blockchain running Polaris is to download a pre-built binary. You can find the latest binaries on the [releases](https://github.com/polaris/releases) page. - -### From Source - -**Step 1: Install Golang & Foundry** - -Go v1.20+ or higher is required for Polaris - -1. Install [go 1.21+ from the official site](https://go.dev/dl/) or the method of your choice. Ensure that your `GOPATH` and `GOBIN` environment variables are properly set up by using the following commands: - - For Ubuntu: - - ```sh - cd $HOME - sudo apt-get install golang jq -y - export PATH=$PATH:/usr/local/go/bin - export PATH=$PATH:$(go env GOPATH)/bin - ``` - - For Mac: - - ```sh - cd $HOME - brew install go jq - export PATH=$PATH:/opt/homebrew/bin/go - export PATH=$PATH:$(go env GOPATH)/bin - ``` - -2. Confirm your Go installation by checking the version: - - ```sh - go version - ``` - -[Foundry](https://book.getfoundry.sh/getting-started/installation) is required for Polaris - -3. Install Foundry: - ```sh - curl -L https://foundry.paradigm.xyz | bash - ``` - -**Step 2: Get Polaris source code** - -Clone the `polaris` repo from the [official repo](https://github.com/berachain/polaris/) and check -out the `main` branch for the latest stable release. -Build the binary. - -```bash -cd $HOME -git clone https://github.com/berachain/polaris -cd polaris -git checkout main -go run magefiles/setup/setup.go -``` - -**Step 3: Build the Node Software** - -Run the following command to install `polard` to your `GOPATH` and build the node. `polard` is the node daemon and CLI for interacting with a polaris node. - -```bash -mage install -``` - -**Step 4: Verify your installation** - -Verify your installation with the following command: - -```bash -polard version --long -``` - -A successful installation will return the following: - -```bash -name: berachain -server_name: polard -version: -commit: -build_tags: netgo,ledger -go: go version go1.21.1 darwin/amd64 -``` - -## Running a Local Network - -After ensuring dependecies are installed correctly, run the following command to start a local development network. -```bash -mage start -``` - -The network will have an Ethereum JSON-RPC server running at `http://localhost:8545` and a Tendermint RPC server running at `http://localhost:26657`. \ No newline at end of file diff --git a/cosmos/txpool/mocks/broadcaster.go b/cosmos/txpool/mocks/broadcaster.go index e76ce6ce1a..58a9870e0b 100644 --- a/cosmos/txpool/mocks/broadcaster.go +++ b/cosmos/txpool/mocks/broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index 9bbefaaaae..d34f394acd 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/handler.go b/cosmos/txpool/mocks/handler.go index ad9174180f..db6aeadf76 100644 --- a/cosmos/txpool/mocks/handler.go +++ b/cosmos/txpool/mocks/handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index 561510d2ce..4c3339a85e 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index e1513660d2..2db0b28d27 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index e4048e44ad..754701928c 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index a983f0bfe7..39c900e378 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/cosmos/x/evm/genesis.go b/cosmos/x/evm/genesis.go index 4a2c532f02..27edf04d0d 100644 --- a/cosmos/x/evm/genesis.go +++ b/cosmos/x/evm/genesis.go @@ -22,8 +22,6 @@ package evm import ( "encoding/json" - "fmt" - "math/big" abci "github.com/cometbft/cometbft/abci/types" @@ -51,15 +49,16 @@ func (AppModuleBasic) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConf return err } - for address, account := range ethGen.Alloc { - if ethGen.Config.IsEIP155(big.NewInt(0)) && account.Code != nil && account.Nonce == 0 { - // NOTE: EIP 161 was released at the same block as EIP 155. - return fmt.Errorf( - "EIP-161 requires an account with code (%s) to have nonce of at least 1, given (0)", - address.Hex(), - ) - } - } + // TODO: this code actually needs to be removed as it will cause issues. + // for address, account := range ethGen.Alloc { + // if ethGen.Config.IsEIP155(big.NewInt(0)) && account.Code != nil && account.Nonce == 0 { + // // NOTE: EIP 161 was released at the same block as EIP 155. + // return fmt.Errorf( + // "EIP-161 requires an account with code (%s) to have nonce of at least 1, given (0)", + // address.Hex(), + // ) + // } + // } return nil } diff --git a/docs/web/pages/docs/precompile-cosmos-overview.mdx b/docs/web/pages/docs/precompile-cosmos-overview.mdx index fd21a8c918..c80a43a2cd 100644 --- a/docs/web/pages/docs/precompile-cosmos-overview.mdx +++ b/docs/web/pages/docs/precompile-cosmos-overview.mdx @@ -19,7 +19,7 @@ You must first clone the [Polaris Ethereum repository](https://github.com/berach You can now run the following command to generate the ABIs: -`mage generate` +`make generate` The ABI files can be found in the `precompile/contracts/solidity/out` directory. The generated files can be found in the `precompile/contracts/solidity/generated` directory. diff --git a/docs/web/pages/docs/running-a-node/running-locally.mdx b/docs/web/pages/docs/running-a-node/running-locally.mdx index e6bda9232e..5770d8c270 100644 --- a/docs/web/pages/docs/running-a-node/running-locally.mdx +++ b/docs/web/pages/docs/running-a-node/running-locally.mdx @@ -58,7 +58,6 @@ cd $HOME git clone https://github.com/berachain/polaris cd polaris git checkout main -go run magefiles/setup/setup.go ``` **Step 3: Build the Node Software** @@ -66,7 +65,7 @@ go run magefiles/setup/setup.go Run the following command to install `polard` to your `GOPATH` and build the node. `polard` is the node daemon and CLI for interacting with a polaris node. ```bash -mage cosmos:install +make install ``` **Step 4: Verify your installation** @@ -93,7 +92,7 @@ go: go version go1.21.1 darwin/amd64 After ensuring dependencies are installed correctly, run the following command to start a local development network. ```bash -mage start +make start ``` diff --git a/e2e/hive/clients/polard/hive-init.sh b/e2e/hive/clients/polard/hive-init.sh index f86509e080..6e83be017b 100644 --- a/e2e/hive/clients/polard/hive-init.sh +++ b/e2e/hive/clients/polard/hive-init.sh @@ -46,7 +46,7 @@ TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json set -e # Reinstall daemon -# mage build +# make build # Remove the previous folder diff --git a/e2e/hive/simulators/README.md b/e2e/hive/simulators/README.md index e224cc2d7c..c886c3a401 100644 --- a/e2e/hive/simulators/README.md +++ b/e2e/hive/simulators/README.md @@ -4,26 +4,18 @@ Each Hive simulator maintained in the Polaris repo is a subset of the respective ## Usage -Since we do not maintain the whole directory, there is no way (at the moment) to run the Hive simulator directly. Instead, to run it locally, the `hive` mage namespace must be invoked. - -Note: Hive requires a custom base image of polard, build this with `mage cosmos:dockerbuildhive` +Since we do not maintain the whole directory, there is no way (at the moment) to run the Hive simulator directly. Instead, to run it locally, `hive` must be invoked via the `Makefile`. ### Steps -1. run `mage hive:setup` to generate the hive clone and creates the polaris namespace simulations -2. run `mage cosmos:dockerbuildhive` to build the polard base image -3. run `mage hive:test ` to run the simulation on the given client - -Alternatively, use `mage cosmos:testhive ` to build the base-image and run the simulation on the polard client. +1. run `make hive-setup` to generate the hive clone and creates the polaris namespace simulations +2. run `make docker-build` to build the polard base image +3. run `make test-hive` to run the simulation on the given client Note: polaris namespace simulations are called `polaris/`, for the sake of maintaining consistency with `ethereum/` simulations. ## Adding simulations -Currently, the existing magefile setup only supports maintaining simulations which are forks of an existing simulation in the Hive repo. - -### Dev UX -1. Add the simulation to the CI. -2. Add a new entry to the list of simulations in the `hive.go` magefile, specifying the name and which files to replace. +Currently, the existing makefile setup only supports maintaining simulations which are forks of an existing simulation in the Hive repo. ## .hive file extension @@ -32,6 +24,6 @@ The `.hive` file extension used in the rpc simulation is the local replacement f The copy is used to make minor changes to the expected values of certain test cases to be compliant with the way that Polaris handles returns (ex. estimateGas). -Internally, this file replaces the destination in the Hive clone generated during `mage hive:setup`. +Internally, this file replaces the destination in the Hive clone generated during `make hive-setup`. The motivation to keeping the file in plain text is to eliminate errors generated by dependencies of the file and to remove the need to create an additional go package within Polaris. \ No newline at end of file diff --git a/e2e/localnet/network/localnet_test.go b/e2e/localnet/network/localnet_test.go index ace301ba0b..a12d3889d4 100644 --- a/e2e/localnet/network/localnet_test.go +++ b/e2e/localnet/network/localnet_test.go @@ -34,5 +34,5 @@ import ( func TestLocalnet(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "testing/e2e/localnet") + RunSpecs(t, "e2e/localnet") } diff --git a/e2e/precompile/polard/Dockerfile b/e2e/precompile/polard/Dockerfile index 467f6e61cf..1a7c3dad48 100644 --- a/e2e/precompile/polard/Dockerfile +++ b/e2e/precompile/polard/Dockerfile @@ -14,20 +14,21 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ARG GO_VERSION -ARG GOARCH=arm64 -ARG GOOS=linux +ARG GOARCH +ARG GOOS ARG BASE_IMAGE + # Use the latest foundry image FROM ${BASE_IMAGE} as localpolard -RUN apk add --no-cache bash jq +RUN apk add --no-cache bash jq git WORKDIR / -COPY . . +COPY e2e/precompile/ ./ # Export the usual networking ports to allow outside access to the node EXPOSE 8545 8546 8547 8551 -CMD ["bash", "start-node.sh"] +CMD ["bash", "polard/start-node.sh"] diff --git a/e2e/precompile/polard/start-node.sh b/e2e/precompile/polard/start-node.sh index 8d89b18242..aac4cac071 100755 --- a/e2e/precompile/polard/start-node.sh +++ b/e2e/precompile/polard/start-node.sh @@ -24,7 +24,7 @@ MONIKER="localtestnet" LOGLEVEL="info" # Set dedicated home directory for the ./bin/polard instance -HOMEDIR="/" +HOMEDIR="./polard" # to trace evm #TRACE="--trace" TRACE="" diff --git a/e2e/testapp/docker/local/docker-init.sh b/e2e/testapp/docker/local/docker-init.sh index f329192196..346833b884 100644 --- a/e2e/testapp/docker/local/docker-init.sh +++ b/e2e/testapp/docker/local/docker-init.sh @@ -47,7 +47,7 @@ TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json set -e # Reinstall daemon -# mage build +# make build # Remove the previous folder diff --git a/e2e/testapp/docker/rpc/Dockerfile b/e2e/testapp/docker/rpc/Dockerfile deleted file mode 100644 index 7664d0d9a1..0000000000 --- a/e2e/testapp/docker/rpc/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ - -# syntax=docker/dockerfile:1 -# Copyright (C) 2022, Berachain Foundation. All rights reserved. -# See the file LICENSE for licensing terms. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -ARG GO_VERSION -ARG GOARCH=arm64 -ARG GOOS=linux -ARG POLARD_VERSION=v0.0.0 - -# Use the latest foundry image -FROM polard/base:${POLARD_VERSION} as rpcpolard \ No newline at end of file diff --git a/e2e/testapp/docker/sentry/Dockerfile b/e2e/testapp/docker/sentry/Dockerfile deleted file mode 100644 index 5da282a089..0000000000 --- a/e2e/testapp/docker/sentry/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ - -# syntax=docker/dockerfile:1 -# Copyright (C) 2022, Berachain Foundation. All rights reserved. -# See the file LICENSE for licensing terms. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -ARG GO_VERSION -ARG GOARCH=arm64 -ARG GOOS=linux -ARG POLARD_VERSION=v0.0.0 - -# Use the latest foundry image -FROM polard/base:${POLARD_VERSION} as sentrypolard \ No newline at end of file diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index 1494e347f7..092d1d2eb4 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -46,16 +46,16 @@ TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json set -e # Reinstall daemon -mage build +make build # # User prompt if an existing local node configuration is found. -# if [ -d "$HOMEDIR" ]; then -# printf "\nAn existing folder at '%s' was found. You can choose to delete this folder and start a new local node with new keys from genesis. When declined, the existing local node is started. \n" "$HOMEDIR" -# echo "Overwrite the existing configuration and start a new local node? [y/n]" -# read -r overwrite -# else +if [ -d "$HOMEDIR" ]; then + printf "\nAn existing folder at '%s' was found. You can choose to delete this folder and start a new local node with new keys from genesis. When declined, the existing local node is started. \n" "$HOMEDIR" + echo "Overwrite the existing configuration and start a new local node? [y/n]" + read -r overwrite +else overwrite="Y" -# fi +fi # Setup local node if overwrite is set to Yes, otherwise skip setup if [[ $overwrite == "y" || $overwrite == "Y" ]]; then diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 7ae768c28e..7255d9a8e0 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -25,6 +25,7 @@ import ( "errors" "io" "os" + "time" dbm "github.com/cosmos/cosmos-db" "github.com/spf13/cobra" @@ -161,7 +162,14 @@ func NewRootCmd() *cobra.Command { // initCometBFTConfig helps to override default CometBFT Config values. // return cmtcfg.DefaultConfig if no custom configuration is required for the application. func initCometBFTConfig() *cmtcfg.Config { - return cmtcfg.DefaultConfig() + cfg := cmtcfg.DefaultConfig() + consensus := cfg.Consensus + consensus.TimeoutCommit = time.Second * 2 + consensus.TimeoutPropose = time.Second * 2 + consensus.TimeoutPrevote = time.Second * 2 + consensus.TimeoutPrecommit = time.Second * 2 + consensus.TimeoutCommit = time.Second * 2 + return cfg } // initAppConfig helps to override default appConfig template and configs. diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index fc075f17a1..a5080dfcf7 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index 041bf76672..cee241caee 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index 5edf7e3d03..35a0836ff1 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 865b33b1bb..80e4d30588 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index f45bd5a027..26be3abffc 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index fb334993bb..709fd42916 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index e3bc4fb604..bc61c17f98 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index 79b4af28ee..9cc84b0faa 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.1. DO NOT EDIT. +// Code generated by mockery v2.34.2. DO NOT EDIT. package mocks diff --git a/eth/go.mod b/eth/go.mod index 1bc5529249..8fb9415ac9 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -11,6 +11,7 @@ require ( github.com/holiman/uint256 v1.2.3 github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 + github.com/stretchr/testify v1.8.4 golang.org/x/text v0.13.0 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a @@ -96,6 +97,7 @@ require ( github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/peterh/liner v1.2.2 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect @@ -106,6 +108,7 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/status-im/keycard-go v0.2.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect diff --git a/eth/go.sum b/eth/go.sum index e7cd9e06f6..b78641222d 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -283,6 +283,7 @@ github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobt github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= diff --git a/go.work b/go.work index 0f8d10b130..c84f98fae6 100644 --- a/go.work +++ b/go.work @@ -8,5 +8,5 @@ use ( ./e2e/testapp ./eth ./lib - ./magefiles + ./tools ) diff --git a/go.work.sum b/go.work.sum index 92032792cf..907ae496f3 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,307 +1,738 @@ +cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n6vCmFJM= cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqmfddPA= cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0= cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.13.0 h1:xIP3XZi0Xawx8DEfh++mE2lrIi5kQmCr/KcWhJ1q0J4= cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.6.0 h1:PKggmegChZulPW8yvtziF8P9UOuVFwbvylbEucTNups= +cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= +cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.6.1 h1:kQf1jgPY04UJBYYjNUO+3GrZtIb57MfGAW2bwgLbR3A= cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zXrU0= cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= +cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmXJ+EjTA= cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s= +github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= +github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= +github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= +github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1 h1:NbvWIM1Mx6sNPTxowHgS2ewXCRp+NGTzUYb/96FZJbY= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 h1:EtEU7WRaWliitZh2nmuxEXrN0Cb8EgPUFGIoTMeqbzI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1 h1:w/fPGB0t5rWwA43mux4e9ozFSH5zF1moQemlA131PWc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 h1:cKr6St+CtC3/dl/rEBJvlk7A/IN5D5F02GNkGzfbtVU= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 h1:TJoIfnIFubCX0ACVeJ0w46HEH5MwjwYN4iFhuYIhfIY= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= +github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= +github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= +github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= +github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/chigopher/pathlib v0.12.0/go.mod h1:EJ5UtJ/sK8Nt6q3VWN+EwZLZ3g0afJiG8NegYiQQ/gQ= +github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= +github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cloudflare/circl v1.3.1 h1:4OVCZRL62ijwEwxnF6I7hLwxvIYi3VaZt8TflkqtrtA= github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= +github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= +github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= +github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db h1:gb2Z18BhTPJPpLQWj4T+rfKHYCHxRHCtRxhKKjRidVw= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= +github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/getkin/kin-openapi v0.118.0 h1:z43njxPmJ7TaPpMSCQb7PN0dEYno4tyBPQcrFdHoLuM= github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHsk= github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= +github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= +github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= +github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= +github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= +github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= +github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= +github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/hydrogen18/memlistener v1.0.0 h1:JR7eDj8HD6eXrc5fWLbSUnfcQFL06PYvCc0DKQnWfaU= github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe6ZTd9F8kXETBoijjFJ/ntaa//1wiH9BZu4zU= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/informalsystems/tm-load-test v1.3.0 h1:FGjKy7vBw6mXNakt+wmNWKggQZRsKkEYpaFk/zR64VA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= +github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= +github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= +github.com/kataras/iris/v12 v12.2.0 h1:WzDY5nGuW/LgVaFS5BtTkW3crdSKJ/FEgWnxPnIVVLI= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB0= github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= +github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= +github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= +github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= +github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= +github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76 h1:0xuRacu/Zr+jX+KyLLPPktbwXqyOvnOPUQmMLzX1jxU= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= +github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= +github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= +github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= +github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= +github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= +github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3 h1:hUmXhbljNFtrH5hzV9kiRoddZ5nfPTq3K0Sb2hYYiqE= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= +github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4 h1:RHHRCZeaNyBXdYPMjZNH8/XHDBH38TZzw8izrW7dmBE= github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= +github.com/pointlander/peg v1.0.1 h1:mgA/GQE8TeS9MdkU6Xn6iEzBmQUQCNuWD7rHCK6Mjs0= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= +github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5 h1:CvqZS4QYHBRvx7AeFdimd16HCbLlYsvQMcKDACpJW/c= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96 h1:J8J/cgLDRuqXJnwIrRDBvtl+LLsdg7De74znW/BRRq4= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e h1:eTWZyPUnHcuGRDiryS/l2I7FfKjbU3IBx3IjqHPxuKU= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= +github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= +github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= +github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/fasthttp v1.48.0 h1:oJWvHb9BIZToTQS3MuQ2R3bJZiNSa2KiNdeI8A+79Tc= github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= +github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= +go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= +go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= +go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= diff --git a/magefiles/ci.go b/magefiles/ci.go deleted file mode 100644 index 4c1148ed75..0000000000 --- a/magefiles/ci.go +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "github.com/magefile/mage/mg" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -type CI mg.Namespace - -// Build builds the project. -func Build() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - - return (Cosmos{}).Build() -} - -// Runs the unit tests. -func TestUnit() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - utils.LogGreen("Running all unit tests...") - return testUnit(".") -} - -func testUnit(path string) error { - return ginkgoTest( - "--skip", ".*e2e.*", - "./"+path+"/...", - ) -} - -func testUnitRace(path string) error { - return ginkgoTest( - "--race", - "--skip", ".*e2e.*", - "./"+path+"/...", - ) -} - -// Runs the unit tests with coverage. -func TestUnitCover() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - args := []string{ - "--skip", ".*e2e.*", - } - utils.LogGreen("Running all unit tests with coverage...") - return ginkgoTest(append(coverArgs, args...)...) -} - -// Runs the unit tests with race detection. -func TestUnitRace() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - args := []string{ - "--skip", ".*e2e.*", - } - utils.LogGreen("Running all unit tests with --race...") - return ginkgoTest(append(raceArgs, args...)...) -} - -// Runs the unit tests with benchmarking. -func TestUnitBenchmark() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - - utils.LogGreen("Running all unit tests with benchmarking...") - return testUnitBenchmark() -} - -func testUnitBenchmark() error { - args := []string{ - "-bench=.", - } - return goTest(args...) -} - -// Runs the e2e tests. -func TestE2E() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - utils.LogGreen("Running all e2e tests") - return testE2E("./e2e") -} - -func testE2E(path string) error { - args := []string{ - "-timeout", "30m", - "--skip", ".*localnet.*", - "--focus", ".*e2e.*", path + "/...", - } - return ginkgoTest(args...) -} diff --git a/magefiles/cmd/mage.go b/magefiles/cmd/mage.go deleted file mode 100644 index b3d2ffe6be..0000000000 --- a/magefiles/cmd/mage.go +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "os" - - "github.com/magefile/mage/mage" -) - -func main() { os.Exit(mage.Main()) } diff --git a/magefiles/constants.go b/magefiles/constants.go deleted file mode 100644 index c42e98d3b0..0000000000 --- a/magefiles/constants.go +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import "os" - -/* -------------------------------------------------------------------------- */ -/* Commands */ -/* -------------------------------------------------------------------------- */ - -var ( - // Forge. - forgeBuild = RunCmdV("forge", "build", "--extra-output-files", "bin", "--extra-output-files", "abi", "--silent") - forgeClean = RunCmdV("forge", "clean") - forgeTest = RunCmdV("forge", "test") - forgeFmt = RunCmdV("forge", "fmt") - - // Docker. - dockerBuild = RunCmdV("docker", "build", "--rm=false") - dockerBuildX = RunCmdV("docker", "buildx", "build", "--rm=false") - - // Buf. - bufCommand = RunCmdV("buf") - - // Testing. - goTest = RunCmdV("go", "test", "-mod=readonly") - ginkgoTest = RunCmdV("ginkgo", "-r", "--randomize-all", "--fail-on-pending", "-trace") - - // Toolchain. - goInstall = RunCmdV("go", "install", "-mod=readonly") - goBuild = RunCmdV("go", "build", "-mod=readonly") - goRun = RunCmdV("go", "run") - goGenerate = RunCmdV("go", "generate") - goModTidy = RunCmdV("go", "mod", "tidy") - goWorkSync = RunCmdV("go", "work", "sync") - gitDiff = RunCmdV("git", "diff", "--stat", "--exit-code", ".", - "':(exclude)*.mod' ':(exclude)*.sum'") - mockery = RunCmdV("mockery") -) - -/* -------------------------------------------------------------------------- */ -/* Packages & Modules */ -/* --------------------------------------------------------------------------. */ -var ( - repoModuleDirs = readGoModulesFromGoWork("go.work") -) - -const ( - cosmosSDK = "github.com/cosmos/cosmos-sdk" - moq = "github.com/matryer/moq" - golangCi = "github.com/golangci/golangci-lint/cmd/golangci-lint" - golines = "github.com/segmentio/golines" - gosec = "github.com/securego/gosec/v2/cmd/gosec" - addlicense = "github.com/google/addlicense" -) - -/* -------------------------------------------------------------------------- */ -/* Docker */ -/* -------------------------------------------------------------------------- */ - -var ( - baseImageVersion = "polard/base:v0.0.0" - protoImageName = "ghcr.io/cosmos/proto-builder" - protoImageVersion = "0.14.0" - protoDir = "cosmos/proto" -) - -/* -------------------------------------------------------------------------- */ -/* Directories */ -/* -------------------------------------------------------------------------- */ - -const ( - outdir = "./bin" - baseHiveDockerPath = "./e2e/hive/" -) - -var ( - hiveClone = os.Getenv("GOPATH") + "/src/" - clonePath = hiveClone + ".hive-e2e/" - simulatorsPath = clonePath + "simulators/polaris/" - clientsPath = clonePath + "clients/polard/" -) diff --git a/magefiles/contracts.go b/magefiles/contracts.go deleted file mode 100644 index d32d77b13d..0000000000 --- a/magefiles/contracts.go +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -// - -package main - -import ( - "fmt" - - "github.com/magefile/mage/mg" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -// Compile-time assertion that we implement the interface correctly. -var _ MageModule = (*Contracts)(nil) - -// Contracts is a namespace for smart contract related commands. -type Contracts mg.Namespace - -func (Contracts) directory() string { - return "contracts" -} - -// =========================================================================== -// Build -// =========================================================================== - -// Runs `forge build` in all smart contract directories. -func (Contracts) Build() error { - utils.LogGreen("Building solidity contracts with foundry...") - return forgeWrapper(forgeBuild) -} - -// Check that the generated forge build source files are up to date. -func (c Contracts) BuildCheck() error { - if err := c.Build(); err != nil { - return err - } - if err := gitDiff(); err != nil { - return fmt.Errorf("generated files are out of date: %w", err) - } - return nil -} - -// Run `forge clean` in all smart contract directories. -func (Contracts) Clean() error { - return forgeWrapper(forgeClean) -} - -// =========================================================================== -// Test -// =========================================================================== - -// Run `forge test` in all smart contract directories. -func (c Contracts) Test() error { - return c.TestUnit() -} - -// Run `forge test` in all smart contract directories. -func (Contracts) TestUnit() error { - utils.LogGreen("Running foundry unit tests...") - return forgeWrapper(forgeTest) -} - -// Run `forge fmt` in all smart contract directories. -func (Contracts) Fmt() error { - utils.LogGreen("Running forge fmt...") - return forgeWrapper(forgeFmt) -} - -func (Contracts) TestE2E() error { - utils.LogGreen("Running foundry e2e tests...") - return forgeWrapper(forgeTest) -} - -// =========================================================================== -// Helper -// =========================================================================== - -// Wraps forge commands with the proper directory change. -func forgeWrapper(forgeFunc func(args ...string) error) error { - return ExecuteInDirectory("./contracts", forgeFunc, false) -} diff --git a/magefiles/cosmos.go b/magefiles/cosmos.go deleted file mode 100644 index 176d01f2fc..0000000000 --- a/magefiles/cosmos.go +++ /dev/null @@ -1,191 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "runtime" - "strings" - - "github.com/magefile/mage/mg" - "github.com/magefile/mage/sh" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -var ( - // Variables and Helpers. - production = false - statically = false - - // Variables. - imageName = "polard" - imageVersion = "v0.0.0" - baseDockerPath = "./e2e/testapp/docker/" - execDockerPath = baseDockerPath + "base.Dockerfile" - localDockerPath = baseDockerPath + "local/Dockerfile" - seedDockerPath = baseDockerPath + "seed/Dockerfile" - valDockerPath = baseDockerPath + "validator/Dockerfile" - goVersion = "1.21.1" - precompileContractsDir = "./contracts" - - // Localnet. - baseImage = "polard/base:v0.0.0" - localnetClientPath = "./e2e/precompile/polard" - localnetDockerPath = localnetClientPath + "/Dockerfile" -) - -// Compile-time assertion that we implement the interface correctly. -var _ MageModule = (*Cosmos)(nil) - -// Cosmos is a namespace for Cosmos SDK related commands. -type Cosmos mg.Namespace - -// directory returns the directory name for the Cosmos SDK chain. -func (Cosmos) directory() string { - return "cosmos" -} - -// =========================================================================== -// Build -// =========================================================================== - -// Starts a local development net and builds it if necessary. -func Start() error { - return sh.RunV("./e2e/testapp/entrypoint.sh") -} - -// Builds the Cosmos SDK chain. -func (Cosmos) Build() error { - utils.LogGreen("Building the Cosmos SDK chain...") - cmd := "polard" - args := []string{ - generateBuildTags(), - generateLinkerFlags(production, statically), - "-o", generateOutDirectory(cmd), - "./e2e/testapp/" + cmd, - } - return goBuild(args...) -} - -// =========================================================================== -// Docker -// =========================================================================== - -// Builds a release version of the Cosmos SDK chain. -func (c Cosmos) Docker(dockerType, arch string) error { - utils.LogGreen("Build a release docker image for the Cosmos SDK chain...") - return c.dockerBuildBeradWith(dockerType, goVersion, arch, false) -} - -func (c Cosmos) dockerBuildBeradWith(dockerType, goVersion, arch string, withX bool) error { - var dockerFilePath string - opts := []string{ - "--build-arg", "GO_VERSION=" + goVersion, - "--platform", "linux/" + arch, - "--build-arg", "PRECOMPILE_CONTRACTS_DIR=" + precompileContractsDir, - "--build-arg", "GOOS=linux", - "--build-arg", "GOARCH=" + arch, - "--build-arg", "GO_WORK=" + strings.Join(repoModuleDirs, " "), - } - buildContext := "." - switch dockerType { - case "local": - dockerFilePath = localDockerPath - case "seed": - dockerFilePath = seedDockerPath - case "validator": - dockerFilePath = valDockerPath - case "localnet": - buildContext = localnetClientPath - dockerFilePath = localnetDockerPath - opts = append(opts, "--build-arg", "BASE_IMAGE="+baseImage) - default: - dockerFilePath = execDockerPath - } - tag := imageName + "/" + dockerType + ":" + imageVersion - utils.LogGreen( - "Building a "+dockerType+" polard docker image", - "platform", "linux"+"/"+arch, - "tag", tag, - ) - opts = append(opts, "-f", dockerFilePath, "-t", tag, buildContext) - return dockerBuildFn(withX)( - opts..., - ) -} - -// =========================================================================== -// Test -// =========================================================================== - -// Runs all main tests. -func (c Cosmos) Test() error { - if err := TestUnit(); err != nil { - return err - } - - return TestE2E() -} - -// Runs all unit tests for the Cosmos SDK chain. -func (c Cosmos) TestUnit() error { - utils.LogGreen("Running unit tests for the Cosmos SDK chain.") - return testUnit(c.directory()) -} - -// Runs all unit tests for the Cosmos SDK chain. -func (c Cosmos) TestUnitRace() error { - utils.LogGreen("Running unit tests for the Cosmos SDK chain.") - return testUnitRace(c.directory()) -} - -// Runs all e2e tests for the Cosmos SDK chain. -func (c Cosmos) TestE2E() error { - utils.LogGreen("Running e2e tests for the Cosmos SDK chain.") - return testE2E(c.directory() + "/testing/e2e") -} - -func (c Cosmos) TestHive(sim string) error { - if out, _ := sh.Output("docker", "images", "-q", baseImageVersion); out == "" { - utils.LogGreen("No existing base docker image found, building...") - if err := c.Docker("base", runtime.GOARCH); err != nil { - return err - } - } - - if err := (Hive{}).Setup(); err != nil { - return err - } - - return Hive{}.TestV(sim, "polard") -} - -func dockerBuildFn(useX bool) func(args ...string) error { - if useX { - return dockerBuildX - } - return dockerBuild -} diff --git a/magefiles/eth.go b/magefiles/eth.go deleted file mode 100644 index 42f15de31b..0000000000 --- a/magefiles/eth.go +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "github.com/magefile/mage/mg" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -type Eth mg.Namespace - -func (Eth) directory() string { - return "eth" -} - -// =========================================================================== -// Test -// =========================================================================== - -func (e Eth) Test() error { - return testUnit(e.directory()) -} - -// Runs all unit tests for the Cosmos SDK chain. -func (e Eth) TestUnit() error { - utils.LogGreen("Running all Polaris Ethereum unit tests...") - return testUnit(e.directory()) -} - -// Runs all e2e tests for the Cosmos SDK chain. -func (e Eth) TestE2E() error { - utils.LogGreen("Running all Polaris Ethereum e2e tests...") - return testE2E(e.directory()) -} diff --git a/magefiles/helpers.go b/magefiles/helpers.go deleted file mode 100644 index f27caf7333..0000000000 --- a/magefiles/helpers.go +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "bufio" - "os" - "regexp" - "strings" - - "github.com/magefile/mage/sh" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -var allPkgs, _ = sh.Output("go", "list", "pkg.berachain.dev/polaris/...") - -// RunCmd is a helper function that returns a function that runs the given -// command with the given arguments. -func RunCmdV(cmd string, args ...string) func(args ...string) error { - return func(args2 ...string) error { - return sh.RunV(cmd, append(args, args2...)...) - } -} - -// RunOutput is a helper function that returns a function that runs the given -// command with the given arguments and returns the output. -func RunOutput(cmd string, args ...string) func(args ...string) (string, error) { - return func(args2 ...string) (string, error) { - return sh.Output(cmd, append(args, args2...)...) - } -} - -// GoListFilter returns a list of packages that match the given filter. -func GoListFilter(include bool, contains ...string) []string { - return filter(strings.Split(allPkgs, "\n"), func(s string) bool { - for _, c := range contains { - if strings.Contains(s, c) { - return include - } - } - return !include - }) -} - -// filter returns a new slice containing only the elements of ss that -// satisfy the predicate test. -func filter[T any](ss []T, test func(T) bool) []T { - ret := make([]T, 0, len(ss)) - for _, s := range ss { - if test(s) { - ret = append(ret, s) - } - } - return ret -} - -// Executes a function in a given directory. -func ExecuteInDirectory(dir string, f func(args ...string) error, withArgs bool) error { - rootCwd, _ := os.Getwd() - // Change to the directory where the contracts are. - if err := os.Chdir(dir); err != nil { - return err - } - // Run the command - if withArgs { - if err := f(dir); err != nil { - return err - } - } else { - if err := f(); err != nil { - return err - } - } - - // Go back to the starting directory. - return os.Chdir(rootCwd) -} - -func ExecuteForAllModules(dirs []string, f func(args ...string) error, withArgs bool) error { - for _, dir := range dirs { - if err := ExecuteInDirectory(dir, f, withArgs); err != nil { - return err - } - } - return nil -} - -// readGoModulesFromGoWork reads the go.work file and returns a list of modules. -func readGoModulesFromGoWork(filepath string) []string { - // Open the go.work file - file, err := os.Open(filepath) //#nosec: G304 // required. - if err != nil { - utils.LogRed("Error opening file:", err) - return []string{} - } - defer file.Close() - - // Regex pattern to match module paths - pattern := regexp.MustCompile(`\./([\w-/]+)`) - - // Create a scanner to read the file line by line - scanner := bufio.NewScanner(file) - var modules []string - for scanner.Scan() { - line := scanner.Text() - matches := pattern.FindStringSubmatch(line) - if matches != nil { - modules = append(modules, matches[1]) - } - } - - if err = scanner.Err(); err != nil { - utils.LogRed("Error reading file:", err) - } - - return modules -} diff --git a/magefiles/hive.go b/magefiles/hive.go deleted file mode 100644 index a1a0f0ce66..0000000000 --- a/magefiles/hive.go +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "os" - "strings" - - "github.com/magefile/mage/mg" - "github.com/magefile/mage/sh" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -// custom tests for Polaris, struct follows {namespace, files_changed} -// note: this requires an existing instance of the namespace in the Hive repo -type tests struct { - Name string - Files []string -} - -var ( - simulations = []tests{ - {"rpc", []string{"init/genesis.json", "ethclient.hive"}}, - {"rpc-compat", []string{"Dockerfile", "tests"}}, - } -) - -type Hive mg.Namespace - -func (h Hive) Setup() error { - utils.LogGreen("Setting up Hive testing environment...") - - if _, err := os.Stat(hiveClone); os.IsNotExist(err) { - utils.LogGreen(hiveClone + " does not exist, creating....") - err = os.Mkdir(hiveClone, 0755) //#nosec - if err != nil { - return err - } - } - - if err := ExecuteInDirectory(hiveClone, func(...string) error { - utils.LogGreen("Removing existing files in .hive-e2e...") - return sh.RunV("rm", "-rf", clonePath) - }, false); err != nil { - return err - } - - if _, err := os.Stat(clonePath); os.IsNotExist(err) { - utils.LogGreen("Cloning ethereum/hive into " + clonePath + "...") - err = ExecuteInDirectory(hiveClone, func(...string) error { - return sh.RunV("git", "clone", "https://github.com/ethereum/hive", ".hive-e2e", "--depth=1") - }, false) - if err != nil { - return err - } - } - - if err := h.copyFiles(); err != nil { - return err - } - - return ExecuteInDirectory(clonePath, func(...string) error { - utils.LogGreen("Building Hive...") - return goBuild(".") - }, false) -} - -func (h Hive) Test(sim, client string) error { - return ExecuteInDirectory(clonePath, func(...string) error { - return sh.RunV("./hive", "--sim", sim, "--client", client) - }, false) -} - -func (h Hive) TestV(sim, client string) error { - return ExecuteInDirectory(clonePath, func(...string) error { - return sh.RunV("./hive", "--sim", sim, "--client", client, "--docker.output") - }, false) -} - -func (h Hive) View() error { - if err := ExecuteInDirectory(clonePath, func(...string) error { - utils.LogGreen("Building HiveView...") - return sh.RunV("go", "build", "./cmd/hiveview") - }, false); err != nil { - return err - } - return ExecuteInDirectory(clonePath, func(...string) error { - utils.LogGreen("Serving HiveView...") - return sh.RunV("./hiveview", "--serve") - }, false) -} - -func (h Hive) copyFiles() error { - utils.LogGreen("Copying Polaris Hive setup files...") - if err := sh.RunV("mkdir", simulatorsPath); err != nil { - return err - } - if err := sh.RunV("cp", "-rf", baseHiveDockerPath+"clients/polard", clientsPath); err != nil { - return err - } - for _, sim := range simulations { - if err := sh.RunV("cp", "-rf", clonePath+"simulators/ethereum/"+sim.Name, simulatorsPath+sim.Name); err != nil { - return err - } - for _, file := range sim.Files { - name := file - if ext := strings.Split(file, "."); len(ext) > 1 && ext[1] == "hive" { - name = strings.Split(file, ".")[0] + ".go" - } - if err := sh.RunV("rm", "-rf", simulatorsPath+sim.Name+"/"+name); err != nil { - return err - } - if err := sh.RunV("cp", "-rf", baseHiveDockerPath+"simulators/"+sim.Name+ - "/"+file, simulatorsPath+sim.Name+"/"+name); err != nil { - return err - } - } - } - return nil -} diff --git a/magefiles/lint.go b/magefiles/lint.go deleted file mode 100644 index b4be9c11f3..0000000000 --- a/magefiles/lint.go +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import "pkg.berachain.dev/polaris/magefiles/utils" - -func Lint() error { - cmds := []func() error{GolangCiLint, LicenseCheck, Gosec, Proto{}.Lint, Contracts{}.Fmt} - for _, cmd := range cmds { - if err := cmd(); err != nil { - return err - } - } - return nil -} - -// Run all formatters. -func Format() error { - cmds := []func() error{Golines, License, GolangCiLintFix, Proto{}.Format, Contracts{}.Fmt} - for _, cmd := range cmds { - if err := cmd(); err != nil { - return err - } - } - return nil -} - -// Run `golangci-lint`. -func GolangCiLint() error { - utils.LogGreen("Running golangci-lint...") - for _, dir := range repoModuleDirs { - if err := goRun(golangCi, - "run", "--timeout=10m", "--concurrency", "4", "--config=.golangci.yaml", "-v", "./"+dir+"/"+"...", - ); err != nil { - return err - } - } - return nil -} - -// Run `golangci-lint` with --fix. -func GolangCiLintFix() error { - utils.LogGreen("Running golangci-lint --fix...") - for _, dir := range repoModuleDirs { - if err := goRun(golangCi, - "run", "--timeout=10m", "--concurrency", "4", "--config=.golangci.yaml", "-v", "--fix", "./"+dir+"/"+"...", - ); err != nil { - return err - } - } - return nil -} - -// Run `golines`. -func Golines() error { - utils.LogGreen("Running golines...") - return goRun(golines, - "--reformat-tags", "--shorten-comments", "--write-output", "--max-len=99", "-l", "./.", - ) -} - -// Run `gosec`. -func Gosec() error { - utils.LogGreen("Running gosec...") - return goRun(gosec, "-exclude-generated", "./...") -} - -// Run `addlicense`. -func License() error { - utils.LogGreen("Running addlicense...") - return ExecuteForAllModules(repoModuleDirs, func(args ...string) error { - return goRun(addlicense, - "-v", "-f", "./LICENSE.header", "./.", - ) - }, true) -} - -// Run `addlicense`. -func LicenseCheck() error { - utils.LogGreen("Running addlicense -check...") - return ExecuteForAllModules(repoModuleDirs, func(args ...string) error { - return goRun(addlicense, - "-check", "-v", "-f", "./LICENSE.header", "-ignore", "**/*.yml", "./.", - ) - }, true) -} diff --git a/magefiles/localnet.go b/magefiles/localnet.go deleted file mode 100644 index 413fcff75e..0000000000 --- a/magefiles/localnet.go +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "github.com/magefile/mage/mg" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -type Localnet mg.Namespace - -// Runs the localnet tooling sanity tests. -func (Localnet) Test() error { - if err := (Contracts{}).Build(); err != nil { - return err - } - utils.LogGreen("Running all localnet tests") - args := []string{ - "-timeout", "30m", - "--focus", ".*e2e/localnet.*", - } - return ginkgoTest(args...) -} diff --git a/magefiles/namespaces.go b/magefiles/namespaces.go deleted file mode 100644 index 94e71d6d91..0000000000 --- a/magefiles/namespaces.go +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "github.com/magefile/mage/mg" -) - -type MageModule interface { - directory() string - Test() error - TestUnit() error - TestE2E() error -} - -// Runs a series of commonly used commands. -func All() { - mg.SerialDeps( - Contracts{}.Build, - Generate, - Proto.All, - Format, - Lint, - Cosmos{}.Build, - Contracts{}.Test, - Cosmos{}.Test, - ) -} diff --git a/magefiles/proto.go b/magefiles/proto.go deleted file mode 100644 index 634722dede..0000000000 --- a/magefiles/proto.go +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// # Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -package main - -import ( - "fmt" - "os" - - "github.com/magefile/mage/mg" - "github.com/magefile/mage/sh" -) - -type Proto mg.Namespace - -// Run all proto related targets. -func (Proto) All() { - mg.SerialDeps(Proto.Format, Proto.Lint, Proto.Gen) -} - -// Generate protobuf source files. -func (Proto) Gen() error { - dir, err := os.Getwd() - if err != nil { - return err - } - - dockerArgs := []string{ - "run", "--rm", "-v", dir + ":/workspace", - "--workdir", "/workspace", - protoImageName + ":" + protoImageVersion, - "sh", "./cosmos/proto/scripts/proto_generate.sh", - } - - return sh.Run("docker", dockerArgs...) -} - -// Check that the generated protobuf source files are up to date. -func (Proto) GenCheck() error { - mg.Deps(Proto.Gen) - if err := gitDiff(); err != nil { - return fmt.Errorf("generated files are out of date: %w", err) - } - return nil -} - -// Format .proto files. -func (Proto) Format() error { - return bufCommand("format", "-w", protoDir) -} - -// Lint .proto files. -func (Proto) Lint() error { - return bufCommand("lint", "--error-format=json", protoDir) -} diff --git a/magefiles/setup/setup.go b/magefiles/setup/setup.go deleted file mode 100644 index 50ca6858fd..0000000000 --- a/magefiles/setup/setup.go +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "errors" - "fmt" - "os" - - "github.com/carolynvs/magex/pkg" - "github.com/magefile/mage/sh" -) - -var ( - // tools. - buf = "github.com/bufbuild/buf/cmd/buf" - gosec = "github.com/cosmos/gosec/v2/cmd/gosec" - golangcilint = "github.com/golangci/golangci-lint/cmd/golangci-lint" - addlicense = "github.com/google/addlicense" - moq = "github.com/matryer/moq" - ginkgo = "github.com/onsi/ginkgo/v2/ginkgo" - golines = "github.com/segmentio/golines" - rlpgen = "github.com/ethereum/go-ethereum/rlp/rlpgen" - abigen = "github.com/ethereum/go-ethereum/cmd/abigen" - mockery = "github.com/vektra/mockery/v2" - - ciTools = []string{buf, gosec, golangcilint, addlicense, ginkgo, golines} - allTools = append(ciTools, []string{moq, rlpgen, abigen, mockery}...) -) - -// Setup runs the setup script for the current OS. -func main() { - var err error - - // Ensure Mage is installed and available on the $PATH. - if err = pkg.EnsureMage(""); err != nil { - panic(err) - } - - if !isCi() { - if err = setupFoundry(); err != nil { - fmt.Println("Skipping foundryup, please install manually.") - } - } - - var toInstall []string - if isCi() { - toInstall = ciTools - } else { - toInstall = allTools - } - - if err = setupGoDeps(toInstall); err != nil { - panic(err) - } -} - -func isCi() bool { - return len(os.Args) > 1 && os.Args[1] == "ci" -} - -func setupGoDeps(toInstall []string) error { - for _, tool := range toInstall { - fmt.Println("Installing", fmt.Sprintf("`%s`", tool)) - if err := sh.RunCmd("go", "install", "-mod=readonly", tool); err() != nil { - return errors.New("failed to install " + tool + ": " + err().Error()) - } - } - fmt.Println("\n==============================================================") - fmt.Println("All Tools installed successful! Ensure $GOPATH/bin is on your $PATH!") - fmt.Println("==============================================================") - return nil -} - -func setupFoundry() error { - // Looks like we will have to get user to install foundryup manually for the time being. - // TODO: figure out how to do the curl install from mage. - fmt.Println("Running `foundryup`") - if err := sh.Run("foundryup"); err != nil { - return errors.New("failed to foundryup: " + err.Error()) - } - - return nil -} diff --git a/magefiles/tags.go b/magefiles/tags.go deleted file mode 100644 index d7829ae93b..0000000000 --- a/magefiles/tags.go +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "strings" - - "github.com/magefile/mage/sh" -) - -var ( - version = "v0.0.0" - commit, _ = sh.Output("git", "log", "-1", "--format='%H'") - defaultDB = "pebbledb" - ledgerEnabled = true - appName = "polaris-cosmos" - executableName = "polard" -) - -// generateOutDirectory returns the output directory for a given command. -func generateOutDirectory(cmd string) string { - return outdir + "/" + cmd -} - -// generateBuildTags returns the build tags to be used when building the binary. -func generateBuildTags() string { - tags := []string{defaultDB} - if ledgerEnabled { - tags = append(tags, "ledger") - } - return "-tags='" + strings.Join(tags, " ") + "'" -} - -// generateLinkerFlags returns the linker flags to be used when building the binary. -func generateLinkerFlags(production, statically bool) string { - baseFlags := []string{ - "-X ", cosmosSDK + "/version.Name=" + executableName, - " -X ", cosmosSDK + "/version.AppName=" + appName, - " -X ", cosmosSDK + "/version.Version=" + version, - " -X ", cosmosSDK + "/version.Commit=" + commit, - // TODO: Refactor versioning more broadly. - // " \"-X " + sdkRepo + "/version.BuildTags=" + strings.Join(generateBuildTags(), ",") + - " -X ", cosmosSDK + "/version.DBBackend=" + defaultDB, - } - - if production { - baseFlags = append(baseFlags, "-w", "-s") - } - - if statically { - baseFlags = append( - baseFlags, - "-linkmode=external", - "-extldflags", - "\"-Wl,-z,muldefs -static\"", - ) - } - - return "-ldflags=" + strings.Join(baseFlags, " ") -} diff --git a/magefiles/test.go b/magefiles/test.go deleted file mode 100644 index 0630c0fda3..0000000000 --- a/magefiles/test.go +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "os" - - "github.com/magefile/mage/sh" -) - -var ( - // Arguments. - junitArgs = []string{"--junit-report", "out.xml"} - coverArgs = append(junitArgs, []string{"--cover", "--coverprofile", - "coverage-testunitcover.txt", "--covermode", "atomic"}...) - raceArgs = append(junitArgs, []string{"-race"}...) -) - -// Starts a local docs page. -func Docs() error { - _ = os.Chdir("docs/web") - defer func() { _ = os.Chdir("../..") }() - if err := sh.RunV("yarn"); err != nil { - return err - } - return sh.RunV("yarn", "dev") -} diff --git a/magefiles/tools.go b/magefiles/tools.go deleted file mode 100644 index e35bcdc2cc..0000000000 --- a/magefiles/tools.go +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package main - -import ( - "fmt" - - "github.com/magefile/mage/sh" - - "pkg.berachain.dev/polaris/magefiles/utils" -) - -// =========================================================================== -// Go Language Tools -// ===========================================================================. - -// Runs `go generate` on the entire project. -func Generate() error { - utils.LogGreen("Running 'mockery'") - if err := mockery(); err != nil { - return err - } - utils.LogGreen("Running 'go generate' on the entire project...") - if err := goInstall(moq); err != nil { - return err - } - return ExecuteForAllModules(repoModuleDirs, func(...string) error { return goGenerate("./...") }, false) -} - -// Runs `go generate` on the entire project and verifies that no files were -// changed. -func GenerateCheck() error { - utils.LogGreen( - "Running 'go generate' on project and verifying that no files were changed...") - if err := ExecuteForAllModules( - repoModuleDirs, func(...string) error { return goGenerate("./...") }, false, - ); err != nil { - return err - } - if err := gitDiff(); err != nil { - return fmt.Errorf("generated files are out of date: %w", err) - } - return nil -} - -// Runs 'go tidy' on the entire project. -func Tidy() error { - return ExecuteForAllModules(repoModuleDirs, goModTidy, false) -} - -// Runs 'go work sync' on the entire project. -func Sync() error { - return goWorkSync() -} - -// Cleans the project. -func Clean() error { - // Remove golang build artifacts. - if err := sh.Rm("bin"); err != nil { - return err - } - - // Remove solidity build artifacts. - if err := (Contracts{}).Clean(); err != nil { - return err - } - - // Remove test cache. - return sh.RunV("go", "clean", "-testcache") -} diff --git a/magefiles/utils/logger.go b/magefiles/utils/logger.go deleted file mode 100644 index d15aa025fe..0000000000 --- a/magefiles/utils/logger.go +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -// -// Copyright (c) 2023 Berachain Foundation -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. - -package utils - -import ( - "fmt" -) - -// Color constants for terminal output. -const ( - resetColor = "\033[0m" - redColor = "\033[31m" - greenColor = "\033[32m" - yellowColor = "\033[33m" - blueColor = "\033[34m" - magentaColor = "\033[35m" - cyanColor = "\033[36m" -) - -// LogRed prints a log message with red color. -func LogRed(msg string, args ...interface{}) { - log(redColor, msg, args...) -} - -// LogGreen prints a log message with green color. -func LogGreen(msg string, args ...interface{}) { - log(greenColor, msg, args...) -} - -// LogYellow prints a log message with yellow color. -func LogYellow(msg string, args ...interface{}) { - log(yellowColor, msg, args...) -} - -// LogBlue prints a log message with blue color. -func LogBlue(msg string, args ...interface{}) { - log(blueColor, msg, args...) -} - -// LogMagenta prints a log message with magenta color. -func LogMagenta(msg string, args ...interface{}) { - log(magentaColor, msg, args...) -} - -// LogCyan prints a log message with cyan color. -func LogCyan(msg string, args ...interface{}) { - log(cyanColor, msg, args...) -} - -// log is a helper function that prints a log message and key-value pairs -// with a specified color. -// colorCode: ANSI escape code for the desired color -// msg: The log message to be printed -// args: Key-value pairs to be printed -func log(colorCode string, msg string, args ...interface{}) { - fmt.Printf("%s%s%s\n", colorCode, msg, resetColor) - for i := 0; i < len(args); i += 2 { - key := args[i] - value := args[i+1] - fmt.Printf("%s %v: %v%s\n", colorCode, key, value, resetColor) - } -} diff --git a/scripts/constants.mk b/scripts/constants.mk new file mode 100644 index 0000000000..b35c72365e --- /dev/null +++ b/scripts/constants.mk @@ -0,0 +1,6 @@ +#!/usr/bin/make -f +MODULES := $(shell find . -type f -name 'go.mod' -exec dirname {} \;) +# Exclude root module +MODULES := $(filter-out ./,$(MODULES)) +CONTRACTS_DIR := ./contracts + diff --git a/scripts/cosmos.mk b/scripts/cosmos.mk new file mode 100644 index 0000000000..cdb2e41d62 --- /dev/null +++ b/scripts/cosmos.mk @@ -0,0 +1,96 @@ +#!/usr/bin/make -f + +# cosmos.mk contains the build configuration for this project as +# forked from the cosmos-sdk https://github.com/cosmos/cosmos-sdk/tree/main/Makefile +# It is moved here to reduce clutter in the main Makefile and to make it easier to +# update. + +export VERSION := $(shell echo $(shell git describe --tags --always --match "v*") | sed 's/^v//') +export COMMIT := $(shell git log -1 --format='%H') +CURRENT_DIR = $(shell pwd) +OUT_DIR ?= $(CURDIR)/bin +BINDIR ?= $(GOPATH)/bin +TESTAPP_DIR = ./e2e/testapp +PROJECT_NAME = $(shell git remote get-url origin | xargs basename -s .git) + +# process build tags +build_tags = netgo +ifeq ($(LEDGER_ENABLED),true) + ifeq ($(OS),Windows_NT) + GCCEXE = $(shell where gcc.exe 2> NUL) + ifeq ($(GCCEXE),) + $(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + build_tags += ledger + endif + else + UNAME_S = $(shell uname -s) + ifeq ($(UNAME_S),OpenBSD) + $(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988)) + else + GCC = $(shell command -v gcc 2> /dev/null) + ifeq ($(GCC),) + $(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + build_tags += ledger + endif + endif + endif +endif + +ifeq (secp,$(findstring secp,$(COSMOS_BUILD_OPTIONS))) + build_tags += libsecp256k1_sdk +endif + +ifeq (legacy,$(findstring legacy,$(COSMOS_BUILD_OPTIONS))) + build_tags += app_v1 +endif + +# DB backend selection +ifeq (cleveldb,$(findstring cleveldb,$(COSMOS_BUILD_OPTIONS))) + build_tags += gcc +endif +ifeq (badgerdb,$(findstring badgerdb,$(COSMOS_BUILD_OPTIONS))) + build_tags += badgerdb +endif +# handle rocksdb +ifeq (rocksdb,$(findstring rocksdb,$(COSMOS_BUILD_OPTIONS))) + CGO_ENABLED=1 + build_tags += rocksdb grocksdb_clean_link +endif +# handle boltdb +ifeq (boltdb,$(findstring boltdb,$(COSMOS_BUILD_OPTIONS))) + build_tags += boltdb +endif + +whitespace := +whitespace += $(whitespace) +comma := , +build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags)) + +# process linker flags +ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=sim \ + -X github.com/cosmos/cosmos-sdk/version.AppName=simd \ + -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ + -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ + -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)" + +ifeq (,$(findstring nostrip,$(COSMOS_BUILD_OPTIONS))) + ldflags += -w -s +endif +ldflags += $(LDFLAGS) +ldflags := $(strip $(ldflags)) + +build_tags += $(BUILD_TAGS) +build_tags := $(strip $(build_tags)) + +BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)' +# check for nostrip option +ifeq (,$(findstring nostrip,$(COSMOS_BUILD_OPTIONS))) + BUILD_FLAGS += -trimpath +endif + +# Check for debug option +ifeq (debug,$(findstring debug,$(COSMOS_BUILD_OPTIONS))) + BUILD_FLAGS += -gcflags "all=-N -l" +endif \ No newline at end of file diff --git a/magefiles/LICENSE b/tools/LICENSE similarity index 100% rename from magefiles/LICENSE rename to tools/LICENSE diff --git a/magefiles/LICENSE.header b/tools/LICENSE.header similarity index 100% rename from magefiles/LICENSE.header rename to tools/LICENSE.header diff --git a/magefiles/go.mod b/tools/go.mod similarity index 99% rename from magefiles/go.mod rename to tools/go.mod index 28ad428b8d..16def41255 100644 --- a/magefiles/go.mod +++ b/tools/go.mod @@ -1,15 +1,13 @@ -module pkg.berachain.dev/polaris/magefiles +module pkg.berachain.dev/polaris/tools go 1.21 require ( github.com/bufbuild/buf v1.26.1 - github.com/carolynvs/magex v0.9.0 github.com/cosmos/gosec/v2 v2.0.0-20230124142343-bf28a33fadf2 github.com/ethereum/go-ethereum v1.13.1 github.com/golangci/golangci-lint v1.54.2 github.com/google/addlicense v1.1.1 - github.com/magefile/mage v1.15.0 github.com/matryer/moq v0.3.2 github.com/onsi/ginkgo/v2 v2.12.1 github.com/securego/gosec/v2 v2.17.0 @@ -30,7 +28,6 @@ require ( github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect diff --git a/magefiles/go.sum b/tools/go.sum similarity index 98% rename from magefiles/go.sum rename to tools/go.sum index eb6041b700..2033f07993 100644 --- a/magefiles/go.sum +++ b/tools/go.sum @@ -63,9 +63,6 @@ github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0 h1:3ZBs7LAezy8gh0uECsA6C github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0/go.mod h1:rZLTje5A9kFBe0pzhpe2TdhRniBF++PRHQuRpR8esVc= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= @@ -90,7 +87,6 @@ github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqr github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= @@ -139,8 +135,6 @@ github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1 github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= -github.com/carolynvs/magex v0.9.0 h1:fWe7oshGv6zuei5Z6EI95RSlOKjIifBZ26myB9G+m/I= -github.com/carolynvs/magex v0.9.0/go.mod h1:H1LW6RYJ/sNbisMmPe9E73aJZa8geKLKK9mBWLWz3ek= github.com/ccojocar/zxcvbn-go v1.0.1 h1:+sxrANSCj6CdadkcMnvde/GWU1vZiiXRbqYSCalV4/4= github.com/ccojocar/zxcvbn-go v1.0.1/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -228,8 +222,6 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= -github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -374,7 +366,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -538,15 +529,11 @@ github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= @@ -585,9 +572,6 @@ github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magefile/mage v1.13.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= -github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= @@ -621,7 +605,6 @@ github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -658,7 +641,6 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.13.5 h1:fOsPB4CEZOPkyMqF4B9hoqOpooFWU7vWSVkCSscVpgU= github.com/nunnatsa/ginkgolinter v0.13.5/go.mod h1:OBHy4536xtuX3102NM63XRtOyxqZOO02chsaeDWXVO8= -github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -693,7 +675,6 @@ github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= -github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= @@ -870,8 +851,6 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= @@ -894,7 +873,6 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= diff --git a/magefiles/tools/tools.go b/tools/tools.go similarity index 100% rename from magefiles/tools/tools.go rename to tools/tools.go From 1441a77af963e57a1066611d4cc4e6b71042d836 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 3 Oct 2023 10:53:42 -0400 Subject: [PATCH 046/122] fix(make): tidy -> sync on build --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 34fe448b12..f4f3248c0b 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ build-linux-amd64: build-linux-arm64: GOOS=linux GOARCH=arm64 LEDGER_ENABLED=false $(MAKE) build -$(BUILD_TARGETS): forge-build tidy $(OUT_DIR)/ +$(BUILD_TARGETS): forge-build sync $(OUT_DIR)/ @echo "Building ${TESTAPP_DIR}" @cd ${CURRENT_DIR}/$(TESTAPP_DIR) && go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... From 64aed508cf0a50dbc17d1ad39542d1088e338e43 Mon Sep 17 00:00:00 2001 From: ocnc <97242826+ocnc@users.noreply.github.com> Date: Tue, 3 Oct 2023 23:35:48 -0400 Subject: [PATCH 047/122] fix(distr): filter empty rewards (#1167) ### Summary by CodeRabbit - Bug Fix: Optimized the `GetAllDelegatorRewards` function in the `Contract` struct of the `distribution.go` file. The update skips processing for delegator rewards that have an empty `Reward` field, enhancing system performance by avoiding unnecessary computations. --- cosmos/precompile/distribution/distribution.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cosmos/precompile/distribution/distribution.go b/cosmos/precompile/distribution/distribution.go index 9d350edb13..144a31ce0f 100644 --- a/cosmos/precompile/distribution/distribution.go +++ b/cosmos/precompile/distribution/distribution.go @@ -193,6 +193,9 @@ func (c *Contract) GetAllDelegatorRewards( rewards := make([]generated.IDistributionModuleValidatorReward, 0, len(res.Rewards)) for _, reward := range res.Rewards { var amount []generated.CosmosCoin + if reward.Reward.Len() == 0 { + continue + } for _, coin := range reward.Reward { amount = append(amount, generated.CosmosCoin{ Denom: coin.Denom, From 06b91639e614c137069521f213c469efda75bb4d Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Wed, 4 Oct 2023 11:41:33 -0400 Subject: [PATCH 048/122] chore(gov): Minor control flow correction (#1169) ### Summary by CodeRabbit - Bug Fix: Enhanced error handling in the `SubmitProposal` function within the governance module. The function now properly handles errors and returns only the proposal ID, improving reliability and stability of the governance process. --- cosmos/precompile/governance/governance.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cosmos/precompile/governance/governance.go b/cosmos/precompile/governance/governance.go index 58a8ff61a8..c597080cb0 100644 --- a/cosmos/precompile/governance/governance.go +++ b/cosmos/precompile/governance/governance.go @@ -92,6 +92,9 @@ func (c *Contract) SubmitProposal( // Create the proposal. res, err := c.msgServer.SubmitProposal(ctx, &p) + if err != nil { + return 0, err + } // emit an event at the end of this successful proposal submission polarCtx := vm.UnwrapPolarContext(ctx) @@ -104,7 +107,7 @@ func (c *Contract) SubmitProposal( ) // Return the proposal ID. - return res.ProposalId, err + return res.ProposalId, nil } // CancelProposal is the method for the `cancelProposal` method of the governance precompile contract. From f8a43fdfe7e44a3c296c91d559beea7e1e7953e2 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 4 Oct 2023 13:20:43 -0400 Subject: [PATCH 049/122] feat(txpool): Dev/geth txpool (#1140) Co-authored-by: Cal Bera --- .golangci.yaml | 13 +- cosmos/abci/prepare/prepare.go | 134 +++++ cosmos/config/config.go | 275 ++++++++-- cosmos/config/flags.go | 41 +- cosmos/config/template.go | 117 +++- .../txpool/interfaces.go => cosmos.go} | 6 +- cosmos/crypto/hd/algo.go | 6 +- cosmos/crypto/keys/ethsecp256k1/keys.go | 11 +- cosmos/go.mod | 8 +- cosmos/go.sum | 16 +- cosmos/txpool/handler.go | 40 +- cosmos/txpool/handler_test.go | 10 +- cosmos/txpool/mempool.go | 51 +- cosmos/txpool/mempool_test.go | 3 +- cosmos/txpool/mocks/broadcaster.go | 90 ---- cosmos/txpool/mocks/geth_tx_pool.go | 47 ++ cosmos/txpool/mocks/handler.go | 67 +-- cosmos/txpool/mocks/lifecycle.go | 114 ++++ cosmos/txpool/mocks/tx_broadcaster.go | 90 ++++ cosmos/types/config.go | 12 +- cosmos/x/evm/depinject.go | 15 +- cosmos/x/evm/genesis.go | 5 +- cosmos/x/evm/genesis_test.go | 54 +- cosmos/x/evm/keeper/abci.go | 6 +- cosmos/x/evm/keeper/deprecate_me_please.go | 61 +++ cosmos/x/evm/keeper/genesis.go | 3 + cosmos/x/evm/keeper/host.go | 89 ++- cosmos/x/evm/keeper/keeper.go | 127 ++--- cosmos/x/evm/keeper/processor.go | 2 +- cosmos/x/evm/keeper/processor_test.go | 34 +- cosmos/x/evm/plugins/block/header.go | 4 +- cosmos/x/evm/plugins/block/header_test.go | 2 +- cosmos/x/evm/plugins/block/plugin.go | 4 +- .../configuration/configuration_test.go | 33 -- cosmos/x/evm/plugins/configuration/genesis.go | 41 -- cosmos/x/evm/plugins/configuration/plugin.go | 25 +- .../evm/plugins/configuration/plugin_test.go | 57 -- cosmos/x/evm/plugins/configuration/store.go | 48 -- .../x/evm/plugins/configuration/store_test.go | 76 --- cosmos/x/evm/plugins/precompile/plugin.go | 5 + cosmos/x/evm/plugins/state/genesis_test.go | 2 +- cosmos/x/evm/plugins/state/plugin.go | 19 +- cosmos/x/evm/plugins/state/plugin_test.go | 3 +- cosmos/x/evm/plugins/txpool/mempool/errors.go | 27 - .../evm/plugins/txpool/mempool/interfaces.go | 36 -- .../x/evm/plugins/txpool/mempool/mempool.go | 95 ---- .../plugins/txpool/mempool/mempool_policy.go | 96 ---- .../plugins/txpool/mempool/mempool_reader.go | 210 -------- .../plugins/txpool/mempool/mempool_test.go | 509 ------------------ .../plugins/txpool/mempool/mempool_writer.go | 94 ---- cosmos/x/evm/plugins/txpool/plugin.go | 108 ---- cosmos/x/evm/plugins/txpool/txpool_test.go | 33 -- cosmos/x/evm/types/tx.go | 9 +- e2e/hive/clients/polard/Dockerfile | 2 +- e2e/hive/clients/polard/config/app.toml | 134 ++++- e2e/hive/clients/polard/config/config.toml | 10 +- e2e/hive/clients/polard/config/genesis.json | 2 - e2e/hive/clients/polard/hive-init.sh | 64 ++- .../simulators/rpc-compat/tests/genesis.json | 2 + e2e/hive/simulators/rpc/init/genesis.json | 1 + e2e/localnet/go.mod | 2 +- e2e/localnet/go.sum | 4 +- e2e/localnet/network/node.go | 2 +- e2e/precompile/go.mod | 2 +- e2e/precompile/go.sum | 4 +- e2e/precompile/polard/config/app.toml | 134 ++++- e2e/precompile/polard/config/config.toml | 12 +- e2e/precompile/polard/config/genesis.json | 1 - e2e/testapp/app.go | 134 ++--- e2e/testapp/docker/local/config/app.toml | 113 +++- e2e/testapp/docker/local/config/config.toml | 12 +- e2e/testapp/entrypoint.sh | 3 - e2e/testapp/go.mod | 12 +- e2e/testapp/go.sum | 16 +- e2e/testapp/{precompiles.go => helpers.go} | 18 + e2e/testapp/polard/cmd/root.go | 19 +- eth/accounts/abi/errors.go | 8 +- eth/core/chain_resources.go | 13 +- eth/core/genesis.go | 19 +- eth/core/host.go | 28 - eth/core/mock/host.go | 8 +- eth/core/mock/host.mock.go | 37 -- eth/core/mock/txpool_plugin.go | 23 - eth/core/mock/txpool_plugin.mock.go | 418 -------------- eth/core/precompile/method_validation_test.go | 7 +- eth/core/processor.go | 1 + eth/core/processor_test.go | 4 +- eth/core/state/journal/selfdestructs.go | 10 +- eth/core/txpool/txpool.go | 45 -- eth/go.mod | 3 +- eth/go.sum | 6 +- eth/miner/miner.go | 28 +- eth/params/chain_config.go | 7 +- eth/params/imported.go | 3 +- eth/polar/backend.go | 14 +- eth/polar/config.go | 39 +- eth/polar/polaris.go | 58 +- go.work.sum | 1 + lib/ds/stack/cloneable_stack.go | 4 +- 99 files changed, 1829 insertions(+), 2741 deletions(-) create mode 100644 cosmos/abci/prepare/prepare.go rename cosmos/{x/evm/plugins/txpool/interfaces.go => cosmos.go} (92%) delete mode 100644 cosmos/txpool/mocks/broadcaster.go create mode 100644 cosmos/txpool/mocks/lifecycle.go create mode 100644 cosmos/txpool/mocks/tx_broadcaster.go create mode 100644 cosmos/x/evm/keeper/deprecate_me_please.go delete mode 100644 cosmos/x/evm/plugins/configuration/configuration_test.go delete mode 100644 cosmos/x/evm/plugins/configuration/genesis.go delete mode 100644 cosmos/x/evm/plugins/configuration/plugin_test.go delete mode 100644 cosmos/x/evm/plugins/configuration/store.go delete mode 100644 cosmos/x/evm/plugins/configuration/store_test.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/errors.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/interfaces.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/mempool.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/mempool_policy.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/mempool_test.go delete mode 100644 cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go delete mode 100644 cosmos/x/evm/plugins/txpool/plugin.go delete mode 100644 cosmos/x/evm/plugins/txpool/txpool_test.go rename e2e/testapp/{precompiles.go => helpers.go} (80%) delete mode 100644 eth/core/mock/txpool_plugin.go delete mode 100644 eth/core/mock/txpool_plugin.mock.go delete mode 100644 eth/core/txpool/txpool.go diff --git a/.golangci.yaml b/.golangci.yaml index 9014d98a83..fd4785b06f 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -162,11 +162,14 @@ linters-settings: # Default: false strict: true - # max line length, lines longer will be reported. Default is 120. - # '\t' is counted as 1 character by default, and can be changed with the tab-width option - line-length: 99 - # tab width in spaces. Default to 1. - tab-width: 1 + lll: + # Max line length, lines longer will be reported. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option. + # Default: 120. + line-length: 120 + # Tab width in spaces. + # Default: 1 + tab-width: 1 nakedret: # Make an issue if func has more lines of code than this setting, and it has naked returns. diff --git a/cosmos/abci/prepare/prepare.go b/cosmos/abci/prepare/prepare.go new file mode 100644 index 0000000000..d35704af95 --- /dev/null +++ b/cosmos/abci/prepare/prepare.go @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package prepare + +import ( + abci "github.com/cometbft/cometbft/abci/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/miner" + + "pkg.berachain.dev/polaris/eth/polar" +) + +type ( + // ProposalTxVerifier defines the interface that is implemented by BaseApp, + // that any custom ABCI PrepareProposal and ProcessProposal handler can use + // to verify a transaction. + TxVerifier interface { + PrepareProposalVerifyTx(tx sdk.Tx) ([]byte, error) + ProcessProposalVerifyTx(txBz []byte) (sdk.Tx, error) + } +) + +// TxSerializer provides an interface to Serialize Geth Transactions to Bytes (via sdk.Tx). +type TxSerializer interface { + SerializeToSdkTx(signedTx *types.Transaction) (sdk.Tx, error) +} + +// Handler provides the PrepareProposal function to allow a cosmos app to utilize the +// geth txpool. +type Handler struct { + polaris *polar.Polaris + txVerifier TxVerifier + serializer TxSerializer +} + +// NewHandler returns a new Handler. +func NewHandler(polaris *polar.Polaris, txVerifier TxVerifier) *Handler { + return &Handler{ + polaris: polaris, + txVerifier: txVerifier, + } +} + +// Init initializes the handler. +func (h *Handler) Init(serializer TxSerializer) { + h.serializer = serializer +} + +// PrepareProposal implements baseapp.PrepareProposalHandler. +func (h *Handler) PrepareProposal( + ctx sdk.Context, req *abci.RequestPrepareProposal, +) (*abci.ResponsePrepareProposal, error) { + var maxBlockGas int64 + if b := ctx.ConsensusParams().Block; b != nil { + maxBlockGas = b.MaxGas + } + + var ( + selectedTxs [][]byte + totalTxBytes int64 + totalTxGas uint64 + ) + txs := h.txPoolTransactions() + + for lazyTx := txs.Peek(); lazyTx != nil; lazyTx = txs.Peek() { + tx := lazyTx.Resolve() + sdkTx, err := h.serializer.SerializeToSdkTx(tx) + if err != nil { + ctx.Logger().Error("Failed sdk.Tx Serialization", tx.Hash(), err) + continue + } + + var bz []byte + bz, _ = h.txVerifier.PrepareProposalVerifyTx(sdkTx) + txGasLimit := tx.Gas() + txSize := int64(len(bz)) + + // only add the transaction to the proposal if we have enough capacity + if (txSize + totalTxBytes) < req.MaxTxBytes { + // If there is a max block gas limit, add the tx only if the limit has + // not been met. + if maxBlockGas > 0 { + if (txGasLimit + totalTxGas) <= uint64(maxBlockGas) { + totalTxGas += txGasLimit + totalTxBytes += txSize + selectedTxs = append(selectedTxs, bz) + } + } else { + totalTxBytes += txSize + selectedTxs = append(selectedTxs, bz) + } + } + + // Check if we've reached capacity. If so, we cannot select any more + // transactions. + if totalTxBytes >= req.MaxTxBytes || + (maxBlockGas > 0 && (totalTxGas >= uint64(maxBlockGas))) { + break + } + + // Shift the transaction off the queue. + txs.Shift() + } + + return &abci.ResponsePrepareProposal{Txs: selectedTxs}, nil +} + +// txPoolTransactions returns a sorted list of transactions from the txpool. +func (h *Handler) txPoolTransactions() *miner.TransactionsByPriceAndNonce { + return miner.NewTransactionsByPriceAndNonce(types.LatestSigner( + h.polaris.Host().GetConfigurationPlugin().ChainConfig(), + ), h.polaris.TxPool().Pending(false), h.polaris.Miner().NextBaseFee()) +} diff --git a/cosmos/config/config.go b/cosmos/config/config.go index 3128a5bad4..e559553f31 100644 --- a/cosmos/config/config.go +++ b/cosmos/config/config.go @@ -27,18 +27,23 @@ import ( "github.com/spf13/cast" + "github.com/cosmos/cosmos-sdk/client/flags" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/ethereum/go-ethereum/node" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/polar" ) // DefaultConfig returns the default configuration for a polaris chain. func DefaultConfig() *Config { + nodeCfg := *polar.DefaultGethNodeConfig() + nodeCfg.DataDir = "" + nodeCfg.KeyStoreDir = "" return &Config{ Polar: *polar.DefaultConfig(), - Node: *polar.DefaultGethNodeConfig(), + Node: nodeCfg, } } @@ -47,6 +52,14 @@ type Config struct { Node node.Config } +func MustReadConfigFromAppOpts(opts servertypes.AppOptions) *Config { + cfg, err := ReadConfigFromAppOpts(opts) + if err != nil { + panic(err) + } + return cfg +} + //nolint:funlen,gocognit,gocyclo,cyclop // TODO break up later. func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { var err error @@ -54,18 +67,52 @@ func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { conf := &Config{} // Define little error handler. - var handleError = func(err error) error { + var handleError = func(err error, flag string) error { if err != nil { - return fmt.Errorf("error while reading configuration: %w", err) + return fmt.Errorf("error while reading configuration: %w flag: %s", err, flag) } return nil } // Wrapping casting functions to return both value and error + getCommonAddressList := func(key string) []common.Address { + addresses := make([]common.Address, 0) + addressStrs := cast.ToStringSlice(opts.Get(key)) + for _, addressStr := range addressStrs { + address := common.HexToAddress(addressStr) + addresses = append(addresses, address) + } + return addresses + } getString := func(key string) (string, error) { return cast.ToStringE(opts.Get(key)) } getInt := func(key string) (int, error) { return cast.ToIntE(opts.Get(key)) } getInt64 := func(key string) (int64, error) { return cast.ToInt64E(opts.Get(key)) } getUint64 := func(key string) (uint64, error) { return cast.ToUint64E(opts.Get(key)) } + getUint64Ptr := func(key string) (*uint64, error) { + if num, _ := cast.ToStringE((opts.Get(key))); num == "" || num == "null" { + return nil, nil //nolint:nilnil // intentional. + } + + num, _err := cast.ToUint64E((opts.Get(key))) + if _err != nil { + return nil, _err + } + return &num, nil + } + getBigInt := func(key string) (*big.Int, error) { + str, _err := cast.ToStringE(opts.Get(key)) + if str == "" || str == "null" { + return nil, nil //nolint:nilnil // intentional. + } + if _err != nil { + return nil, _err + } + num, ok := new(big.Int).SetString(str, 10) //nolint:gomnd // base 10. + if !ok { + return nil, fmt.Errorf("invalid big.Int string: %s", str) + } + return num, nil + } getFloat64 := func(key string) (float64, error) { return cast.ToFloat64E(opts.Get(key)) } getBool := func(key string) (bool, error) { return cast.ToBoolE(opts.Get(key)) } getStringSlice := func(key string) ([]string, error) { return cast.ToStringSliceE(opts.Get(key)) } @@ -73,159 +120,281 @@ func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { // Polar settings if conf.Polar.RPCGasCap, err = getUint64(flagRPCGasCap); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagRPCGasCap) } if conf.Polar.RPCEVMTimeout, err = getTimeDuration(flagRPCEvmTimeout); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagRPCEvmTimeout) } if conf.Polar.RPCTxFeeCap, err = getFloat64(flagRPCTxFeeCap); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagRPCTxFeeCap) + } + + // Polar Chain settings + if conf.Polar.Chain.ChainID, err = getBigInt(flagChainID); err != nil { + return nil, handleError(err, flagChainID) + } + if conf.Polar.Chain.HomesteadBlock, err = getBigInt(flagHomesteadBlock); err != nil { + return nil, handleError(err, flagHomesteadBlock) + } + if conf.Polar.Chain.DAOForkBlock, err = getBigInt(flagDAOForkBlock); err != nil { + return nil, handleError(err, flagDAOForkBlock) + } + if conf.Polar.Chain.DAOForkSupport, err = getBool(flagDAOForkSupport); err != nil { + return nil, handleError(err, flagDAOForkSupport) + } + if conf.Polar.Chain.EIP150Block, err = getBigInt(flagEIP150Block); err != nil { + return nil, handleError(err, flagEIP150Block) + } + if conf.Polar.Chain.EIP155Block, err = getBigInt(flagEIP155Block); err != nil { + return nil, handleError(err, flagEIP155Block) + } + if conf.Polar.Chain.EIP158Block, err = getBigInt(flagEIP158Block); err != nil { + return nil, handleError(err, flagEIP158Block) + } + if conf.Polar.Chain.ByzantiumBlock, err = getBigInt(flagByzantiumBlock); err != nil { + return nil, handleError(err, flagByzantiumBlock) + } + if conf.Polar.Chain.ConstantinopleBlock, err = getBigInt(flagConstantinopleBlock); err != nil { + return nil, handleError(err, flagConstantinopleBlock) + } + if conf.Polar.Chain.PetersburgBlock, err = getBigInt(flagPetersburgBlock); err != nil { + return nil, handleError(err, flagPetersburgBlock) + } + if conf.Polar.Chain.IstanbulBlock, err = getBigInt(flagIstanbulBlock); err != nil { + return nil, handleError(err, flagIstanbulBlock) + } + if conf.Polar.Chain.MuirGlacierBlock, err = getBigInt(flagMuirGlacierBlock); err != nil { + return nil, handleError(err, flagMuirGlacierBlock) + } + if conf.Polar.Chain.BerlinBlock, err = getBigInt(flagBerlinBlock); err != nil { + return nil, handleError(err, flagBerlinBlock) + } + if conf.Polar.Chain.LondonBlock, err = getBigInt(flagLondonBlock); err != nil { + return nil, handleError(err, flagLondonBlock) + } + if conf.Polar.Chain.ArrowGlacierBlock, err = getBigInt(flagArrowGlacierBlock); err != nil { + return nil, handleError(err, flagArrowGlacierBlock) + } + if conf.Polar.Chain.GrayGlacierBlock, err = getBigInt(flagGrayGlacierBlock); err != nil { + return nil, handleError(err, flagGrayGlacierBlock) + } + if conf.Polar.Chain.MergeNetsplitBlock, err = getBigInt(flagMergeNetsplitBlock); err != nil { + return nil, handleError(err, flagMergeNetsplitBlock) + } + if conf.Polar.Chain.ShanghaiTime, err = getUint64Ptr(flagShanghaiTime); err != nil { + return nil, handleError(err, flagShanghaiTime) + } + + if conf.Polar.Chain.CancunTime, err = getUint64Ptr(flagCancunTime); err != nil { + return nil, handleError(err, flagCancunTime) + } + if conf.Polar.Chain.PragueTime, err = getUint64Ptr(flagPragueTime); err != nil { + return nil, handleError(err, flagPragueTime) + } + if conf.Polar.Chain.VerkleTime, err = getUint64Ptr(flagVerkleTime); err != nil { + return nil, handleError(err, flagVerkleTime) + } + + if conf.Polar.Chain.TerminalTotalDifficulty, err = getBigInt(flagTerminalTotalDifficulty); err != nil { + return nil, handleError(err, flagTerminalTotalDifficulty) + } + if conf.Polar.Chain.TerminalTotalDifficultyPassed, err = getBool(flagTerminalTotalDifficultyPassed); err != nil { + return nil, handleError(err, flagTerminalTotalDifficultyPassed) + } + if conf.Polar.Chain.IsDevMode, err = getBool(flagIsDevMode); err != nil { + return nil, handleError(err, flagIsDevMode) } // Polar.GPO settings if conf.Polar.GPO.Blocks, err = getInt(flagBlocks); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagBlocks) } if conf.Polar.GPO.Percentile, err = getInt(flagPercentile); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagPercentile) } if conf.Polar.GPO.MaxHeaderHistory, err = getUint64(flagMaxHeaderHistory); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagMaxHeaderHistory) } if conf.Polar.GPO.MaxBlockHistory, err = getUint64(flagMaxBlockHistory); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagMaxBlockHistory) } if val, err = getInt64(flagDefault); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagDefault) } conf.Polar.GPO.Default = big.NewInt(val) - if val, err = getInt64(flagDefault); err != nil { - return nil, handleError(err) + if val, err = getInt64(flagMaxPrice); err != nil { + return nil, handleError(err, flagMaxPrice) } conf.Polar.GPO.MaxPrice = big.NewInt(val) - if val, err = getInt64(flagDefault); err != nil { - return nil, handleError(err) + if val, err = getInt64(flagIgnorePrice); err != nil { + return nil, handleError(err, flagIgnorePrice) } conf.Polar.GPO.IgnorePrice = big.NewInt(val) + // LegacyPool + conf.Polar.LegacyTxPool.Locals = getCommonAddressList(flagDefault) + + if conf.Polar.LegacyTxPool.NoLocals, err = getBool(flagNoLocals); err != nil { + return nil, handleError(err, flagNoLocals) + } + + if conf.Polar.LegacyTxPool.Journal, err = getString(flagJournal); err != nil { + return nil, handleError(err, flagJournal) + } + + if conf.Polar.LegacyTxPool.Rejournal, err = getTimeDuration(flagReJournal); err != nil { + return nil, handleError(err, flagReJournal) + } + + if conf.Polar.LegacyTxPool.PriceLimit, err = getUint64(flagPriceLimit); err != nil { + return nil, handleError(err, flagPriceLimit) + } + + if conf.Polar.LegacyTxPool.PriceBump, err = getUint64(flagPriceBump); err != nil { + return nil, handleError(err, flagPriceBump) + } + + if conf.Polar.LegacyTxPool.AccountSlots, err = getUint64(flagAccountSlots); err != nil { + return nil, handleError(err, flagAccountSlots) + } + + if conf.Polar.LegacyTxPool.GlobalSlots, err = getUint64(flagGlobalSlots); err != nil { + return nil, handleError(err, flagGlobalSlots) + } + + if conf.Polar.LegacyTxPool.AccountQueue, err = getUint64(flagAccountQueue); err != nil { + return nil, handleError(err, flagAccountQueue) + } + + if conf.Polar.LegacyTxPool.GlobalQueue, err = getUint64(flagGlobalQueue); err != nil { + return nil, handleError(err, flagGlobalQueue) + } + + if conf.Polar.LegacyTxPool.Lifetime, err = getTimeDuration(flagLifetime); err != nil { + return nil, handleError(err, flagLifetime) + } + // Node settings if conf.Node.Name, err = getString(flagName); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagName) } if conf.Node.UserIdent, err = getString(flagUserIdent); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagUserIdent) } if conf.Node.Version, err = getString(flagVersion); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagVersion) } if conf.Node.DataDir, err = getString(flagDataDir); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagDataDir) } if conf.Node.DataDir == "" { - conf.Node.DataDir = node.DefaultDataDir() + conf.Node.DataDir, err = getString(flags.FlagHome) + if err != nil { + return nil, handleError(err, flags.FlagHome) + } } if conf.Node.KeyStoreDir, err = getString(flagKeyStoreDir); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagKeyStoreDir) } if conf.Node.ExternalSigner, err = getString(flagExternalSigner); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagExternalSigner) } if conf.Node.UseLightweightKDF, err = getBool(flagUseLightweightKdf); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagUseLightweightKdf) } if conf.Node.InsecureUnlockAllowed, err = getBool(flagInsecureUnlockAllowed); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagInsecureUnlockAllowed) } if conf.Node.USB, err = getBool(flagUsb); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagUsb) } if conf.Node.SmartCardDaemonPath, err = getString(flagSmartCardDaemonPath); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagSmartCardDaemonPath) } if conf.Node.IPCPath, err = getString(flagIpcPath); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagIpcPath) } if conf.Node.HTTPHost, err = getString(flagHTTPHost); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagHTTPHost) } if conf.Node.HTTPPort, err = getInt(flagHTTPPort); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagHTTPPort) } if conf.Node.HTTPCors, err = getStringSlice(flagHTTPCors); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagHTTPCors) } if conf.Node.HTTPVirtualHosts, err = getStringSlice(flagHTTPVirtualHosts); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagHTTPVirtualHosts) } if conf.Node.HTTPModules, err = getStringSlice(flagHTTPModules); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagHTTPModules) } if conf.Node.HTTPPathPrefix, err = getString(flagHTTPPathPrefix); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagHTTPPathPrefix) } if conf.Node.AuthAddr, err = getString(flagAuthAddr); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagAuthAddr) } if conf.Node.AuthPort, err = getInt(flagAuthPort); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagAuthPort) } if conf.Node.AuthVirtualHosts, err = getStringSlice(flagAuthVirtualHosts); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagAuthVirtualHosts) } if conf.Node.WSHost, err = getString(flagWsHost); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWsHost) } if conf.Node.WSPort, err = getInt(flagWsPort); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWsPort) } if conf.Node.WSPathPrefix, err = getString(flagWsPathPrefix); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWsPathPrefix) } if conf.Node.WSOrigins, err = getStringSlice(flagWsOrigins); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWsOrigins) } if conf.Node.WSModules, err = getStringSlice(flagWsModules); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWsModules) } if conf.Node.WSExposeAll, err = getBool(flagWsExposeAll); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWsExposeAll) } if conf.Node.GraphQLCors, err = getStringSlice(flagGraphqlCors); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagGraphqlCors) } if conf.Node.GraphQLVirtualHosts, err = getStringSlice(flagGraphqlVirtualHosts); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagGraphqlVirtualHosts) } if conf.Node.AllowUnprotectedTxs, err = getBool(flagAllowUnprotectedTxs); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagAllowUnprotectedTxs) } if conf.Node.BatchRequestLimit, err = getInt(flagBatchRequestLimit); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagBatchRequestLimit) } if conf.Node.BatchResponseMaxSize, err = getInt(flagBatchResponseMaxSize); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagBatchResponseMaxSize) } if conf.Node.JWTSecret, err = getString(flagJwtSecret); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagJwtSecret) } if conf.Node.DBEngine, err = getString(flagDBEngine); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagDBEngine) } // Node.HTTPTimeouts settings if conf.Node.HTTPTimeouts.ReadTimeout, err = getTimeDuration(flagReadTimeout); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagReadTimeout) } if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = getTimeDuration(flagReadHeaderTimeout); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagReadHeaderTimeout) } if conf.Node.HTTPTimeouts.WriteTimeout, err = getTimeDuration(flagWriteTimeout); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagWriteTimeout) } if conf.Node.HTTPTimeouts.IdleTimeout, err = getTimeDuration(flagIdleTimeout); err != nil { - return nil, handleError(err) + return nil, handleError(err, flagIdleTimeout) } return conf, nil diff --git a/cosmos/config/flags.go b/cosmos/config/flags.go index 3b9758bd91..4e6ee616a0 100644 --- a/cosmos/config/flags.go +++ b/cosmos/config/flags.go @@ -51,6 +51,8 @@ const ( flagWsHost = "polaris.node.ws-host" flagName = "polaris.node.name" flagRPCEvmTimeout = "polaris.polar.rpc-evm-timeout" + flagRPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" + flagRPCGasCap = "polaris.polar.rpc-gas-cap" flagAuthVirtualHosts = "polaris.node.auth-virtual-hosts" flagAuthPort = "polaris.node.auth-port" flagUsb = "polaris.node.usb" @@ -58,16 +60,51 @@ const ( flagBatchResponseMaxSize = "polaris.node.batch-response-max-size" flagVersion = "polaris.node.version" flagHTTPVirtualHosts = "polaris.node.http-virtual-hosts" - flagRPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" flagMaxHeaderHistory = "polaris.polar.gpo.max-header-history" flagExternalSigner = "polaris.node.external-signer" flagHTTPPathPrefix = "polaris.node.http-path-prefix" flagWriteTimeout = "polaris.node.http-timeouts.write-timeout" flagReadHeaderTimeout = "polaris.node.http-timeouts.read-header-timeout" flagHTTPModules = "polaris.node.http-modules" - flagRPCGasCap = "polaris.polar.rpc-gas-cap" flagWsOrigins = "polaris.node.ws-origins" flagDefault = "polaris.node.http-timeouts.default" flagMaxPrice = "polaris.node.http-timeouts.max-price" flagIgnorePrice = "polaris.node.http-timeouts.ignore-price" + flagLocals = "polaris.polar.legacy-tx-pool.locals" + flagNoLocals = "polaris.polar.legacy-tx-pool.no-locals" + flagJournal = "polaris.polar.legacy-tx-pool.journal" + flagReJournal = "polaris.polar.legacy-tx-pool.rejournal" + flagPriceLimit = "polaris.polar.legacy-tx-pool.price-limit" + flagPriceBump = "polaris.polar.legacy-tx-pool.price-bump" + flagAccountSlots = "polaris.polar.legacy-tx-pool.account-slots" + flagGlobalSlots = "polaris.polar.legacy-tx-pool.global-slots" + flagAccountQueue = "polaris.polar.legacy-tx-pool.account-queue" + flagGlobalQueue = "polaris.polar.legacy-tx-pool.global-queue" + flagLifetime = "polaris.polar.legacy-tx-pool.lifetime" + + // ethereum. + flagChainID = "polaris.polar.chain.chain-id" + flagHomesteadBlock = "polaris.polar.chain.homestead-block" + flagDAOForkBlock = "polaris.polar.chain.dao-fork-block" + flagDAOForkSupport = "polaris.polar.chain.dao-fork-support" + flagEIP150Block = "polaris.polar.chain.eip150-block" + flagEIP155Block = "polaris.polar.chain.eip155-block" + flagEIP158Block = "polaris.polar.chain.eip158-block" + flagByzantiumBlock = "polaris.polar.chain.byzantium-block" + flagConstantinopleBlock = "polaris.polar.chain.constantinople-block" + flagPetersburgBlock = "polaris.polar.chain.petersburg-block" + flagIstanbulBlock = "polaris.polar.chain.istanbul-block" + flagMuirGlacierBlock = "polaris.polar.chain.muir-glacier-block" + flagBerlinBlock = "polaris.polar.chain.berlin-block" + flagLondonBlock = "polaris.polar.chain.london-block" + flagArrowGlacierBlock = "polaris.polar.chain.arrow-glacier-block" + flagGrayGlacierBlock = "polaris.polar.chain.gray-glacier-block" + flagMergeNetsplitBlock = "polaris.polar.chain.merge-netsplit-block" + flagShanghaiTime = "polaris.polar.chain.shanghai-time" + flagCancunTime = "polaris.polar.chain.cancun-time" + flagPragueTime = "polaris.polar.chain.prague-time" + flagVerkleTime = "polaris.polar.chain.verkle-time" + flagTerminalTotalDifficulty = "polaris.polar.chain.terminal-total-difficulty" + flagTerminalTotalDifficultyPassed = "polaris.polar.chain.terminal-total-difficulty-passed" + flagIsDevMode = "polaris.polar.chain.is-dev-mode" ) diff --git a/cosmos/config/template.go b/cosmos/config/template.go index 3703ddd5ad..0c3bccd133 100644 --- a/cosmos/config/template.go +++ b/cosmos/config/template.go @@ -40,19 +40,92 @@ rpc-evm-timeout = "{{ .Polaris.Polar.RPCEVMTimeout }}" rpc-tx-fee-cap = "{{ .Polaris.Polar.RPCTxFeeCap }}" +[polaris.polar.chain] +chain-id = "{{ .Polaris.Polar.Chain.ChainID }}" + +# Homestead switch block +homestead-block = "{{ .Polaris.Polar.Chain.HomesteadBlock }}" + +# DAO fork switch block +dao-fork-block = "{{ .Polaris.Polar.Chain.DAOForkBlock }}" + +# Whether to support DAO fork +dao-fork-support = {{ .Polaris.Polar.Chain.DAOForkSupport }} + +# EIP150 switch block +eip150-block = "{{ .Polaris.Polar.Chain.EIP150Block }}" + +# EIP155 switch block +eip155-block = "{{ .Polaris.Polar.Chain.EIP155Block }}" + +# EIP158 switch block +eip158-block = "{{ .Polaris.Polar.Chain.EIP158Block }}" + +# Byzanitum switch block +byzantium-block = "{{ .Polaris.Polar.Chain.ByzantiumBlock }}" + +# Constantinople switch block +constantinople-block = "{{ .Polaris.Polar.Chain.ConstantinopleBlock }}" + +# Petersburg switch block +petersburg-block = "{{ .Polaris.Polar.Chain.PetersburgBlock }}" + +# Istanbul switch block +istanbul-block = "{{ .Polaris.Polar.Chain.IstanbulBlock }}" + +# Muir Glacier switch block +muir-glacier-block = "{{ .Polaris.Polar.Chain.MuirGlacierBlock }}" + +# Berlin switch block +berlin-block = "{{ .Polaris.Polar.Chain.BerlinBlock }}" + +# London switch block +london-block = "{{ .Polaris.Polar.Chain.LondonBlock }}" + +# Arrow Glacier switch block +arrow-glacier-block = "{{ .Polaris.Polar.Chain.ArrowGlacierBlock }}" + +# Gray Glacier switch block +gray-glacier-block = "{{ .Polaris.Polar.Chain.GrayGlacierBlock }}" + +# Merge Netsplit switch block +merge-netsplit-block = "{{ .Polaris.Polar.Chain.MergeNetsplitBlock }}" + +# Shanghai switch time (nil == no fork, 0 = already on shanghai) +shanghai-time = "{{ .Polaris.Polar.Chain.ShanghaiTime }}" + +# Cancun switch time (nil == no fork, 0 = already on cancun) +cancun-time = "{{ .Polaris.Polar.Chain.CancunTime }}" + +# Prague switch time (nil == no fork, 0 = already on prague) +prague-time = "{{ .Polaris.Polar.Chain.PragueTime }}" + +# Verkle switch time (nil == no fork, 0 = already on verkle) +verkle-time = "{{ .Polaris.Polar.Chain.VerkleTime }}" + +# Terminal total difficulty +terminal-total-difficulty = "{{ .Polaris.Polar.Chain.TerminalTotalDifficulty }}" + +# Whether terminal total difficulty has passed +terminal-total-difficulty-passed = "{{ .Polaris.Polar.Chain.TerminalTotalDifficultyPassed }}" + +# DevMode enabled +is-dev-mode = {{ .Polaris.Polar.Chain.IsDevMode }} + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices -blocks = {{ .Polaris.Polar.GPO.Blocks }} +blocks = "{{ .Polaris.Polar.GPO.Blocks }}" # Percentile of gas price to use -percentile = {{ .Polaris.Polar.GPO.Percentile }} +percentile = "{{ .Polaris.Polar.GPO.Percentile }}" # Maximum header history for gas price determination -max-header-history = {{ .Polaris.Polar.GPO.MaxHeaderHistory }} +max-header-history = "{{ .Polaris.Polar.GPO.MaxHeaderHistory }}" # Maximum block history for gas price determination -max-block-history = {{ .Polaris.Polar.GPO.MaxBlockHistory }} +max-block-history = "{{ .Polaris.Polar.GPO.MaxBlockHistory }}" # Default gas price value default = "{{ .Polaris.Polar.GPO.Default }}" @@ -63,6 +136,42 @@ max-price = "{{ .Polaris.Polar.GPO.MaxPrice }}" # Prices to ignore for gas price determination ignore-price = "{{ .Polaris.Polar.GPO.IgnorePrice }}" +# LegacyTxPool settings +[polaris.polar.legacy-tx-pool] + +# Addresses that should be treated by default as local +locals = {{ .Polaris.Polar.LegacyTxPool.Locals }} + +# Whether local transaction handling should be disabled +no-locals = {{ .Polaris.Polar.LegacyTxPool.NoLocals }} + +# Journal of local transactions to survive node restarts +journal = "{{ .Polaris.Polar.LegacyTxPool.Journal }}" + +# Time interval to regenerate the local transaction journal +rejournal = "{{ .Polaris.Polar.LegacyTxPool.Rejournal }}" + +# Minimum gas price to enforce for acceptance into the pool +price-limit = "{{ .Polaris.Polar.LegacyTxPool.PriceLimit }}" + +# Minimum price bump percentage to replace an already existing transaction (nonce) +price-bump = "{{ .Polaris.Polar.LegacyTxPool.PriceBump }}" + +# Number of executable transaction slots guaranteed per account +account-slots = "{{ .Polaris.Polar.LegacyTxPool.AccountSlots }}" + +# Maximum number of executable transaction slots for all accounts +account-queue = "{{.Polaris.Polar.LegacyTxPool.AccountQueue }}" + +# Maximum number of non-executable transaction slots permitted per account +global-slots = "{{ .Polaris.Polar.LegacyTxPool.GlobalSlots }}" + +# Maximum number of non-executable transaction slots for all accounts +global-queue = "{{ .Polaris.Polar.LegacyTxPool.GlobalQueue }}" + +# Maximum amount of time non-executable transaction are queued +lifetime = "{{ .Polaris.Polar.LegacyTxPool.Lifetime }}" + # Node-specific settings [polaris.node] diff --git a/cosmos/x/evm/plugins/txpool/interfaces.go b/cosmos/cosmos.go similarity index 92% rename from cosmos/x/evm/plugins/txpool/interfaces.go rename to cosmos/cosmos.go index b35ebc9890..ac123cf2e3 100644 --- a/cosmos/x/evm/plugins/txpool/interfaces.go +++ b/cosmos/cosmos.go @@ -18,8 +18,4 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package txpool - -type ConfigurationPlugin interface { - GetEvmDenom() string -} +package cosmos diff --git a/cosmos/crypto/hd/algo.go b/cosmos/crypto/hd/algo.go index ee6545777f..52f3cd66bb 100644 --- a/cosmos/crypto/hd/algo.go +++ b/cosmos/crypto/hd/algo.go @@ -40,7 +40,8 @@ var ( EthSecp256k1 = ethSecp256k1Algo{} ) -// ethSecp256k1Algo implements the `keyring.SignatureAlgo` interface for the eth_secp256k1 algorithm. +// ethSecp256k1Algo implements the `keyring.SignatureAlgo` interface for the +// eth_secp256k1 algorithm. type ethSecp256k1Algo struct{} // Name returns eth_secp256k1. @@ -48,7 +49,8 @@ func (s ethSecp256k1Algo) Name() hd.PubKeyType { return EthSecp256k1Type } -// Derive derives and returns the eth_secp256k1 private key for the given mnemonic and HD path. +// Derive derives and returns the eth_secp256k1 private key for the given mnemonic +// and HD path. func (s ethSecp256k1Algo) Derive() hd.DeriveFn { return hd.Secp256k1.Derive() } diff --git a/cosmos/crypto/keys/ethsecp256k1/keys.go b/cosmos/crypto/keys/ethsecp256k1/keys.go index 1536a82c4c..bba2d8e5b3 100644 --- a/cosmos/crypto/keys/ethsecp256k1/keys.go +++ b/cosmos/crypto/keys/ethsecp256k1/keys.go @@ -41,9 +41,9 @@ const ( KeyType = "eth_secp256k1" ) -// ===================================================================================================== +// =============================================================================================== // Private Key -// ==================================================================================================== +// =============================================================================================== // PrivKey is a wrapper around the Ethereum secp256k1 private key type. This wrapper conforms to // crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 private key type within the Cosmos SDK. @@ -97,12 +97,13 @@ func (privKey PrivKey) ToECDSA() (*ecdsa.PrivateKey, error) { return crypto.ToECDSA(privKey.Bytes()) } -// ===================================================================================================== +// =============================================================================================== // Public Key -// ==================================================================================================== +// =============================================================================================== // Pubkey is a wrapper around the Ethereum secp256k1 public key type. This wrapper conforms to -// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 public key type within the Cosmos SDK. +// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 public key type within the +// Cosmos SDK. // Compile-time type assertion. var _ cryptotypes.PubKey = &PubKey{} diff --git a/cosmos/go.mod b/cosmos/go.mod index b173dbbbaa..c77ac22a72 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) @@ -45,9 +45,9 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect google.golang.org/grpc v1.58.1 google.golang.org/protobuf v1.31.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 - pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 - pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6 + pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 ) require ( diff --git a/cosmos/go.sum b/cosmos/go.sum index d1817da288..4ef2424eed 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -113,8 +113,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -1492,12 +1492,12 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 h1:U5wpPv/ZitKJCZkHWVsWOzAfX3orlnHHhn5rYGJ1DPA= -pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= -pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 h1:0dIN2V+giVZmUOPvDyOxnXfTgZIoBOqjZTpXn704edY= -pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6/go.mod h1:XDIlhb6eOL2Rq81b0OPzke5IFQyqgbD7f60NRomcmXc= -pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6 h1:ZvjvAvaPEZr+Og4GABn1AGM7RPD6lIW12j3qouVDFvI= -pkg.berachain.dev/polaris/lib v0.0.0-20230925142347-326426fa61f6/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index 4c97fc7e01..e2bc16420a 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -21,6 +21,7 @@ package txpool import ( + "errors" "sync/atomic" "cosmossdk.io/log" @@ -53,8 +54,8 @@ type TxSerializer interface { SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) } -// Broadcaster provides an interface to broadcast TxBytes to the comet p2p layer. -type Broadcaster interface { +// TxBroadcaster provides an interface to broadcast TxBytes to the comet p2p layer. +type TxBroadcaster interface { BroadcastTxSync(txBytes []byte) (res *sdk.TxResponse, err error) } @@ -65,9 +66,7 @@ type Subscription interface { // Handler exposes a basic interface to utilize the Handler. type Handler interface { - Start() - Running() bool - Stop() + Lifecycle } // handler listens for new insertions into the geth txpool and broadcasts them to the CometBFT @@ -75,7 +74,7 @@ type Handler interface { type handler struct { // Cosmos logger log.Logger - clientCtx Broadcaster + clientCtx TxBroadcaster serializer TxSerializer // Ethereum @@ -88,14 +87,14 @@ type handler struct { // NewHandler creates a new Handler. func NewHandler( - clientCtx Broadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, + clientCtx TxBroadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, ) Handler { return newHandler(clientCtx, txPool, serializer, logger) } // newHandler creates a new handler. func newHandler( - clientCtx Broadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, + clientCtx TxBroadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, ) *handler { h := &handler{ logger: logger, @@ -109,14 +108,28 @@ func newHandler( } // Start starts the handler. -func (h *handler) Start() { +func (h *handler) Start() error { + if h.running.Load() { + return errors.New("handler already started") + } go h.eventLoop() + return nil +} + +// Stop stops the handler. +func (h *handler) Stop() error { + if !h.Running() { + return errors.New("handler already stopped") + } + h.stopCh <- struct{}{} + return nil } // start handles the subscription to the txpool and broadcasts transactions. func (h *handler) eventLoop() { // Connect to the subscription. h.txsSub = h.txPool.SubscribeNewTxsEvent(h.txsCh) + h.logger.With("module", "txpool-handler").Info("starting txpool handler") h.running.Store(true) // Handle events. @@ -139,15 +152,6 @@ func (h *handler) Running() bool { return h.running.Load() } -// Stop stops the handler. -func (h *handler) Stop() { - if h.Running() { - h.stopCh <- struct{}{} - } else { - panic("stopping already stopped handler") - } -} - // stop stops the handler. func (h *handler) stop(err error) { // Mark as not running to prevent further events. diff --git a/cosmos/txpool/handler_test.go b/cosmos/txpool/handler_test.go index 62873ea945..b981cb3337 100644 --- a/cosmos/txpool/handler_test.go +++ b/cosmos/txpool/handler_test.go @@ -47,19 +47,20 @@ var _ = Describe("", func() { var subscription *mocks.Subscription var serializer *mocks.TxSerializer - var broadcaster *mocks.Broadcaster + var broadcaster *mocks.TxBroadcaster var subprovider *mocks.TxSubProvider BeforeEach(func() { subscription = mocks.NewSubscription(t) subscription.On("Err").Return(nil) subscription.On("Unsubscribe").Return() - broadcaster = mocks.NewBroadcaster(t) + broadcaster = mocks.NewTxBroadcaster(t) subprovider = mocks.NewTxSubProvider(t) subprovider.On("SubscribeNewTxsEvent", mock.Anything).Return(subscription) serializer = mocks.NewTxSerializer(t) h = newHandler(broadcaster, subprovider, serializer, log.NewTestLogger(t)) - h.Start() + err := h.Start() + Expect(err).NotTo(HaveOccurred()) for !h.Running() { // Wait for handler to start. time.Sleep(50 * time.Millisecond) @@ -68,7 +69,8 @@ var _ = Describe("", func() { }) AfterEach(func() { - h.Stop() + err := h.Stop() + Expect(err).NotTo(HaveOccurred()) for h.Running() { // Wait for handler to start. time.Sleep(50 * time.Millisecond) diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index a4d055030e..df4e4dbab0 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -24,21 +24,37 @@ import ( "context" "errors" + "cosmossdk.io/log" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/mempool" + "github.com/ethereum/go-ethereum/core/txpool/legacypool" + "github.com/ethereum/go-ethereum/event" + "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/lib/utils" ) -// Mempool implements the mempool.Mempool interface. -var _ mempool.Mempool = (*Mempool)(nil) +// Mempool implements the mempool.Mempool & Lifecycle interfaces. +var ( + _ mempool.Mempool = (*Mempool)(nil) + _ Lifecycle = (*Mempool)(nil) +) // GethTxPool represents the interface to interact with the geth txpool. type GethTxPool interface { Add([]*coretypes.Transaction, bool, bool) []error Stats() (int, int) + SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription +} + +// Lifecycle represents a lifecycle object. +type Lifecycle interface { + Start() error + Stop() error } // Mempool is a mempool that adheres to the cosmos mempool interface. @@ -46,19 +62,40 @@ type GethTxPool interface { // is to allow for transactions coming in from CometBFT's gossip to be added to the underlying // geth txpool during `CheckTx`, that is the only purpose of `Mempool“. type Mempool struct { - txpool GethTxPool + txpool GethTxPool + handler Lifecycle } // NewMempool creates a new Mempool. -func NewMempool(txpool GethTxPool) *Mempool { +func New(txpool GethTxPool) *Mempool { return &Mempool{ txpool: txpool, } } +// Init intializes the Mempool (notably the TxHandler). +func (m *Mempool) Init( + logger log.Logger, + txBroadcaster TxBroadcaster, + txSerializer TxSerializer, +) { + m.handler = newHandler(txBroadcaster, m.txpool, txSerializer, logger) +} + +// Start starts the Mempool TxHandler. +func (m *Mempool) Start() error { + return m.handler.Start() +} + +// Stop stops the Mempool TxHandler. +func (m *Mempool) Stop() error { + return m.handler.Stop() +} + // Insert attempts to insert a Tx into the app-side mempool returning // an error upon failure. -func (m *Mempool) Insert(_ context.Context, sdkTx sdk.Tx) error { +func (m *Mempool) Insert(ctx context.Context, sdkTx sdk.Tx) error { + sCtx := sdk.UnwrapSDKContext(ctx) msgs := sdkTx.GetMsgs() if len(msgs) != 1 { return errors.New("only one message is supported") @@ -67,6 +104,10 @@ func (m *Mempool) Insert(_ context.Context, sdkTx sdk.Tx) error { if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); !ok { return errors.New("only WrappedEthereumTransactions are supported") } else if errs := m.txpool.Add([]*coretypes.Transaction{wet.AsTransaction()}, false, false); len(errs) != 0 { + // Handle case where a node broadcasts to itself, we don't want it to fail CheckTx. + if errors.Is(errs[0], legacypool.ErrAlreadyKnown) && sCtx.IsCheckTx() { + return nil + } return errs[0] } diff --git a/cosmos/txpool/mempool_test.go b/cosmos/txpool/mempool_test.go index ac99e3ca1e..5bc1357d6f 100644 --- a/cosmos/txpool/mempool_test.go +++ b/cosmos/txpool/mempool_test.go @@ -21,7 +21,6 @@ package txpool import ( - "context" "errors" "github.com/stretchr/testify/mock" @@ -43,7 +42,7 @@ var _ = Describe("", func() { txPool *mocks.GethTxPool sdkTx *mocks.SdkTx mempool *Mempool - ctx = context.Background() + ctx = sdk.Context{}.WithIsCheckTx(true) ) BeforeEach(func() { diff --git a/cosmos/txpool/mocks/broadcaster.go b/cosmos/txpool/mocks/broadcaster.go deleted file mode 100644 index 58a9870e0b..0000000000 --- a/cosmos/txpool/mocks/broadcaster.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. - -package mocks - -import ( - mock "github.com/stretchr/testify/mock" - - types "github.com/cosmos/cosmos-sdk/types" -) - -// Broadcaster is an autogenerated mock type for the Broadcaster type -type Broadcaster struct { - mock.Mock -} - -type Broadcaster_Expecter struct { - mock *mock.Mock -} - -func (_m *Broadcaster) EXPECT() *Broadcaster_Expecter { - return &Broadcaster_Expecter{mock: &_m.Mock} -} - -// BroadcastTxSync provides a mock function with given fields: txBytes -func (_m *Broadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, error) { - ret := _m.Called(txBytes) - - var r0 *types.TxResponse - var r1 error - if rf, ok := ret.Get(0).(func([]byte) (*types.TxResponse, error)); ok { - return rf(txBytes) - } - if rf, ok := ret.Get(0).(func([]byte) *types.TxResponse); ok { - r0 = rf(txBytes) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.TxResponse) - } - } - - if rf, ok := ret.Get(1).(func([]byte) error); ok { - r1 = rf(txBytes) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// Broadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync' -type Broadcaster_BroadcastTxSync_Call struct { - *mock.Call -} - -// BroadcastTxSync is a helper method to define mock.On call -// - txBytes []byte -func (_e *Broadcaster_Expecter) BroadcastTxSync(txBytes interface{}) *Broadcaster_BroadcastTxSync_Call { - return &Broadcaster_BroadcastTxSync_Call{Call: _e.mock.On("BroadcastTxSync", txBytes)} -} - -func (_c *Broadcaster_BroadcastTxSync_Call) Run(run func(txBytes []byte)) *Broadcaster_BroadcastTxSync_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].([]byte)) - }) - return _c -} - -func (_c *Broadcaster_BroadcastTxSync_Call) Return(res *types.TxResponse, err error) *Broadcaster_BroadcastTxSync_Call { - _c.Call.Return(res, err) - return _c -} - -func (_c *Broadcaster_BroadcastTxSync_Call) RunAndReturn(run func([]byte) (*types.TxResponse, error)) *Broadcaster_BroadcastTxSync_Call { - _c.Call.Return(run) - return _c -} - -// NewBroadcaster creates a new instance of Broadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewBroadcaster(t interface { - mock.TestingT - Cleanup(func()) -}) *Broadcaster { - mock := &Broadcaster{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index d34f394acd..9d48e04a90 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -3,6 +3,9 @@ package mocks import ( + core "github.com/ethereum/go-ethereum/core" + event "github.com/ethereum/go-ethereum/event" + mock "github.com/stretchr/testify/mock" types "github.com/ethereum/go-ethereum/core/types" @@ -118,6 +121,50 @@ func (_c *GethTxPool_Stats_Call) RunAndReturn(run func() (int, int)) *GethTxPool return _c } +// SubscribeNewTxsEvent provides a mock function with given fields: _a0 +func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Subscription { + ret := _m.Called(_a0) + + var r0 event.Subscription + if rf, ok := ret.Get(0).(func(chan<- core.NewTxsEvent) event.Subscription); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + return r0 +} + +// GethTxPool_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent' +type GethTxPool_SubscribeNewTxsEvent_Call struct { + *mock.Call +} + +// SubscribeNewTxsEvent is a helper method to define mock.On call +// - _a0 chan<- core.NewTxsEvent +func (_e *GethTxPool_Expecter) SubscribeNewTxsEvent(_a0 interface{}) *GethTxPool_SubscribeNewTxsEvent_Call { + return &GethTxPool_SubscribeNewTxsEvent_Call{Call: _e.mock.On("SubscribeNewTxsEvent", _a0)} +} + +func (_c *GethTxPool_SubscribeNewTxsEvent_Call) Run(run func(_a0 chan<- core.NewTxsEvent)) *GethTxPool_SubscribeNewTxsEvent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(chan<- core.NewTxsEvent)) + }) + return _c +} + +func (_c *GethTxPool_SubscribeNewTxsEvent_Call) Return(_a0 event.Subscription) *GethTxPool_SubscribeNewTxsEvent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GethTxPool_SubscribeNewTxsEvent_Call) RunAndReturn(run func(chan<- core.NewTxsEvent) event.Subscription) *GethTxPool_SubscribeNewTxsEvent_Call { + _c.Call.Return(run) + return _c +} + // NewGethTxPool creates a new instance of GethTxPool. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewGethTxPool(t interface { diff --git a/cosmos/txpool/mocks/handler.go b/cosmos/txpool/mocks/handler.go index db6aeadf76..353c80bf9b 100644 --- a/cosmos/txpool/mocks/handler.go +++ b/cosmos/txpool/mocks/handler.go @@ -17,52 +17,20 @@ func (_m *Handler) EXPECT() *Handler_Expecter { return &Handler_Expecter{mock: &_m.Mock} } -// Running provides a mock function with given fields: -func (_m *Handler) Running() bool { +// Start provides a mock function with given fields: +func (_m *Handler) Start() error { ret := _m.Called() - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() } else { - r0 = ret.Get(0).(bool) + r0 = ret.Error(0) } return r0 } -// Handler_Running_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Running' -type Handler_Running_Call struct { - *mock.Call -} - -// Running is a helper method to define mock.On call -func (_e *Handler_Expecter) Running() *Handler_Running_Call { - return &Handler_Running_Call{Call: _e.mock.On("Running")} -} - -func (_c *Handler_Running_Call) Run(run func()) *Handler_Running_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Handler_Running_Call) Return(_a0 bool) *Handler_Running_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *Handler_Running_Call) RunAndReturn(run func() bool) *Handler_Running_Call { - _c.Call.Return(run) - return _c -} - -// Start provides a mock function with given fields: -func (_m *Handler) Start() { - _m.Called() -} - // Handler_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' type Handler_Start_Call struct { *mock.Call @@ -80,19 +48,28 @@ func (_c *Handler_Start_Call) Run(run func()) *Handler_Start_Call { return _c } -func (_c *Handler_Start_Call) Return() *Handler_Start_Call { - _c.Call.Return() +func (_c *Handler_Start_Call) Return(_a0 error) *Handler_Start_Call { + _c.Call.Return(_a0) return _c } -func (_c *Handler_Start_Call) RunAndReturn(run func()) *Handler_Start_Call { +func (_c *Handler_Start_Call) RunAndReturn(run func() error) *Handler_Start_Call { _c.Call.Return(run) return _c } // Stop provides a mock function with given fields: -func (_m *Handler) Stop() { - _m.Called() +func (_m *Handler) Stop() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 } // Handler_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' @@ -112,12 +89,12 @@ func (_c *Handler_Stop_Call) Run(run func()) *Handler_Stop_Call { return _c } -func (_c *Handler_Stop_Call) Return() *Handler_Stop_Call { - _c.Call.Return() +func (_c *Handler_Stop_Call) Return(_a0 error) *Handler_Stop_Call { + _c.Call.Return(_a0) return _c } -func (_c *Handler_Stop_Call) RunAndReturn(run func()) *Handler_Stop_Call { +func (_c *Handler_Stop_Call) RunAndReturn(run func() error) *Handler_Stop_Call { _c.Call.Return(run) return _c } diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go new file mode 100644 index 0000000000..0217249b3a --- /dev/null +++ b/cosmos/txpool/mocks/lifecycle.go @@ -0,0 +1,114 @@ +// Code generated by mockery v2.34.2. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Lifecycle is an autogenerated mock type for the Lifecycle type +type Lifecycle struct { + mock.Mock +} + +type Lifecycle_Expecter struct { + mock *mock.Mock +} + +func (_m *Lifecycle) EXPECT() *Lifecycle_Expecter { + return &Lifecycle_Expecter{mock: &_m.Mock} +} + +// Start provides a mock function with given fields: +func (_m *Lifecycle) Start() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Lifecycle_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type Lifecycle_Start_Call struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +func (_e *Lifecycle_Expecter) Start() *Lifecycle_Start_Call { + return &Lifecycle_Start_Call{Call: _e.mock.On("Start")} +} + +func (_c *Lifecycle_Start_Call) Run(run func()) *Lifecycle_Start_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Lifecycle_Start_Call) Return(_a0 error) *Lifecycle_Start_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Lifecycle_Start_Call) RunAndReturn(run func() error) *Lifecycle_Start_Call { + _c.Call.Return(run) + return _c +} + +// Stop provides a mock function with given fields: +func (_m *Lifecycle) Stop() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Lifecycle_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +type Lifecycle_Stop_Call struct { + *mock.Call +} + +// Stop is a helper method to define mock.On call +func (_e *Lifecycle_Expecter) Stop() *Lifecycle_Stop_Call { + return &Lifecycle_Stop_Call{Call: _e.mock.On("Stop")} +} + +func (_c *Lifecycle_Stop_Call) Run(run func()) *Lifecycle_Stop_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Lifecycle_Stop_Call) Return(_a0 error) *Lifecycle_Stop_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Lifecycle_Stop_Call) RunAndReturn(run func() error) *Lifecycle_Stop_Call { + _c.Call.Return(run) + return _c +} + +// NewLifecycle creates a new instance of Lifecycle. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLifecycle(t interface { + mock.TestingT + Cleanup(func()) +}) *Lifecycle { + mock := &Lifecycle{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go new file mode 100644 index 0000000000..e42759b1d0 --- /dev/null +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -0,0 +1,90 @@ +// Code generated by mockery v2.34.2. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" +) + +// TxBroadcaster is an autogenerated mock type for the TxBroadcaster type +type TxBroadcaster struct { + mock.Mock +} + +type TxBroadcaster_Expecter struct { + mock *mock.Mock +} + +func (_m *TxBroadcaster) EXPECT() *TxBroadcaster_Expecter { + return &TxBroadcaster_Expecter{mock: &_m.Mock} +} + +// BroadcastTxSync provides a mock function with given fields: txBytes +func (_m *TxBroadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, error) { + ret := _m.Called(txBytes) + + var r0 *types.TxResponse + var r1 error + if rf, ok := ret.Get(0).(func([]byte) (*types.TxResponse, error)); ok { + return rf(txBytes) + } + if rf, ok := ret.Get(0).(func([]byte) *types.TxResponse); ok { + r0 = rf(txBytes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.TxResponse) + } + } + + if rf, ok := ret.Get(1).(func([]byte) error); ok { + r1 = rf(txBytes) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBroadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync' +type TxBroadcaster_BroadcastTxSync_Call struct { + *mock.Call +} + +// BroadcastTxSync is a helper method to define mock.On call +// - txBytes []byte +func (_e *TxBroadcaster_Expecter) BroadcastTxSync(txBytes interface{}) *TxBroadcaster_BroadcastTxSync_Call { + return &TxBroadcaster_BroadcastTxSync_Call{Call: _e.mock.On("BroadcastTxSync", txBytes)} +} + +func (_c *TxBroadcaster_BroadcastTxSync_Call) Run(run func(txBytes []byte)) *TxBroadcaster_BroadcastTxSync_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]byte)) + }) + return _c +} + +func (_c *TxBroadcaster_BroadcastTxSync_Call) Return(res *types.TxResponse, err error) *TxBroadcaster_BroadcastTxSync_Call { + _c.Call.Return(res, err) + return _c +} + +func (_c *TxBroadcaster_BroadcastTxSync_Call) RunAndReturn(run func([]byte) (*types.TxResponse, error)) *TxBroadcaster_BroadcastTxSync_Call { + _c.Call.Return(run) + return _c +} + +// NewTxBroadcaster creates a new instance of TxBroadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxBroadcaster(t interface { + mock.TestingT + Cleanup(func()) +}) *TxBroadcaster { + mock := &TxBroadcaster{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/types/config.go b/cosmos/types/config.go index ed3b7b6070..fd304d2eb9 100644 --- a/cosmos/types/config.go +++ b/cosmos/types/config.go @@ -38,16 +38,19 @@ const ( // Bech32PrefixValAddr defines the Bech32 prefix of a validator's operator address. Bech32PrefixValAddr = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixOperator // Bech32PrefixValPub defines the Bech32 prefix of a validator's operator public key. - Bech32PrefixValPub = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixOperator + sdk.PrefixPublic + Bech32PrefixValPub = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixOperator + + sdk.PrefixPublic // Bech32PrefixConsAddr defines the Bech32 prefix of a consensus node address. Bech32PrefixConsAddr = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixConsensus // Bech32PrefixConsPub defines the Bech32 prefix of a consensus node public key. - Bech32PrefixConsPub = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixConsensus + sdk.PrefixPublic + Bech32PrefixConsPub = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixConsensus + + sdk.PrefixPublic ) var initConfig sync.Once -// SetupCosmosConfig sets up the Cosmos SDK configuration to be compatible with the semantics of etheruem. +// SetupCosmosConfig sets up the Cosmos SDK configuration to be compatible with the +// semantics of etheruem. func SetupCosmosConfig() { initConfig.Do(func() { // set the address prefixes @@ -58,7 +61,8 @@ func SetupCosmosConfig() { }) } -// SetBech32Prefixes sets the global prefixes to be used when serializing addresses and public keys to Bech32 strings. +// SetBech32Prefixes sets the global prefixes to be used when serializing addresses and +// public keys to Bech32 strings. func SetBech32Prefixes(config *sdk.Config) { config.SetBech32PrefixForAccount(Bech32PrefixAccAddr, Bech32PrefixAccPub) config.SetBech32PrefixForValidator(Bech32PrefixValAddr, Bech32PrefixValPub) diff --git a/cosmos/x/evm/depinject.go b/cosmos/x/evm/depinject.go index 8a74c6d683..7f9da636b4 100644 --- a/cosmos/x/evm/depinject.go +++ b/cosmos/x/evm/depinject.go @@ -23,11 +23,14 @@ package evm import ( "cosmossdk.io/core/appmodule" "cosmossdk.io/depinject" + "cosmossdk.io/log" store "cosmossdk.io/store/types" - sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" modulev1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/module/v1alpha1" + "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" ) @@ -47,8 +50,11 @@ type DepInjectInput struct { Config *modulev1alpha1.Module Key *store.KVStoreKey - Mempool sdkmempool.Mempool + AppOpts servertypes.AppOptions + Logger log.Logger + PolarisCfg func() *config.Config CustomPrecompiles func() *ethprecompile.Injector `optional:"true"` + QueryContextFn func() func(height int64, prove bool) (sdk.Context, error) AccountKeeper AccountKeeper StakingKeeper StakingKeeper @@ -73,10 +79,11 @@ func ProvideModule(in DepInjectInput) DepInjectOutput { in.AccountKeeper, in.StakingKeeper, in.Key, - in.Mempool, in.CustomPrecompiles, + in.QueryContextFn, + in.Logger, + in.PolarisCfg(), ) - m := NewAppModule(k, in.AccountKeeper) return DepInjectOutput{ diff --git a/cosmos/x/evm/genesis.go b/cosmos/x/evm/genesis.go index 27edf04d0d..9b1026a871 100644 --- a/cosmos/x/evm/genesis.go +++ b/cosmos/x/evm/genesis.go @@ -35,11 +35,12 @@ import ( // DefaultGenesis returns default genesis state as raw bytes for the evm // module. func (AppModuleBasic) DefaultGenesis(_ codec.JSONCodec) json.RawMessage { - ethGen, err := core.DefaultGenesis.MarshalJSON() + ethGen := core.DefaultGenesis + rawGenesis, err := ethGen.MarshalJSON() if err != nil { panic(err) } - return ethGen + return rawGenesis } // ValidateGenesis performs genesis state validation for the evm module. diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 240c6b0bb0..78a67527f4 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -24,6 +24,7 @@ import ( "bytes" "encoding/json" "fmt" + "math/big" "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" @@ -38,45 +39,49 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - evmmempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" "pkg.berachain.dev/polaris/eth/core" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" + "pkg.berachain.dev/polaris/eth/params" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) +var ( + ethGen = core.DefaultGenesis +) + var _ = Describe("", func() { var ( - cdc codec.JSONCodec - ctx sdk.Context - sc ethprecompile.StatefulImpl - ak state.AccountKeeper - sk stakingkeeper.Keeper - k *keeper.Keeper - ethGen *core.Genesis - am evm.AppModule - err error + cdc codec.JSONCodec + ctx sdk.Context + sc ethprecompile.StatefulImpl + ak state.AccountKeeper + sk stakingkeeper.Keeper + k *keeper.Keeper + am evm.AppModule + err error ) BeforeEach(func() { - ethGen = core.DefaultGenesis ctx, ak, _, sk = testutil.SetupMinimalKeepers() ctx = ctx.WithBlockHeight(0) sc = staking.NewPrecompileContract(ak, &sk) + cfg := config.DefaultConfig() + ethGen.Config = params.DefaultChainConfig + cfg.Node.DataDir = GinkgoT().TempDir() + cfg.Node.KeyStoreDir = GinkgoT().TempDir() k = keeper.NewKeeper( ak, sk, storetypes.NewKVStoreKey("evm"), - evmmempool.NewPolarisEthereumTxPool(), func() *ethprecompile.Injector { return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) }, + nil, + log.NewTestLogger(GinkgoT()), + cfg, ) - cfg := config.DefaultConfig() - cfg.Node.DataDir = GinkgoT().TempDir() - cfg.Node.KeyStoreDir = GinkgoT().TempDir() - k.Setup(cfg, nil, log.NewTestLogger(GinkgoT())) - + k.SetupPrecompiles() am = evm.NewAppModule(k, ak) }) @@ -111,17 +116,12 @@ var _ = Describe("", func() { Expect(err).ToNot(HaveOccurred()) }) It("should contain the same genesis header values", func() { - bp := k.GetHost().GetBlockPlugin() + bp := k.Polaris().Host().GetBlockPlugin() expectedHeader := ethGen.ToBlock().Header() Expect(bp.GetHeaderByNumber(0)).To(Equal(expectedHeader)) }) - It("should contain the correct chain config", func() { - actualConfig := k.GetHost().GetConfigurationPlugin().ChainConfig() - expectedConfig := ethGen.Config - Expect(actualConfig).To(Equal(expectedConfig)) - }) It("should have the correct balances", func() { - sp := k.GetHost().GetStatePlugin() + sp := k.Polaris().Host().GetStatePlugin() for addr, acc := range ethGen.Alloc { balance := sp.GetBalance(addr) cmp := balance.Cmp(acc.Balance) @@ -129,7 +129,7 @@ var _ = Describe("", func() { } }) It("should have the correct code", func() { - sp := k.GetHost().GetStatePlugin() + sp := k.Polaris().Host().GetStatePlugin() for addr, acc := range ethGen.Alloc { code := sp.GetCode(addr) cmp := bytes.Compare(code, acc.Code) @@ -137,7 +137,7 @@ var _ = Describe("", func() { } }) It("should have the correct hash", func() { - sp := k.GetHost().GetStatePlugin() + sp := k.Polaris().Host().GetStatePlugin() for addr, acc := range ethGen.Alloc { for key, expectedHash := range acc.Storage { actualHash := sp.GetState(addr, key) @@ -172,6 +172,8 @@ var _ = Describe("", func() { When("the genesis is valid", func() { It("should export without fail", func() { + ethGen.Config = nil + ethGen.BaseFee = big.NewInt(int64(params.InitialBaseFee)) Expect(actualGenesis).To(Equal(*ethGen)) }) }) diff --git a/cosmos/x/evm/keeper/abci.go b/cosmos/x/evm/keeper/abci.go index b3582cf541..eadf27e392 100644 --- a/cosmos/x/evm/keeper/abci.go +++ b/cosmos/x/evm/keeper/abci.go @@ -27,14 +27,12 @@ import ( ) func (k *Keeper) BeginBlocker(ctx context.Context) error { - sCtx := sdk.UnwrapSDKContext(ctx) // Prepare the Polaris Ethereum block. - k.lock = false - k.miner.Prepare(ctx, uint64(sCtx.BlockHeight())) + _ = k.polaris.Miner().Prepare(ctx, uint64(sdk.UnwrapSDKContext(ctx).BlockHeight())) return nil } func (k *Keeper) EndBlock(ctx context.Context) error { // Finalize the Polaris Ethereum block. - return k.miner.Finalize(ctx) + return k.polaris.Miner().Finalize(ctx) } diff --git a/cosmos/x/evm/keeper/deprecate_me_please.go b/cosmos/x/evm/keeper/deprecate_me_please.go new file mode 100644 index 0000000000..2b318c7c18 --- /dev/null +++ b/cosmos/x/evm/keeper/deprecate_me_please.go @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package keeper + +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" + "pkg.berachain.dev/polaris/eth/common" +) + +// TODO: Remove these, because they're hacky af. +// Required temporarily for BGT plugin in the Berachain repo, these REALLY +// REALLY REALLY REALLY NEED TO GO, IF YOU ARE BUILDING YOUR OWN POLARIS CHAIN +// PLEASE DO NOT USE THIS FUNCTIONS DIRECTLY. + +func (k *Keeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress) *big.Int { + ethAddr := common.BytesToAddress(addr) + return new(big.Int).SetBytes(ctx.KVStore(k.storeKey).Get(state.BalanceKeyFor(ethAddr))) +} + +func (k *Keeper) SetBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { + ethAddr := common.BytesToAddress(addr) + ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), amount.Bytes()) +} + +func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { + if amount.Sign() == 0 { + return + } + ethAddr := common.BytesToAddress(addr) + ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), new(big.Int).Add(k.GetBalance(ctx, addr), amount).Bytes()) +} + +func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { + if amount.Sign() == 0 { + return + } + ethAddr := common.BytesToAddress(addr) + ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), new(big.Int).Sub(k.GetBalance(ctx, addr), amount).Bytes()) +} diff --git a/cosmos/x/evm/keeper/genesis.go b/cosmos/x/evm/keeper/genesis.go index 6178891392..355074b2b3 100644 --- a/cosmos/x/evm/keeper/genesis.go +++ b/cosmos/x/evm/keeper/genesis.go @@ -30,6 +30,9 @@ import ( // InitGenesis is called during the InitGenesis. func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { + // TODO: Feels jank as fuck lol, but it works. + genState.Config = k.host.GetConfigurationPlugin().ChainConfig() + // Initialize all the plugins. for _, plugin := range k.host.GetAllPlugins() { // checks whether plugin implements methods of HasGenesis and executes them if it does diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index 8734b430eb..0a2eff5411 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -21,24 +21,22 @@ package keeper import ( + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool" + "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/configuration" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/gas" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/historical" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" + pclog "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" "pkg.berachain.dev/polaris/eth/core" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" - "pkg.berachain.dev/polaris/lib/utils" ) // Compile-time interface assertion. @@ -49,69 +47,67 @@ var _ core.PolarisHostChain = (*host)(nil) type Host interface { core.PolarisHostChain GetAllPlugins() []any - Setup( - storetypes.StoreKey, - storetypes.StoreKey, - state.AccountKeeper, - func(height int64, prove bool) (sdk.Context, error), - ) + SetupPrecompiles() } type host struct { // The various plugins that are are used to implement core.PolarisHostChain. - bp block.Plugin - cp configuration.Plugin - ep engine.Plugin - gp gas.Plugin - hp historical.Plugin - pp precompile.Plugin - sp state.Plugin - txp txpool.Plugin - - pcs func() *ethprecompile.Injector + bp block.Plugin + cp configuration.Plugin + ep engine.Plugin + gp gas.Plugin + hp historical.Plugin + pp precompile.Plugin + sp state.Plugin + logger log.Logger + + ak state.AccountKeeper + storeKey storetypes.StoreKey + pcs func() *ethprecompile.Injector + qc func() func(height int64, prove bool) (sdk.Context, error) } // Newhost creates new instances of the plugin host. func NewHost( + cfg config.Config, storeKey storetypes.StoreKey, + ak state.AccountKeeper, sk block.StakingKeeper, - ethTxMempool sdkmempool.Mempool, precompiles func() *ethprecompile.Injector, + qc func() func(height int64, prove bool) (sdk.Context, error), + logger log.Logger, ) Host { // We setup the host with some Cosmos standard sauce. h := &host{} // Build the Plugins h.bp = block.NewPlugin(storeKey, sk) - h.cp = configuration.NewPlugin(storeKey) + h.cp = configuration.NewPlugin(&cfg.Polar.Chain) h.ep = engine.NewPlugin() h.gp = gas.NewPlugin() - h.txp = txpool.NewPlugin(utils.MustGetAs[*mempool.EthTxPool](ethTxMempool)) h.pcs = precompiles + h.storeKey = storeKey + h.ak = ak + h.qc = qc + h.logger = logger - return h -} - -// Setup sets up the precompile and state plugins with the given precompiles and keepers. It also -// sets the query context function for the block and state plugins (to support historical queries). -func (h *host) Setup( - storeKey storetypes.StoreKey, - _ storetypes.StoreKey, - ak state.AccountKeeper, - qc func(height int64, prove bool) (sdk.Context, error), -) { // Setup the state, precompile, historical, and txpool plugins - precompiles := h.pcs().GetPrecompiles() - h.pp = precompile.NewPlugin(precompiles) - h.sp = state.NewPlugin(ak, storeKey, log.NewFactory(precompiles)) - // TODO: re-enable historical plugin using ABCI listener. - h.hp = historical.NewPlugin(h.cp, h.bp, nil, storeKey) - h.txp.SetNonceRetriever(h.sp) + h.hp = historical.NewPlugin(h.cp, h.bp, nil, h.storeKey) + h.pp = precompile.NewPlugin(nil) + h.sp = state.NewPlugin(h.ak, h.storeKey, nil) + h.bp.SetQueryContextFn(h.qc) + h.sp.SetQueryContextFn(h.qc) + + return h +} +// SetupPrecompiles intializes the precompile contracts. +func (h *host) SetupPrecompiles() { // Set the query context function for the block and state plugins - h.sp.SetQueryContextFn(qc) - h.bp.SetQueryContextFn(qc) + pcs := h.pcs().GetPrecompiles() + h.pp.SetPrecompiles(pcs) + h.sp.SetPrecompileLogFactory(pclog.NewFactory(pcs)) } // GetBlockPlugin returns the header plugin. @@ -148,12 +144,7 @@ func (h *host) GetStatePlugin() core.StatePlugin { return h.sp } -// GetTxPoolPlugin returns the txpool plugin. -func (h *host) GetTxPoolPlugin() core.TxPoolPlugin { - return h.txp -} - // GetAllPlugins returns all the plugins. func (h *host) GetAllPlugins() []any { - return []any{h.bp, h.cp, h.gp, h.hp, h.pp, h.sp, h.txp} + return []any{h.bp, h.cp, h.gp, h.hp, h.pp, h.sp} } diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index 325d402ce2..67640e22b7 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -21,43 +21,35 @@ package keeper import ( - "math/big" - "time" - "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool" + + "github.com/ethereum/go-ethereum/node" "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool" "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" ethlog "pkg.berachain.dev/polaris/eth/log" - "pkg.berachain.dev/polaris/eth/miner" "pkg.berachain.dev/polaris/eth/polar" ) +var _ Host = (*host)(nil) + type Keeper struct { - // ak is the reference to the AccountKeeper. - ak state.AccountKeeper // provider is the struct that houses the Polaris EVM. polaris *polar.Polaris - // miner is used to mine blocks - miner miner.Miner - // The (unexposed) key used to access the store from the Context. - storeKey storetypes.StoreKey - // The host contains various plugins that are are used to implement `core.PolarisHostChain`. + + // host represents the host chain host Host - // temp syncing - lock bool + // TODO: remove this, because it's hacky af. + storeKey storetypes.StoreKey } // NewKeeper creates new instances of the polaris Keeper. @@ -65,40 +57,27 @@ func NewKeeper( ak state.AccountKeeper, sk block.StakingKeeper, storeKey storetypes.StoreKey, - ethTxMempool sdkmempool.Mempool, pcs func() *ethprecompile.Injector, + qc func() func(height int64, prove bool) (sdk.Context, error), + logger log.Logger, + polarisCfg *config.Config, ) *Keeper { - // We setup the keeper with some Cosmos standard sauce. - k := &Keeper{ - ak: ak, - storeKey: storeKey, - lock: true, - } - - k.host = NewHost( + host := NewHost( + *polarisCfg, storeKey, + ak, sk, - ethTxMempool, pcs, + qc, + logger, ) - return k -} -// Setup sets up the plugins in the Host. It also build the Polaris EVM Provider. -func (k *Keeper) Setup( - cfg *config.Config, - qc func(height int64, prove bool) (sdk.Context, error), - logger log.Logger, -) { - // Setup plugins in the Host - k.host.Setup(k.storeKey, nil, k.ak, qc) - - node, err := polar.NewGethNetworkingStack(&cfg.Node) + node, err := polar.NewGethNetworkingStack(&polarisCfg.Node) if err != nil { panic(err) } - k.polaris = polar.NewWithNetworkingStack(&cfg.Polar, k.host, node, ethlog.FuncHandler( + polaris := polar.NewWithNetworkingStack(&polarisCfg.Polar, host, node, ethlog.FuncHandler( func(r *ethlog.Record) error { polarisGethLogger := logger.With("module", "polaris-geth") switch r.Lvl { //nolint:nolintlint,exhaustive // linter is bugged. @@ -113,7 +92,20 @@ func (k *Keeper) Setup( }), ) - k.miner = k.polaris.Miner() + return &Keeper{ + polaris: polaris, + host: host, + storeKey: storeKey, + } +} + +// SetupPrecompiles initializes precompiles and the polaris node. +func (k *Keeper) SetupPrecompiles() { + k.host.SetupPrecompiles() + + if err := k.polaris.Init(); err != nil { + panic(err) + } } // Logger returns a module-specific logger. @@ -121,57 +113,24 @@ func (k *Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With(types.ModuleName) } -// GetHost returns the Host that contains all plugins. -func (k *Keeper) GetHost() Host { - return k.host -} - // GetPolaris returns the Polaris instance. -func (k *Keeper) GetPolaris() *polar.Polaris { +func (k *Keeper) Polaris() *polar.Polaris { return k.polaris } -func (k *Keeper) SetClientCtx(clientContext client.Context) { - k.host.GetTxPoolPlugin().(txpool.Plugin).SetClientContext(clientContext) +// Register Services allows for the application to register lifecycles with the evm +// networking stack. +func (k *Keeper) RegisterServices(clientContext client.Context, lcs []node.Lifecycle) { + // TODO: probably get rid of engine plugin or something and handle rpc methods better. k.host.GetEnginePlugin().(engine.Plugin).Start(clientContext) - // TODO: move this - go func() { - // spin lock for a bit - for ; k.lock; time.Sleep(1 * time.Second) { - continue - } - - if err := k.polaris.StartServices(); err != nil { - panic(err) - } - }() -} - -// TODO: Remove these, because they're hacky af. -// Required temporarily for BGT plugin. -func (k *Keeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress) *big.Int { - ethAddr := common.BytesToAddress(addr) - return new(big.Int).SetBytes(ctx.KVStore(k.storeKey).Get(state.BalanceKeyFor(ethAddr))) -} - -func (k *Keeper) SetBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { - ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), amount.Bytes()) -} - -func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { - if amount.Sign() == 0 { - return + // Register the services with polaris. + for _, lc := range lcs { + k.polaris.RegisterService(lc) } - ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), new(big.Int).Add(k.GetBalance(ctx, addr), amount).Bytes()) -} -func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { - if amount.Sign() == 0 { - return + // Start the services. + if err := k.polaris.StartServices(); err != nil { + panic(err) } - ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), new(big.Int).Sub(k.GetBalance(ctx, addr), amount).Bytes()) } diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 4da3dd2de6..2e256a6e3d 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -40,7 +40,7 @@ func (k *Keeper) ProcessTransaction(ctx context.Context, tx *coretypes.Transacti "reset gas meter prior to ethereum state transition") // Process the transaction and return the EVM's execution result. - receipt, err := k.miner.ProcessTransaction(ctx, tx) + receipt, err := k.polaris.Miner().ProcessTransaction(ctx, tx) if err != nil { k.Logger(sCtx).Error("failed to process transaction", "err", err) return nil, err diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index a4b36d2f64..3b46bca2e9 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -38,9 +38,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/precompile/staking" testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - evmmempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" "pkg.berachain.dev/polaris/eth/accounts/abi" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" @@ -48,7 +46,6 @@ import ( coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/crypto" "pkg.berachain.dev/polaris/eth/params" - "pkg.berachain.dev/polaris/lib/utils" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -88,30 +85,29 @@ var _ = Describe("Processor", func() { // before chain, init genesis state ctx, ak, _, sk = testutil.SetupMinimalKeepers() + cfg := config.DefaultConfig() + cfg.Node.DataDir = GinkgoT().TempDir() + cfg.Node.KeyStoreDir = GinkgoT().TempDir() + sc = staking.NewPrecompileContract(ak, &sk) k = keeper.NewKeeper( ak, sk, storetypes.NewKVStoreKey("evm"), - evmmempool.NewPolarisEthereumTxPool(), func() *ethprecompile.Injector { return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) }, + nil, + log.NewTestLogger(GinkgoT()), + cfg, ) + k.SetupPrecompiles() ctx = ctx.WithBlockHeight(0) - for _, plugin := range k.GetHost().GetAllPlugins() { - plugin, hasInitGenesis := utils.GetAs[plugins.HasGenesis](plugin) - if hasInitGenesis { - Expect(plugin.InitGenesis(ctx, core.DefaultGenesis)).To(Succeed()) - } - } + genState := core.DefaultGenesis + Expect(k.InitGenesis(ctx, genState)).ToNot(HaveOccurred()) validator, err := NewValidator(sdk.ValAddress(valAddr), PKs[0]) Expect(err).ToNot(HaveOccurred()) validator.Status = stakingtypes.Bonded Expect(sk.SetValidator(ctx, validator)).To(Succeed()) - sc = staking.NewPrecompileContract(ak, &sk) - cfg := config.DefaultConfig() - cfg.Node.DataDir = GinkgoT().TempDir() - cfg.Node.KeyStoreDir = GinkgoT().TempDir() - k.Setup(cfg, nil, log.NewTestLogger(GinkgoT())) + _ = sk.SetParams(ctx, stakingtypes.DefaultParams()) // Set validator with consensus address. @@ -162,11 +158,11 @@ var _ = Describe("Processor", func() { tx := coretypes.MustSignNewTx(key, signer, legacyTxData) addr, err := signer.Sender(tx) Expect(err).ToNot(HaveOccurred()) - k.GetHost().GetStatePlugin().Reset(ctx) - k.GetHost().GetStatePlugin().CreateAccount(addr) - k.GetHost().GetStatePlugin().AddBalance(addr, + k.Polaris().Host().GetStatePlugin().Reset(ctx) + k.Polaris().Host().GetStatePlugin().CreateAccount(addr) + k.Polaris().Host().GetStatePlugin().AddBalance(addr, (&big.Int{}).Mul(big.NewInt(9000000000000000000), big.NewInt(999))) - k.GetHost().GetStatePlugin().Finalize() + k.Polaris().Host().GetStatePlugin().Finalize() // create the contract // Zero out the meters. diff --git a/cosmos/x/evm/plugins/block/header.go b/cosmos/x/evm/plugins/block/header.go index 0606538301..a4f72e99c5 100644 --- a/cosmos/x/evm/plugins/block/header.go +++ b/cosmos/x/evm/plugins/block/header.go @@ -42,7 +42,7 @@ const prevHeaderHashes = 256 // ===========================================================================. // SetQueryContextFn sets the query context func for the plugin. -func (p *plugin) SetQueryContextFn(gqc func(height int64, prove bool) (sdk.Context, error)) { +func (p *plugin) SetQueryContextFn(gqc func() func(height int64, prove bool) (sdk.Context, error)) { p.getQueryContext = gqc } @@ -144,7 +144,7 @@ func (p *plugin) readHeaderBytes(number uint64) ([]byte, error) { number = uint64(p.ctx.BlockHeight()) } - ctx, err := p.getQueryContext(int64(number), false) + ctx, err := p.getQueryContext()(int64(number), false) if err != nil { return nil, errorslib.Wrap(err, "GetHeader: failed to use query context") } diff --git a/cosmos/x/evm/plugins/block/header_test.go b/cosmos/x/evm/plugins/block/header_test.go index 988c66bd11..2d248894e2 100644 --- a/cosmos/x/evm/plugins/block/header_test.go +++ b/cosmos/x/evm/plugins/block/header_test.go @@ -47,7 +47,7 @@ var _ = Describe("Header", func() { _, _, _, sk := testutil.SetupMinimalKeepers() ctx = testutil.NewContext().WithBlockGasMeter(storetypes.NewGasMeter(uint64(10000))) p = utils.MustGetAs[*plugin](NewPlugin(testutil.EvmKey, sk)) - p.SetQueryContextFn(mockQueryContext) + p.SetQueryContextFn(func() func(height int64, prove bool) (sdk.Context, error) { return mockQueryContext }) p.Prepare(ctx) // on block 0 (genesis) }) diff --git a/cosmos/x/evm/plugins/block/plugin.go b/cosmos/x/evm/plugins/block/plugin.go index 7c3dc733aa..f6984ea91c 100644 --- a/cosmos/x/evm/plugins/block/plugin.go +++ b/cosmos/x/evm/plugins/block/plugin.go @@ -39,7 +39,7 @@ type Plugin interface { core.BlockPlugin // SetQueryContextFn sets the function used for querying historical block headers. - SetQueryContextFn(fn func(height int64, prove bool) (sdk.Context, error)) + SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) } type plugin struct { @@ -48,7 +48,7 @@ type plugin struct { // storekey is the store key for the header store. storekey storetypes.StoreKey // getQueryContext allows for querying block headers. - getQueryContext func(height int64, prove bool) (sdk.Context, error) + getQueryContext func() func(height int64, prove bool) (sdk.Context, error) // sk represents the cosmos staking keeper. sk StakingKeeper } diff --git a/cosmos/x/evm/plugins/configuration/configuration_test.go b/cosmos/x/evm/plugins/configuration/configuration_test.go deleted file mode 100644 index dfaeab8bc8..0000000000 --- a/cosmos/x/evm/plugins/configuration/configuration_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package configuration_test - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestConfigurationPlugin(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/configuration") -} diff --git a/cosmos/x/evm/plugins/configuration/genesis.go b/cosmos/x/evm/plugins/configuration/genesis.go deleted file mode 100644 index 81bb13abee..0000000000 --- a/cosmos/x/evm/plugins/configuration/genesis.go +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package configuration - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/eth/core" -) - -// InitGenesis performs genesis initialization for the evm module. It returns -// no validator updates. -func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { - p.Prepare(ctx) - return p.SetChainConfig(ethGen.Config) -} - -// ExportGenesis returns the exported genesis state as raw bytes for the evm -// module. -func (p *plugin) ExportGenesis(ctx sdk.Context, ethGen *core.Genesis) { - p.Prepare(ctx) - ethGen.Config = p.ChainConfig() -} diff --git a/cosmos/x/evm/plugins/configuration/plugin.go b/cosmos/x/evm/plugins/configuration/plugin.go index 71d71a62eb..5e34e8c088 100644 --- a/cosmos/x/evm/plugins/configuration/plugin.go +++ b/cosmos/x/evm/plugins/configuration/plugin.go @@ -23,37 +23,32 @@ package configuration import ( "context" - storetypes "cosmossdk.io/store/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/params" ) // Plugin is the interface that must be implemented by the plugin. type Plugin interface { - plugins.HasGenesis core.ConfigurationPlugin - SetChainConfig(*params.ChainConfig) error } // plugin implements the core.ConfigurationPlugin interface. type plugin struct { - storeKey storetypes.StoreKey - paramsStore storetypes.KVStore + chainConfig *params.ChainConfig } // NewPlugin returns a new plugin instance. -func NewPlugin(storeKey storetypes.StoreKey) Plugin { +func NewPlugin(chainConfig *params.ChainConfig) Plugin { return &plugin{ - storeKey: storeKey, + chainConfig: chainConfig, } } -// Prepare implements the core.ConfigurationPlugin interface. -func (p *plugin) Prepare(ctx context.Context) { - sCtx := sdk.UnwrapSDKContext(ctx) - p.paramsStore = sCtx.KVStore(p.storeKey) +func (p *plugin) Prepare(context.Context) { + // no-op +} + +// GetChainConfig is used to get the genesis info of the Ethereum chain. +func (p *plugin) ChainConfig() *params.ChainConfig { + return p.chainConfig } diff --git a/cosmos/x/evm/plugins/configuration/plugin_test.go b/cosmos/x/evm/plugins/configuration/plugin_test.go deleted file mode 100644 index 2aea759934..0000000000 --- a/cosmos/x/evm/plugins/configuration/plugin_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package configuration - -import ( - storetypes "cosmossdk.io/store/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Plugin", func() { - var ( - p *plugin - ctx sdk.Context - ) - - BeforeEach(func() { - ctx = testutil.NewContext() - storeKey := storetypes.NewKVStoreKey("evm") - p = &plugin{ - storeKey: storeKey, - paramsStore: ctx.KVStore(storeKey), - } - }) - - Describe("Prepare", func() { - It("should initialize the params store", func() { - p.Prepare(ctx) - // Check that the params store is initialized. - expect := ctx.KVStore(p.storeKey) - Expect(p.paramsStore).To(Equal(expect)) - }) - }) -}) diff --git a/cosmos/x/evm/plugins/configuration/store.go b/cosmos/x/evm/plugins/configuration/store.go deleted file mode 100644 index c897c305de..0000000000 --- a/cosmos/x/evm/plugins/configuration/store.go +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package configuration - -import ( - "encoding/json" - - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/params" - "pkg.berachain.dev/polaris/lib/encoding" -) - -// GetChainConfig is used to get the genesis info of the Ethereum chain. -func (p *plugin) ChainConfig() *params.ChainConfig { - bz := p.paramsStore.Get([]byte{types.ChainConfigPrefix}) - if bz == nil { - return nil - } - return encoding.MustUnmarshalJSON[params.ChainConfig](bz) -} - -// GetEthGenesis is used to get the genesis info of the Ethereum chain. -func (p *plugin) SetChainConfig(chainConfig *params.ChainConfig) error { - bz, err := json.Marshal(chainConfig) - if err != nil { - return err - } - p.paramsStore.Set([]byte{types.ChainConfigPrefix}, bz) - return nil -} diff --git a/cosmos/x/evm/plugins/configuration/store_test.go b/cosmos/x/evm/plugins/configuration/store_test.go deleted file mode 100644 index bf40dc3989..0000000000 --- a/cosmos/x/evm/plugins/configuration/store_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package configuration - -import ( - storetypes "cosmossdk.io/store/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" - "pkg.berachain.dev/polaris/eth/params" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Plugin", func() { - var ( - p *plugin - ctx sdk.Context - ) - - BeforeEach(func() { - ctx = testutil.NewContext() - storeKey := storetypes.NewKVStoreKey("evm") - p = &plugin{ - storeKey: storeKey, - paramsStore: ctx.KVStore(storeKey), - } - }) - - Describe("Prepare", func() { - It("should initialize the params store", func() { - p.Prepare(ctx) - - // Check that the params store is initialized. - expect := ctx.KVStore(p.storeKey) - Expect(p.paramsStore).To(Equal(expect)) - }) - }) - - Describe("ChainConfig", func() { - Context("when the params store is empty", func() { - It("should return nil", func() { - config := p.ChainConfig() - Expect(config).To(BeNil()) - }) - }) - - Context("when the params store contains valid params", func() { - It("should return the chain config", func() { - Expect(p.SetChainConfig(params.DefaultChainConfig)).To(Succeed()) - config := p.ChainConfig() - Expect(config).To(Equal(params.DefaultChainConfig)) - }) - }) - }) -}) diff --git a/cosmos/x/evm/plugins/precompile/plugin.go b/cosmos/x/evm/plugins/precompile/plugin.go index de506e76e3..e8fbb52610 100644 --- a/cosmos/x/evm/plugins/precompile/plugin.go +++ b/cosmos/x/evm/plugins/precompile/plugin.go @@ -42,6 +42,7 @@ import ( // Plugin is the interface that must be implemented by the plugin. type Plugin interface { core.PrecompilePlugin + SetPrecompiles([]ethprecompile.Registrable) } // polarisStateDB is the interface that must be implemented by the state DB. @@ -74,6 +75,10 @@ func NewPlugin(precompiles []ethprecompile.Registrable) Plugin { } } +func (p *plugin) SetPrecompiles(precompiles []ethprecompile.Registrable) { + p.precompiles = precompiles +} + // GetPrecompiles implements core.PrecompilePlugin. func (p *plugin) GetPrecompiles(_ *params.Rules) []ethprecompile.Registrable { return p.precompiles diff --git a/cosmos/x/evm/plugins/state/genesis_test.go b/cosmos/x/evm/plugins/state/genesis_test.go index 1400fe693a..fe7228fb6e 100644 --- a/cosmos/x/evm/plugins/state/genesis_test.go +++ b/cosmos/x/evm/plugins/state/genesis_test.go @@ -45,7 +45,7 @@ var _ = Describe("Genesis", func() { BeforeEach(func() { var ak state.AccountKeeper ctx, ak, _, _ = testutil.SetupMinimalKeepers() - sp = state.NewPlugin(ak, testutil.EvmKey, nil) + sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) // Create account for alice, bob acc := ak.NewAccountWithAddress(ctx, bob[:]) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 797fee06a2..7054f51b77 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -56,13 +56,15 @@ type Plugin interface { plugins.HasGenesis core.StatePlugin // SetQueryContextFn sets the query context func for the plugin. - SetQueryContextFn(fn func(height int64, prove bool) (sdk.Context, error)) + SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) // IterateBalances iterates over the balances of all accounts and calls the given callback function. IterateBalances(fn func(common.Address, *big.Int) bool) // IterateState iterates over the state of all accounts and calls the given callback function. IterateState(fn func(addr common.Address, key common.Hash, value common.Hash) bool) // SetGasConfig sets the gas config for the plugin. SetGasConfig(storetypes.GasConfig, storetypes.GasConfig) + // SetPrecompileLogFactory sets the precompile log factory for the plugin. + SetPrecompileLogFactory(events.PrecompileLogFactory) } // The StatePlugin is a very fun and interesting part of the EVM implementation. But if you want to @@ -106,7 +108,7 @@ type plugin struct { ak AccountKeeper // getQueryContext allows for querying state a historical height. - getQueryContext func(height int64, prove bool) (sdk.Context, error) + getQueryContext func() func(height int64, prove bool) (sdk.Context, error) // savedErr stores any error that is returned from state modifications on the underlying // keepers. @@ -129,6 +131,11 @@ func NewPlugin( } } +// SetupForPrecompiles sets the precompile plugin and the log factory on the state plugin. +func (p *plugin) SetPrecompileLogFactory(plf events.PrecompileLogFactory) { + p.plf = plf +} + // Prepare sets up the context on the state plugin for a new block. It sets the gas configs to be 0 // so that query calls to the EVM (ones that do not invoke a new transaction) do not charge gas. // @@ -515,7 +522,7 @@ func (p *plugin) IterateBalances(fn func(common.Address, *big.Int) bool) { // ============================================================================= // SetQueryContextFn sets the query context func for the plugin. -func (p *plugin) SetQueryContextFn(gqc func(height int64, prove bool) (sdk.Context, error)) { +func (p *plugin) SetQueryContextFn(gqc func() func(height int64, prove bool) (sdk.Context, error)) { p.getQueryContext = gqc } @@ -532,11 +539,15 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // TODO: the GTE may be hiding a larger issue with the timing of the NewHead channel stuff. // Investigate and hopefully remove this GTE. if int64Number >= p.ctx.BlockHeight() { + if p.ctx.MultiStore() == nil { + return nil, errors.New("no multi-store set in host chain") + } + ctx, _ = p.ctx.CacheContext() } else { // Get the query context at the given height. var err error - ctx, err = p.getQueryContext(int64Number, false) + ctx, err = p.getQueryContext()(int64Number, false) if err != nil { return nil, err } diff --git a/cosmos/x/evm/plugins/state/plugin_test.go b/cosmos/x/evm/plugins/state/plugin_test.go index 6cff43fe93..63e2e14de5 100644 --- a/cosmos/x/evm/plugins/state/plugin_test.go +++ b/cosmos/x/evm/plugins/state/plugin_test.go @@ -28,7 +28,6 @@ import ( testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/crypto" @@ -45,7 +44,7 @@ var ( var _ = Describe("State Plugin", func() { var ak state.AccountKeeper var ctx sdk.Context - var sp core.StatePlugin + var sp state.Plugin BeforeEach(func() { ctx, ak, _, _ = testutil.SetupMinimalKeepers() diff --git a/cosmos/x/evm/plugins/txpool/mempool/errors.go b/cosmos/x/evm/plugins/txpool/mempool/errors.go deleted file mode 100644 index 4fd5796610..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/errors.go +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import "errors" - -var ( - ErrIncorrectTxType = errors.New("tx is not of type WrappedEthereumTransaction") -) diff --git a/cosmos/x/evm/plugins/txpool/mempool/interfaces.go b/cosmos/x/evm/plugins/txpool/mempool/interfaces.go deleted file mode 100644 index 7ea05cae9a..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/interfaces.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import ( - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core" -) - -type ( - // NonceRetriever is used to retrieve a nonce from the db. - NonceRetriever interface { - // used to directly retrieve a nonce during queries. - GetNonce(addr common.Address) uint64 - // used to verify nonce during insertion into mempool. - StateAtBlockNumber(number uint64) (core.StatePlugin, error) - } -) diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool.go b/cosmos/x/evm/plugins/txpool/mempool/mempool.go deleted file mode 100644 index bee6696efd..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool.go +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import ( - "math/big" - "sync" - - "github.com/cosmos/cosmos-sdk/types/mempool" - - "pkg.berachain.dev/polaris/eth/common" - coretypes "pkg.berachain.dev/polaris/eth/core/types" -) - -// EthTxPool is a mempool for Ethereum transactions. It wraps a PriorityNonceMempool and caches -// transactions that are added to the mempool by ethereum transaction hash. -type EthTxPool struct { - // The underlying mempool implementation. - *mempool.PriorityNonceMempool[*big.Int] - - // We need to keep track of the priority policy so that we can update the base fee. - priorityPolicy *EthereumTxPriorityPolicy - - // NonceRetriever is used to retrieve the nonce for a given address (this is typically a - // reference to the StateDB). - nr NonceRetriever - - // ethTxCache caches transactions that are added to the mempool so that they can be retrieved - // later - ethTxCache map[common.Hash]*coretypes.Transaction - - // nonceToHash maps a nonce to the hash of the transaction that was added to the mempool with - // that nonce. This is used to retrieve the hash of a transaction that was added to the mempool - // by nonce. - nonceToHash map[common.Address]map[uint64]common.Hash - - // We have a mutex to protect the ethTxCache and nonces maps since they are accessed - // concurrently by multiple goroutines. - mu sync.RWMutex -} - -// NewPolarisEthereumTxPool creates a new Ethereum transaction pool. -func NewPolarisEthereumTxPool() *EthTxPool { - tpp := EthereumTxPriorityPolicy{ - baseFee: big.NewInt(0), - } - config := mempool.PriorityNonceMempoolConfig[*big.Int]{ - TxReplacement: EthereumTxReplacePolicy[*big.Int]{ - PriceBump: 10, //nolint:gomnd // 10% to match geth. - }.Func, - TxPriority: mempool.TxPriority[*big.Int]{ - GetTxPriority: tpp.GetTxPriority, - Compare: func(a *big.Int, b *big.Int) int { - return a.Cmp(b) - }, - MinValue: big.NewInt(-1), - }, - MaxTx: 10000, //nolint:gomnd // todo: parametize this. - } - - return &EthTxPool{ - PriorityNonceMempool: mempool.NewPriorityMempool(config), - nonceToHash: make(map[common.Address]map[uint64]common.Hash), - ethTxCache: make(map[common.Hash]*coretypes.Transaction), - priorityPolicy: &tpp, - } -} - -// SetNonceRetriever sets the nonce retriever db for the mempool. -func (etp *EthTxPool) SetNonceRetriever(nr NonceRetriever) { - etp.nr = nr -} - -// SetBaseFee updates the base fee in the priority policy. -func (etp *EthTxPool) SetBaseFee(baseFee *big.Int) { - etp.priorityPolicy.baseFee = baseFee -} diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_policy.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_policy.go deleted file mode 100644 index 4513fc6215..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_policy.go +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import ( - "context" - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" -) - -// ============================================================================= -// Priority Policy -// ============================================================================= - -type EthereumTxPriorityPolicy struct { - baseFee *big.Int -} - -// GetTxPriorityFn returns a function that can be used to calculate the priority of a transaction. -func (tpp *EthereumTxPriorityPolicy) GetTxPriority(ctx context.Context, tx sdk.Tx) *big.Int { - ethTx := evmtypes.GetAsEthTx(tx) - if ethTx == nil { - // If not an ethereum transaction fallback to the default cosmos-sdk priority. - return big.NewInt(sdk.UnwrapSDKContext(ctx).Priority()) - } - - return ethTx.EffectiveGasTipValue(tpp.baseFee) -} - -// ============================================================================= -// Replacement Policy -// ============================================================================= - -// EthereumTxReplacePolicy implements the Ethereum protocol's transaction replacement policy for a Cosmos-SDK mempool. -type EthereumTxReplacePolicy[C comparable] struct { - PriceBump uint64 // Minimum price bump percentage to replace an already existing transaction (nonce) -} - -// EthereumTxReplacePolicy.Func is called when a new transaction is added to the mempool and a transaction -// with the same nonce already exists. It returns true if the new transaction should replace the -// existing transaction. -// -// Source: https://github.com/ethereum/go-ethereum/blob/9231770811cda0473a7fa4e2bccc95bf62aae634/core/txpool/list.go#L284 -// -//nolint:lll // url. -func (etpc EthereumTxReplacePolicy[C]) Func(_, _ C, oldTx, newTx sdk.Tx) bool { - // Convert the transactions to Ethereum transactions. - oldEthTx := evmtypes.GetAsEthTx(oldTx) - newEthTx := evmtypes.GetAsEthTx(newTx) - if oldEthTx == nil || newEthTx == nil || - oldEthTx.GasFeeCapCmp(newEthTx) >= 0 || oldEthTx.GasTipCapCmp(newEthTx) >= 0 { - return false - } - - // thresholdFeeCap = oldFC * (100 + priceBump) / 100 - a := big.NewInt(100 + int64(etpc.PriceBump)) //nolint:gomnd // 100% + priceBump. - aFeeCap := new(big.Int).Mul(a, oldEthTx.GasFeeCap()) - aTip := a.Mul(a, oldEthTx.GasTipCap()) - - // thresholdTip = oldTip * (100 + priceBump) / 100 - b := big.NewInt(100) //nolint:gomnd // 100% + priceBump. - thresholdFeeCap := aFeeCap.Div(aFeeCap, b) - thresholdTip := aTip.Div(aTip, b) - - // We have to ensure that both the new fee cap and tip are higher than the - // old ones as well as checking the percentage threshold to ensure that - // this is accurate for low (Wei-level) gas price replacements. - if newEthTx.GasFeeCapIntCmp(thresholdFeeCap) < 0 || newEthTx.GasTipCapIntCmp(thresholdTip) < 0 { - return false - } - - // If we get here, the new transaction has a higher fee cap and tip than the - // old one, and the percentage threshold has been met, so we can replace it. - return true -} diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go deleted file mode 100644 index bef1ad44e9..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_reader.go +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/signing" - - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/common" - coretypes "pkg.berachain.dev/polaris/eth/core/types" -) - -// Get is called when a transaction is retrieved from the mempool. -func (etp *EthTxPool) Get(hash common.Hash) *coretypes.Transaction { - return etp.ethTxCache[hash] -} - -// Pending is called when txs in the mempool are retrieved. -// -// NOT THREAD SAFE. -func (etp *EthTxPool) Pending(bool) map[common.Address][]*coretypes.Transaction { - pendingNonces := make(map[common.Address]uint64) - pending := make(map[common.Address][]*coretypes.Transaction) - - etp.mu.RLock() - defer etp.mu.RUnlock() - for iter := etp.PriorityNonceMempool.Select(context.Background(), nil); iter != nil; iter = iter.Next() { - tx := iter.Tx() - if ethTx := evmtypes.GetAsEthTx(tx); ethTx != nil { - addr := coretypes.GetSender(ethTx) - pendingNonce := pendingNonces[addr] - switch { - case pendingNonce == 0: - // If its the first tx, set the pending nonce to the nonce of the tx. - txNonce := ethTx.Nonce() - // If on the first lookup the nonce delta is more than 0, then there is a gap - // and thus no pending transactions, but there are queued transactions. We - // continue. - if sdbNonce := etp.nr.GetNonce(addr); txNonce-sdbNonce >= 1 { - continue - } - // this is a pending tx, add it to the pending map. - pendingNonces[addr] = txNonce - pending[addr] = append(pending[addr], ethTx) - case ethTx.Nonce() == pendingNonce+1: - // If its not the first tx, but the nonce is the same as the pending nonce, add - // it to the list. - pending[addr] = append(pending[addr], ethTx) - pendingNonces[addr] = pendingNonce + 1 - default: - // If we see an out of order nonce, we break since the rest should be "queued". - break - } - } - } - - return pending -} - -// queued retrieves the content of the mempool. -// -// NOT THREAD SAFE. -func (etp *EthTxPool) queued() map[common.Address][]*coretypes.Transaction { - pendingNonces := make(map[common.Address]uint64) - queued := make(map[common.Address][]*coretypes.Transaction) - - // After the lock is released we can iterate over the mempool. - etp.mu.RLock() - defer etp.mu.RUnlock() - for iter := etp.PriorityNonceMempool.Select(context.Background(), nil); iter != nil; iter = iter.Next() { - if ethTx := evmtypes.GetAsEthTx(iter.Tx()); ethTx != nil { - addr := coretypes.GetSender(ethTx) - pendingNonce, seenTransaction := pendingNonces[addr] - switch { - case !seenTransaction: - // When we see a transaction, mark it as the pending nonce. - pendingNonce = ethTx.Nonce() - // If on the first lookup the nonce delta is more than 0, then there is a gap - // and thus no pending transactions, but there are queued transactions. - if pendingNonce-etp.nr.GetNonce(addr) >= 1 { - queued[addr] = append(queued[addr], ethTx) - } else { - // this is a pending tx, add it to the pending map. - pendingNonces[addr] = pendingNonce - } - case ethTx.Nonce() == pendingNonce+1: - // If we are still contiguous and the nonce is the same as the pending nonce, - // increment the pending nonce. - pendingNonce++ - pendingNonces[addr] = pendingNonce - default: - // If we are still contiguous and the nonce is greater than the pending nonce, we are no longer contiguous. - // Add to the queued list. - queued[addr] = append(queued[addr], ethTx) - // All other transactions in the skip list should be queued. - } - } - } - - return queued -} - -// Nonce returns the nonce for the given address from the mempool if the address has sent a tx -// in the mempool. -// -// NOT THREAD SAFE. -func (etp *EthTxPool) Nonce(addr common.Address) uint64 { - etp.mu.RLock() - defer etp.mu.RUnlock() - pendingNonces := make(map[common.Address]uint64) - - // search for the last pending tx for the given address - for iter := etp.PriorityNonceMempool.Select(context.Background(), nil); iter != nil; iter = iter.Next() { - txAddr, txNonce := getTxSenderNonce(iter.Tx()) - if addr != txAddr { - continue - } - pendingNonce, ok := pendingNonces[addr] - switch { - case !ok: - // If on the first lookup the nonce delta is more than 0, then there is a gap - // and thus no pending transactions, but there are queued transactions. - if sdbNonce := etp.nr.GetNonce(addr); txNonce-sdbNonce >= 1 { - return sdbNonce - } - // this is a pending tx, add it to the pending map. - pendingNonces[addr] = txNonce - case txNonce == pendingNonce+1: - // If we are still contiguous and the nonce is the same as the pending nonce, - // increment the pending nonce. - pendingNonces[addr]++ - case txNonce > pendingNonce+1: - // As soon as we see a non contiguous nonce we break. - break - } - } - - // if the addr has no eth txs, fallback to the nonce retriever db - if _, ok := pendingNonces[addr]; !ok { - return etp.nr.GetNonce(addr) - } - - // pending nonce is 1 more than the current nonce - return pendingNonces[addr] + 1 -} - -// Stats returns the number of currently pending and queued (locally created) transactions. -// -// NOT THREAD SAFE. -func (etp *EthTxPool) Stats() (int, int) { - var pendingTxsLen, queuedTxsLen int - pending, queued := etp.Content() - - for _, txs := range pending { - pendingTxsLen += len(txs) - } - for _, txs := range queued { - queuedTxsLen += len(txs) - } - return pendingTxsLen, queuedTxsLen -} - -// ContentFrom retrieves the data content of the transaction pool, returning the pending as well as -// queued transactions of this address, grouped by nonce. -// -// NOT THREAD SAFE. -func (etp *EthTxPool) ContentFrom(addr common.Address) ([]*coretypes.Transaction, []*coretypes.Transaction) { - pending, queued := etp.Content() - return pending[addr], queued[addr] -} - -// Content retrieves the data content of the transaction pool, returning all the pending as well as -// queued transactions, grouped by account and nonce. -// -// NOT THREAD SAFE. -func (etp *EthTxPool) Content() ( - map[common.Address][]*coretypes.Transaction, map[common.Address][]*coretypes.Transaction, -) { - return etp.Pending(false), etp.queued() -} - -// getTxSenderNonce returns the sender address (as an Eth address) and the nonce of the given tx. -func getTxSenderNonce(tx sdk.Tx) (common.Address, uint64) { - sigs, err := tx.(signing.SigVerifiableTx).GetSignaturesV2() - if err != nil || len(sigs) == 0 { - return common.Address{}, 0 - } - return common.BytesToAddress(sdk.AccAddress(sigs[0].PubKey.Address())), sigs[0].Sequence -} diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go deleted file mode 100644 index 9583c422f6..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_test.go +++ /dev/null @@ -1,509 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import ( - "bytes" - "context" - "crypto/ecdsa" - "errors" - "math/big" - "sync" - "testing" - - "google.golang.org/protobuf/reflect/protoreflect" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - - "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/common" - coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/eth/params" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestEthPool(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/txpool/mempool") -} - -var ( - ctx sdk.Context - sp state.Plugin - etp *EthTxPool - key1, _ = crypto.GenerateEthKey() - addr1 = crypto.PubkeyToAddress(key1.PublicKey) - key2, _ = crypto.GenerateEthKey() - addr2 = crypto.PubkeyToAddress(key2.PublicKey) -) - -var _ = Describe("EthTxPool", func() { - - BeforeEach(func() { - sCtx, ak, _, _ := testutil.SetupMinimalKeepers() - sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) - ctx = sCtx - sp.SetQueryContextFn(mockQueryContext) - sp.Reset(ctx) - sp.SetNonce(addr1, 1) - sp.SetNonce(addr2, 2) - sp.Finalize() - sp.Reset(ctx) - etp = NewPolarisEthereumTxPool() - etp.SetNonceRetriever(sp) - }) - - Describe("All Cases", func() { - It("should handle empty txs", func() { - Expect(etp.Get(common.Hash{})).To(BeNil()) - emptyPending, emptyQueued := etp.Content() - Expect(emptyPending).To(BeEmpty()) - Expect(emptyQueued).To(BeEmpty()) - Expect(etp.Nonce(addr1)).To(Equal(uint64(1))) - Expect(etp.Nonce(addr2)).To(Equal(uint64(2))) - Expect(etp.Nonce(common.HexToAddress("0x3"))).To(Equal(uint64(0))) - }) - - It("should error with low nonces", func() { - _, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 0}) - err := etp.Insert(ctx, tx1) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("nonce too low")) - }) - - It("should return pending/queued txs with correct nonces", func() { - ethTx1, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1}) - ethTx2, tx2 := buildTx(key2, &coretypes.LegacyTx{Nonce: 2}) - - Expect(etp.Insert(ctx, tx1)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - - Expect(etp.Nonce(addr1)).To(Equal(uint64(2))) - Expect(etp.Nonce(addr2)).To(Equal(uint64(3))) - - Expect(etp.Get(ethTx1.Hash()).Hash()).To(Equal(ethTx1.Hash())) - Expect(etp.Get(ethTx2.Hash()).Hash()).To(Equal(ethTx2.Hash())) - - pending, queued := etp.Content() - lenP, lenQ := etp.Stats() - - Expect(pending).To(HaveLen(lenP)) - Expect(queued).To(HaveLen(lenQ)) - - Expect(isPendingTx(etp, ethTx1)).To(BeTrue()) - Expect(isPendingTx(etp, ethTx2)).To(BeTrue()) - - Expect(etp.Remove(tx2)).ToNot(HaveOccurred()) - Expect(etp.Get(ethTx2.Hash())).To(BeNil()) - p2, q2 := etp.ContentFrom(addr2) - Expect(p2).To(BeEmpty()) - Expect(q2).To(BeEmpty()) - Expect(etp.Nonce(addr2)).To(Equal(uint64(2))) - - ethTx11, tx11 := buildTx(key1, &coretypes.LegacyTx{Nonce: 2}) - Expect(etp.Insert(ctx, tx11)).ToNot(HaveOccurred()) - Expect(etp.Nonce(addr1)).To(Equal(uint64(3))) - p11, q11 := etp.ContentFrom(addr1) - Expect(p11).To(HaveLen(2)) - - Expect(isPendingTx(etp, ethTx11)).To(BeTrue()) - Expect(q11).To(BeEmpty()) - }) - - It("should handle replacement txs", func() { - ethTx1, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(1)}) - ethTx2, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(2)}) - - Expect(etp.Insert(ctx, tx1)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - - Expect(etp.Nonce(addr1)).To(Equal(uint64(2))) - - Expect(etp.Get(ethTx1.Hash())).To(BeNil()) - Expect(etp.Get(ethTx2.Hash()).Hash()).To(Equal(ethTx2.Hash())) - - }) - It("should enqueue transactions with out of order nonces then poll from queue when inorder nonce tx is received", - func() { - _, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1}) - ethtx3, tx3 := buildTx(key1, &coretypes.LegacyTx{Nonce: 3}) - - Expect(etp.Insert(ctx, tx1)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx3)).ToNot(HaveOccurred()) - - Expect(isQueuedTx(etp, ethtx3)).To(BeTrue()) - - _, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 2}) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - - _, queuedTransactions := etp.ContentFrom(addr1) - Expect(queuedTransactions).To(BeEmpty()) - Expect(etp.Nonce(addr1)).To(Equal(uint64(4))) - }) - It("should not allow replacement txs with gas increase < 10%", func() { - _, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(99)}) - _, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(100)}) - _, tx3 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(99)}) - - Expect(etp.Insert(ctx, tx1)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx2)).To(HaveOccurred()) - Expect(etp.Insert(ctx, tx3)).To(HaveOccurred()) // should skip the math for replacement - }) - It("should handle spam txs and prevent DOS attacks", func() { - for i := 1; i < 1000; i++ { - _, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: uint64(i)}) - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - } - // probably more stuff down here... - }) - It("should be able to fetch transactions from the cache", func() { - - var txHashes []common.Hash - for i := 1; i < 100; i++ { - ethTx, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: uint64(i)}) - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - txHashes = append(txHashes, ethTx.Hash()) - } - for _, txHash := range txHashes { - Expect(etp.Get(txHash).Hash()).To(Equal(txHash)) - } - - }) - It("should allow resubmitting a transaction with same nonce but different fields", func() { - _, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(1)}) - _, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(5), Data: []byte("blahblah")}) - - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - }) - It("should prioritize transactions first by nonce, then priority", func() { - _, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(1)}) - _, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 2, GasPrice: big.NewInt(5)}) - _, tx3 := buildTx(key1, &coretypes.LegacyTx{Nonce: 3, GasPrice: big.NewInt(3)}) - _, tx31 := buildTx(key1, &coretypes.LegacyTx{Nonce: 3, GasPrice: big.NewInt(5)}) - - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx3)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx31)).ToNot(HaveOccurred()) - - var prevTx *coretypes.Transaction - for _, txs := range etp.Pending(false) { - for _, tx := range txs { - if prevTx == nil { // for the first transaction from a sender - prevTx = tx - } else { // for the rest of the transactions - Expect(tx.Nonce()).To(Equal(prevTx.Nonce() + 1)) - prevTx = tx - - } - // NOTE: replacement transactions are not handled because the old tx is removed from the pool - } - } - pending, _ := etp.Stats() - Expect(pending).To(Equal(3)) - }) - It("should handle many pending txs", func() { - ethTx1, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(1)}) - ethTx2, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 2, GasPrice: big.NewInt(2)}) - ethTx3, tx3 := buildTx(key1, &coretypes.LegacyTx{Nonce: 3, GasPrice: big.NewInt(3)}) - Expect(etp.Insert(ctx, tx1)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx3)).ToNot(HaveOccurred()) - - expected := []common.Hash{ethTx1.Hash(), ethTx2.Hash(), ethTx3.Hash()} - found := etp.Pending(false)[addr1] - Expect(found).To(HaveLen(3)) - for i, ethTx := range found { - Expect(ethTx.Hash()).To(Equal(expected[i])) - } - }) - - It("should not return pending when queued", func() { - _, tx2 := buildTx(key1, &coretypes.LegacyTx{Nonce: 2, GasPrice: big.NewInt(2)}) - _, tx3 := buildTx(key1, &coretypes.LegacyTx{Nonce: 3, GasPrice: big.NewInt(3)}) - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - Expect(etp.Insert(ctx, tx3)).ToNot(HaveOccurred()) - - Expect(etp.Pending(false)[addr1]).To(BeEmpty()) - Expect(etp.queued()[addr1]).To(HaveLen(2)) - pending, queued := etp.Stats() - Expect(pending).To(Equal(0)) - Expect(queued).To(Equal(2)) - }) - - It("should handle concurrent reads", func() { - readsFromA := 0 - readsFromB := 0 - { - // fill mempoopl with transactions - var wg sync.WaitGroup - - for i := 1; i < 10; i++ { - _, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: uint64(i)}) - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - } - - // concurrently read mempool from Peer A ... - wg.Add(1) - go func(etp *EthTxPool) { - defer wg.Done() - for _, txs := range etp.Pending(false) { - for range txs { - readsFromA++ - } - } - }(etp) - - // ... and peer B - wg.Add(1) - go func(etp *EthTxPool) { - defer wg.Done() - for _, txs := range etp.Pending(false) { - for range txs { - readsFromB++ - } - } - }(etp) - wg.Wait() - } - Expect(readsFromA).To(BeEquivalentTo(readsFromB)) - }) - It("should be able to return the transaction priority for a Cosmos tx and effective gas tip value", func() { - ethTx1, tx1 := buildTx(key1, &coretypes.DynamicFeeTx{ - Nonce: 1, GasTipCap: big.NewInt(1), GasFeeCap: big.NewInt(10000)}) - ethTx2, tx2 := buildTx(key2, &coretypes.DynamicFeeTx{ - Nonce: 2, GasTipCap: big.NewInt(2), GasFeeCap: big.NewInt(200)}) - - // Test that the priority policy is working as expected. - tpp := EthereumTxPriorityPolicy{baseFee: big.NewInt(69)} - Expect(tpp.GetTxPriority(ctx, tx1)).To(Equal(ethTx1.EffectiveGasTipValue(tpp.baseFee))) - Expect(tpp.GetTxPriority(ctx, tx2)).To(Equal(ethTx2.EffectiveGasTipValue(tpp.baseFee))) - - // Test live mempool - err := etp.Insert(ctx, tx1) - Expect(err).ToNot(HaveOccurred()) - err = etp.Insert(ctx, tx2) - Expect(err).ToNot(HaveOccurred()) - - // Test that the priority policy is working as expected. - iter := etp.Select(context.TODO(), nil) - higherPriorityTx := evmtypes.GetAsEthTx(iter.Tx()) - lowerPriorityTx := evmtypes.GetAsEthTx(iter.Next().Tx()) - Expect(higherPriorityTx.Hash()).To(Equal(ethTx2.Hash())) - Expect(lowerPriorityTx.Hash()).To(Equal(ethTx1.Hash())) - }) - It("should allow you to set the base fee of the EthTxPool", func() { - before := etp.priorityPolicy.baseFee - etp.SetBaseFee(big.NewInt(69)) - after := etp.priorityPolicy.baseFee - Expect(before).ToNot(BeEquivalentTo(after)) - Expect(after).To(BeEquivalentTo(big.NewInt(69))) - }) - It("should throw when attempting to remove a transaction that doesn't exist", func() { - _, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: 1, GasPrice: big.NewInt(1)}) - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - Expect(etp.Remove(tx)).ToNot(HaveOccurred()) - Expect(etp.Remove(tx)).To(HaveOccurred()) - }) - - It("should return StateDB's nonce when seeing nonce gap on first lookup", func() { - ethTx, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: 3}) - - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - - sdbNonce := etp.nr.GetNonce(addr1) - txNonce := ethTx.Nonce() - Expect(sdbNonce).ToNot(BeEquivalentTo(txNonce)) - Expect(sdbNonce).To(BeEquivalentTo(1)) - Expect(txNonce).To(BeEquivalentTo(3)) - Expect(etp.Nonce(addr1)).To(BeEquivalentTo(sdbNonce)) - - }) - It("should break out of func Nonce(addr) when seeing a noncontigious nonce gap", func() { - _, tx1 := buildTx(key1, &coretypes.LegacyTx{Nonce: 1}) - tx2 := buildSdkTx(key1, 2) - _, tx3 := buildTx(key1, &coretypes.LegacyTx{Nonce: 3}) - _, tx10 := buildTx(key1, &coretypes.LegacyTx{Nonce: 10}) - - Expect(etp.Insert(ctx, tx1)).ToNot(HaveOccurred()) - Expect(etp.Nonce(addr1)).To(BeEquivalentTo(2)) - - Expect(etp.Insert(ctx, tx2)).ToNot(HaveOccurred()) - Expect(etp.Nonce(addr1)).To(BeEquivalentTo(3)) - - Expect(etp.Insert(ctx, tx3)).ToNot(HaveOccurred()) - Expect(etp.Nonce(addr1)).To(BeEquivalentTo(4)) - - Expect(etp.Insert(ctx, tx10)).ToNot(HaveOccurred()) - Expect(etp.Nonce(addr1)).To(BeEquivalentTo(4)) // should not be 10 - }) - - }) - Describe("Race Cases", func() { - It("should handle concurrent additions", func() { - - // apologies in advance for this test, it's not great. - - var wg sync.WaitGroup - - wg.Add(1) - go func(etp *EthTxPool) { - defer wg.Done() - for i := 1; i <= 10; i++ { - _, tx := buildTx(key1, &coretypes.LegacyTx{Nonce: uint64(i)}) - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - } - }(etp) - - wg.Add(1) - go func(etp *EthTxPool) { - defer wg.Done() - for i := 2; i <= 11; i++ { - _, tx := buildTx(key2, &coretypes.LegacyTx{Nonce: uint64(i)}) - Expect(etp.Insert(ctx, tx)).ToNot(HaveOccurred()) - } - }(etp) - - wg.Wait() - lenPending, _ := etp.Stats() - Expect(lenPending).To(BeEquivalentTo(20)) - }) - }) -}) - -// MOCKS BELOW. - -type mockPLF struct{} - -func (mplf *mockPLF) Build(event *sdk.Event) (*coretypes.Log, error) { - return &coretypes.Log{ - Address: common.BytesToAddress([]byte(event.Type)), - }, nil -} - -func isQueuedTx(mempool *EthTxPool, tx *coretypes.Transaction) bool { - _, queued := mempool.Content() - - for _, list := range queued { - for _, ethTx := range list { - if tx.Hash() == ethTx.Hash() { - return true - } - } - } - return false -} - -func isPendingTx(mempool *EthTxPool, tx *coretypes.Transaction) bool { - pending, _ := mempool.Content() - - for _, list := range pending { - for _, ethTx := range list { - if tx.Hash() == ethTx.Hash() { - return true - } - } - } - return false -} - -func buildSdkTx(from *ecdsa.PrivateKey, nonce uint64) sdk.Tx { - pubKey := ðsecp256k1.PubKey{Key: crypto.CompressPubkey(&from.PublicKey)} - signer := crypto.PubkeyToAddress(from.PublicKey) - return &mockSdkTx{ - signers: [][]byte{signer.Bytes()}, - msgs: []sdk.Msg{}, - pubKeys: []cryptotypes.PubKey{pubKey}, - signatures: []signing.SignatureV2{ - { - PubKey: pubKey, - // NOTE: not including the signature data for the mock - Sequence: nonce, - }, - }, - } -} - -func buildTx(from *ecdsa.PrivateKey, txData coretypes.TxData) (*coretypes.Transaction, sdk.Tx) { - signer := coretypes.LatestSignerForChainID(params.DefaultChainConfig.ChainID) - signedEthTx := coretypes.MustSignNewTx(from, signer, txData) - addr, _ := signer.Sender(signedEthTx) - if !bytes.Equal(addr.Bytes(), crypto.PubkeyToAddress(from.PublicKey).Bytes()) { - panic("sender mismatch") - } - pubKey := ðsecp256k1.PubKey{Key: crypto.CompressPubkey(&from.PublicKey)} - return signedEthTx, &mockSdkTx{ - signers: [][]byte{addr.Bytes()}, - msgs: []sdk.Msg{evmtypes.NewFromTransaction(signedEthTx)}, - pubKeys: []cryptotypes.PubKey{pubKey}, - signatures: []signing.SignatureV2{ - { - PubKey: pubKey, - // NOTE: not including the signature data for the mock - Sequence: signedEthTx.Nonce(), - }, - }, - } -} - -var _ authsigning.SigVerifiableTx = (*mockSdkTx)(nil) - -type mockSdkTx struct { - signers [][]byte - msgs []sdk.Msg - pubKeys []cryptotypes.PubKey - signatures []signing.SignatureV2 -} - -func (m *mockSdkTx) ValidateBasic() error { return nil } - -func (m *mockSdkTx) GetMsgs() []sdk.Msg { return m.msgs } -func (m mockSdkTx) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { return nil, nil } -func (m *mockSdkTx) GetSigners() ([][]byte, error) { return m.signers, nil } - -func (m *mockSdkTx) GetPubKeys() ([]cryptotypes.PubKey, error) { return m.pubKeys, nil } - -func (m *mockSdkTx) GetSignaturesV2() ([]signing.SignatureV2, error) { return m.signatures, nil } - -func mockQueryContext(height int64, _ bool) (sdk.Context, error) { - if height <= 0 { - return sdk.Context{}, errors.New("cannot query context at this height") - } - newCtx := testutil.NewContext().WithBlockHeight(height) - header := &coretypes.Header{Number: big.NewInt(height)} - headerBz, err := coretypes.MarshalHeader(header) - if err != nil { - return sdk.Context{}, err - } - newCtx.KVStore(testutil.EvmKey).Set([]byte{evmtypes.HeaderKey}, headerBz) - newCtx.KVStore(testutil.EvmKey).Set(header.Hash().Bytes(), header.Number.Bytes()) - return newCtx, nil -} diff --git a/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go b/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go deleted file mode 100644 index dbf9cc2c6c..0000000000 --- a/cosmos/x/evm/plugins/txpool/mempool/mempool_writer.go +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mempool - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/common" - coretypes "pkg.berachain.dev/polaris/eth/core/types" - errorslib "pkg.berachain.dev/polaris/lib/errors" -) - -// Insert is called when a transaction is added to the mempool. -func (etp *EthTxPool) Insert(ctx context.Context, tx sdk.Tx) error { - etp.mu.Lock() - defer etp.mu.Unlock() - - // TODO: do this once per block. This is a temporary solution. - sp, err := etp.nr.StateAtBlockNumber(uint64(sdk.UnwrapSDKContext(ctx).BlockHeight())) - if err != nil { - return err - } - - // Call the base mempool's Insert method - if err = etp.PriorityNonceMempool.Insert(ctx, tx); err != nil { - return err - } - - // We want to cache the transaction for lookup. - if ethTx := evmtypes.GetAsEthTx(tx); ethTx != nil { - sender := coretypes.GetSender(ethTx) - nonce := ethTx.Nonce() - - // Reject txs with a nonce lower than the nonce reported by the statedb. - if sdbNonce := sp.GetNonce(sender); sdbNonce > nonce { - return errorslib.Wrap(etp.PriorityNonceMempool.Remove(tx), "nonce too low") - } - - // Delete old hash if the sender has a tx with the same nonce. - if senderNonceHash := etp.nonceToHash[sender]; senderNonceHash != nil { - delete(etp.ethTxCache, senderNonceHash[nonce]) - } - - // Add new hash. - newHash := ethTx.Hash() - if etp.nonceToHash[sender] == nil { - etp.nonceToHash[sender] = make(map[uint64]common.Hash) - } - etp.nonceToHash[sender][nonce] = newHash - etp.ethTxCache[newHash] = ethTx - } - - return nil -} - -// Remove is called when a transaction is removed from the mempool. -func (etp *EthTxPool) Remove(tx sdk.Tx) error { - etp.mu.Lock() - defer etp.mu.Unlock() - - // Call the base mempool's Remove method - if err := etp.PriorityNonceMempool.Remove(tx); err != nil { - return err - } - - // We want to remove any references to the tx from the cache. - if ethTx := evmtypes.GetAsEthTx(tx); ethTx != nil { - delete(etp.ethTxCache, ethTx.Hash()) - delete(etp.nonceToHash[coretypes.GetSender(ethTx)], ethTx.Nonce()) - } - - return nil -} diff --git a/cosmos/x/evm/plugins/txpool/plugin.go b/cosmos/x/evm/plugins/txpool/plugin.go deleted file mode 100644 index 34e96310f0..0000000000 --- a/cosmos/x/evm/plugins/txpool/plugin.go +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package txpool - -import ( - errorsmod "cosmossdk.io/errors" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - - "github.com/ethereum/go-ethereum/event" - - "pkg.berachain.dev/polaris/cosmos/txpool" - mempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/core" - coretypes "pkg.berachain.dev/polaris/eth/core/types" - errorslib "pkg.berachain.dev/polaris/lib/errors" -) - -// Compile-time type assertion. -var _ Plugin = (*plugin)(nil) - -// Plugin defines the required functions of the transaction pool plugin. -type Plugin interface { - core.TxPoolPlugin - SetNonceRetriever(mempool.NonceRetriever) - SetClientContext(client.Context) -} - -// plugin represents the transaction pool plugin. -type plugin struct { - *mempool.EthTxPool - - clientContext client.Context - serializer txpool.TxSerializer - - // txFeed and scope is used to send new batch transactions to new txs subscribers when the - // batch is added to the mempool. - txFeed event.Feed - scope event.SubscriptionScope -} - -// NewPlugin returns a new transaction pool plugin. -func NewPlugin(ethTxMempool *mempool.EthTxPool) Plugin { - return &plugin{ - EthTxPool: ethTxMempool, - } -} - -// SetClientContext implements the Plugin interface. -func (p *plugin) SetClientContext(ctx client.Context) { - p.clientContext = ctx - p.serializer = types.NewSerializer(p.clientContext.TxConfig) -} - -// SubscribeNewTxsEvent returns a new event subscription for the new txs feed. -func (p *plugin) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { - return p.scope.Track(p.txFeed.Subscribe(ch)) -} - -// SendTx sends a transaction to the transaction pool. It takes in a signed Ethereum transaction -// from the rpc backend and wraps it in a Cosmos transaction. The Cosmos transaction is then -// broadcasted to the network. -func (p *plugin) SendTx(signedEthTx *coretypes.Transaction) error { - // Serialize the transaction to Bytes - txBytes, err := p.serializer.SerializeToBytes(signedEthTx) - if err != nil { - return errorslib.Wrap(err, "failed to serialize transaction") - } - - // Send the transaction to the CometBFT mempool, which will gossip it to peers via CometBFT's - // p2p layer. - syncCtx := p.clientContext.WithBroadcastMode(flags.BroadcastSync) - rsp, err := syncCtx.BroadcastTx(txBytes) - if rsp != nil && rsp.Code != 0 { - err = errorsmod.ABCIError(rsp.Codespace, rsp.Code, rsp.RawLog) - } - if err != nil { - // b.logger.Error("failed to broadcast tx", "error", err.Errsor()) - return err - } - - // Currently sending an individual new txs event for every new tx added to the mempool via - // broadcast. - // TODO: support sending batch new txs events when adding queued txs to the pending txs. - // TODO: move to mempool? - p.txFeed.Send(core.NewTxsEvent{Txs: coretypes.Transactions{signedEthTx}}) - return nil -} diff --git a/cosmos/x/evm/plugins/txpool/txpool_test.go b/cosmos/x/evm/plugins/txpool/txpool_test.go deleted file mode 100644 index 1115cb7bc9..0000000000 --- a/cosmos/x/evm/plugins/txpool/txpool_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package txpool_test - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestTxpool(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/txpool") -} diff --git a/cosmos/x/evm/types/tx.go b/cosmos/x/evm/types/tx.go index 4976fc32c0..c2518ed307 100644 --- a/cosmos/x/evm/types/tx.go +++ b/cosmos/x/evm/types/tx.go @@ -79,21 +79,24 @@ func (etr *WrappedEthereumTransaction) GetSignBytes() ([]byte, error) { Hash(tx).Bytes(), nil } -// GetSender extracts the sender address from the signature values using the latest signer for the given chainID. +// GetSender extracts the sender address from the signature values using the +// latest signer for the given chainID. func (etr *WrappedEthereumTransaction) GetSender() (common.Address, error) { tx := etr.AsTransaction() signer := coretypes.LatestSignerForChainID(tx.ChainId()) return signer.Sender(tx) } -// GetSender extracts the sender address from the signature values using the latest signer for the given chainID. +// GetSender extracts the sender address from the signature values using the +// latest signer for the given chainID. func (etr *WrappedEthereumTransaction) GetPubKey() ([]byte, error) { tx := etr.AsTransaction() signer := coretypes.LatestSignerForChainID(tx.ChainId()) return signer.PubKey(tx) } -// GetSender extracts the sender address from the signature values using the latest signer for the given chainID. +// GetSender extracts the sender address from the signature values using the +// latest signer for the given chainID. func (etr *WrappedEthereumTransaction) GetSignature() ([]byte, error) { tx := etr.AsTransaction() signer := coretypes.LatestSignerForChainID(tx.ChainId()) diff --git a/e2e/hive/clients/polard/Dockerfile b/e2e/hive/clients/polard/Dockerfile index 65a9d01fd5..edfc95e707 100644 --- a/e2e/hive/clients/polard/Dockerfile +++ b/e2e/hive/clients/polard/Dockerfile @@ -16,7 +16,7 @@ # Use the latest foundry image FROM polard/base:v0.0.0 as polaris-hive -RUN apk add --no-cache bash jq +RUN apk add --no-cache bash jq sed WORKDIR / diff --git a/e2e/hive/clients/polard/config/app.toml b/e2e/hive/clients/polard/config/app.toml index f48cfbbdcf..a7615f28d7 100644 --- a/e2e/hive/clients/polard/config/app.toml +++ b/e2e/hive/clients/polard/config/app.toml @@ -8,7 +8,11 @@ # The minimum gas prices a validator is willing to accept for processing a # transaction. A transaction's fees must meet the minimum of any denomination # specified in this config (e.g. 0.25token1;0.0001token2). -minimum-gas-prices = "0abera" +minimum-gas-prices = "0stake" + +# The maximum gas a query coming over rest/grpc may consume. +# If this is set to zero, the query can consume an unbounded amount of gas. +query-gas-limit = "0" # default: the last 362880 states are kept, pruning at 10 block intervals # nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) @@ -60,20 +64,15 @@ inter-block-cache = true index-events = [] # IavlCacheSize set the size of the iavl tree cache (in number of nodes). -iavl-cache-size = 781250 +iavl-cache-size = 10000 # IAVLDisableFastNode enables or disables the fast node feature of IAVL. # Default is false. iavl-disable-fastnode = false -# IAVLLazyLoading enable/disable the lazy loading of iavl store. -# Default is false. -iavl-lazy-loading = false - # AppDBBackend defines the database backend type to use for the application and snapshots DBs. # An empty string indicates that a fallback will be used. -# First fallback is the deprecated compile-time types.DBBackend value. -# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in CometBFT's config.toml. +# The fallback is the db_backend value set in CometBFT's config.toml. app-db-backend = "" ############################################################################### @@ -107,8 +106,7 @@ prometheus-retention-time = 0 # # Example: # [["chain_id", "cosmoshub-1"]] -global-labels = [ -] +global-labels = [] ############################################################################### ### API Configuration ### @@ -123,7 +121,7 @@ enable = false swagger = false # Address defines the API server to listen on. -address = "tcp://0.0.0.0:1317" +address = "tcp://localhost:1317" # MaxOpenConnections defines the number of maximum open connections. max-open-connections = 1000 @@ -150,7 +148,7 @@ enabled-unsafe-cors = false enable = true # Address defines the gRPC server address to bind to. -address = "0.0.0.0:9090" +address = "localhost:9090" # MaxRecvMsgSize defines the max message size in bytes the server can receive. # The default value is 10MB. @@ -223,7 +221,7 @@ stop-node-on-err = true # # Note, this configuration only applies to SDK built-in app-side mempool # implementations. -max-txs = "5000" +max-txs = 5000 ############################################################################### ### Polaris ### @@ -242,6 +240,79 @@ rpc-evm-timeout = "5s" rpc-tx-fee-cap = "1" +[polaris.polar.chain] +chain-id = "2061" + +# Homestead switch block +homestead-block = "0" + +# DAO fork switch block +dao-fork-block = "0" + +# Whether to support DAO fork +dao-fork-support = true + +# EIP150 switch block +eip150-block = "0" + +# EIP155 switch block +eip155-block = "0" + +# EIP158 switch block +eip158-block = "0" + +# Byzanitum switch block +byzantium-block = "0" + +# Constantinople switch block +constantinople-block = "0" + +# Petersburg switch block +petersburg-block = "0" + +# Istanbul switch block +istanbul-block = "0" + +# Muir Glacier switch block +muir-glacier-block = "0" + +# Berlin switch block +berlin-block = "0" + +# London switch block +london-block = "0" + +# Arrow Glacier switch block +arrow-glacier-block = "0" + +# Gray Glacier switch block +gray-glacier-block = "0" + +# Merge Netsplit switch block +merge-netsplit-block = "0" + +# Shanghai switch time (nil == no fork, 0 = already on shanghai) +shanghai-time = "0" + +# Cancun switch time (nil == no fork, 0 = already on cancun) +cancun-time = "null" + +# Prague switch time (nil == no fork, 0 = already on prague) +prague-time = "null" + +# Verkle switch time (nil == no fork, 0 = already on verkle) +verkle-time = "null" + +# Terminal total difficulty +terminal-total-difficulty = "0" + +# Whether terminal total difficulty has passed +terminal-total-difficulty-passed = true + +# DevMode enabled +is-dev-mode = false + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices @@ -265,6 +336,42 @@ max-price = "500000000000" # Prices to ignore for gas price determination ignore-price = "2" +# LegacyTxPool settings +[polaris.polar.legacy-tx-pool] + +# Addresses that should be treated by default as local +locals = [] + +# Whether local transaction handling should be disabled +no-locals = false + +# Journal of local transactions to survive node restarts +journal = "transactions.rlp" + +# Time interval to regenerate the local transaction journal +rejournal = "1h0m0s" + +# Minimum gas price to enforce for acceptance into the pool +price-limit = 1 + +# Minimum price bump percentage to replace an already existing transaction (nonce) +price-bump = 10 + +# Number of executable transaction slots guaranteed per account +account-slots = 16 + +# Maximum number of executable transaction slots for all accounts +account-queue = 64 + +# Maximum number of non-executable transaction slots permitted per account +global-slots = 5120 + +# Maximum number of non-executable transaction slots for all accounts +global-queue = 1024 + +# Maximum amount of time non-executable transaction are queued +lifetime = "3h0m0s" + # Node-specific settings [polaris.node] @@ -381,4 +488,3 @@ write-timeout = "30s" # Timeout for idle HTTP connections idle-timeout = "2m0s" - diff --git a/e2e/hive/clients/polard/config/config.toml b/e2e/hive/clients/polard/config/config.toml index 9cf1314540..e31ceeef26 100644 --- a/e2e/hive/clients/polard/config/config.toml +++ b/e2e/hive/clients/polard/config/config.toml @@ -99,10 +99,16 @@ laddr = "tcp://0.0.0.0:26657" cors_allowed_origins = [] # A list of methods the client is allowed to use with cross-domain requests -cors_allowed_methods = ["HEAD", "GET", "POST", ] +cors_allowed_methods = ["HEAD", "GET", "POST"] # A list of non simple headers the client is allowed to use with cross-domain requests -cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] +cors_allowed_headers = [ + "Origin", + "Accept", + "Content-Type", + "X-Requested-With", + "X-Server-Time", +] # TCP or UNIX socket address for the gRPC server to listen on # NOTE: This server only supports /broadcast_tx_commit diff --git a/e2e/hive/clients/polard/config/genesis.json b/e2e/hive/clients/polard/config/genesis.json index 1f1243393e..750e22bf97 100644 --- a/e2e/hive/clients/polard/config/genesis.json +++ b/e2e/hive/clients/polard/config/genesis.json @@ -139,7 +139,6 @@ "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, @@ -151,7 +150,6 @@ "arrowGlacierBlock": 0, "grayGlacierBlock": 0, "mergeNetsplitBlock": 0, - "shanghaiTime": 0, "terminalTotalDifficulty": 0, "terminalTotalDifficultyPassed": true }, diff --git a/e2e/hive/clients/polard/hive-init.sh b/e2e/hive/clients/polard/hive-init.sh index 6e83be017b..74817995c8 100644 --- a/e2e/hive/clients/polard/hive-init.sh +++ b/e2e/hive/clients/polard/hive-init.sh @@ -43,7 +43,7 @@ GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json # used to exit on first error (any non-zero exit code) -set -e +set # Reinstall daemon # make build @@ -62,14 +62,19 @@ for KEY in "${KEYS[@]}"; do done ETH_GENESIS_SOURCE=$(cat genesis.json) +JSON_FILE="genesis.json" temp_genesis=$(cat $GENESIS) echo "eth_gen dump: " echo $ETH_GENESIS_SOURCE -# Change eth_genesis in config/genesis.json + +# # # Change eth_genesis in config/genesis.json +# # # TODO FIX TO SETUP APP.TOML STUFF updated_genesis=$(echo "$temp_genesis" | jq --argjson eth_gen "$ETH_GENESIS_SOURCE" '.app_state["evm"] = $eth_gen') echo "$updated_genesis" > "$GENESIS" +# echo "UPDATED FILE" + # Change parameter token denominations to abera jq '.app_state["staking"]["params"]["bond_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" jq '.app_state["crisis"]["constant_fee"]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" @@ -78,8 +83,8 @@ jq '.app_state["mint"]["params"]["mint_denom"]="abera"' "$GENESIS" >"$TMP_GENESI jq '.consensus["params"]["block"]["max_gas"]="30000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" # Dump genesis -echo "genesis state:" -cat $GENESIS +# echo "genesis state:" +# cat $GENESIS # Allocate genesis accounts (cosmos formatted addresses) for KEY in "${KEYS[@]}"; do @@ -105,5 +110,56 @@ if [[ $1 == "pending" ]]; then echo "pending mode is on, please wait for the first block committed." fi +# Read values from JSON +CHAIN_ID=$(jq '.config.chainId' $JSON_FILE) +HOMESTEAD_BLOCK=$(jq '.config.homesteadBlock' $JSON_FILE) +DAO_FORK_BLOCK=$(jq '.config.daoForkBlock' $JSON_FILE) +DAO_FORK_SUPPORT=$(jq '.config.daoForkSupport' $JSON_FILE) +EIP150_BLOCK=$(jq '.config.eip150Block' $JSON_FILE) +EIP155_BLOCK=$(jq '.config.eip155Block' $JSON_FILE) +EIP158_BLOCK=$(jq '.config.eip158Block' $JSON_FILE) +BYZANTIUM_BLOCK=$(jq '.config.byzantiumBlock' $JSON_FILE) +CONSTANTINOPLE_BLOCK=$(jq '.config.constantinopleBlock' $JSON_FILE) +PETERSBURG_BLOCK=$(jq '.config.petersburgBlock' $JSON_FILE) +ISTANBUL_BLOCK=$(jq '.config.istanbulBlock' $JSON_FILE) +BERLIN_BLOCK=$(jq '.config.berlinBlock' $JSON_FILE) +LONDON_BLOCK=$(jq '.config.londonBlock' $JSON_FILE) +MUIR_GLACIER_BLOCK=$(jq '.config.muirGlacierBlock' $JSON_FILE) +ARROW_GLACIER_BLOCK=$(jq '.config.arrowGlacierBlock' $JSON_FILE) +GRAY_GLACIER_BLOCK=$(jq '.config.grayGlacierBlock' $JSON_FILE) +MERGE_NETSPLIT_BLOCK=$(jq '.config.mergeNetsplitBlock' $JSON_FILE) +SHANGHAI_TIME=$(jq '.config.shanghaiTime' $JSON_FILE) +TERMINAL_TOTAL_DIFFICULTY=$(jq '.config.terminalTotalDifficulty' $JSON_FILE) +TERMINAL_TOTAL_DIFFICULTY_PASSED=$(jq '.config.terminalTotalDifficultyPassed' $JSON_FILE) + +# Update values in TOML using sed command for Linux with -i and empty string argument +sed -i "s/chain-id = .*/chain-id = \"$CHAIN_ID\"/" $APP_TOML +sed -i "s/homestead-block = .*/homestead-block = \"$HOMESTEAD_BLOCK\"/" $APP_TOML +sed -i "s/dao-fork-block = .*/dao-fork-block = $DAO_FORK_BLOCK/" $APP_TOML +sed -i "s/dao-fork-support = .*/dao-fork-support = $DAO_FORK_SUPPORT/" $APP_TOML +sed -i "s/eip150-block = .*/eip150-block = \"$EIP150_BLOCK\"/" $APP_TOML +sed -i "s/eip155-block = .*/eip155-block = \"$EIP155_BLOCK\"/" $APP_TOML +sed -i "s/eip158-block = .*/eip158-block = \"$EIP158_BLOCK\"/" $APP_TOML +sed -i "s/byzantium-block = .*/byzantium-block = \"$BYZANTIUM_BLOCK\"/" $APP_TOML +sed -i "s/constantinople-block = .*/constantinople-block = \"$CONSTANTINOPLE_BLOCK\"/" $APP_TOML +sed -i "s/petersburg-block = .*/petersburg-block = \"$PETERSBURG_BLOCK\"/" $APP_TOML +sed -i "s/istanbul-block = .*/istanbul-block = \"$ISTANBUL_BLOCK\"/" $APP_TOML +sed -i "s/berlin-block = .*/berlin-block = \"$BERLIN_BLOCK\"/" $APP_TOML +sed -i "s/london-block = .*/london-block = \"$LONDON_BLOCK\"/" $APP_TOML +sed -i "s/muir-glacier-block = .*/muir-glacier-block = \"$MUIR_GLACIER_BLOCK\"/" $APP_TOML +sed -i "s/arrow-glacier-block = .*/arrow-glacier-block = \"$ARROW_GLACIER_BLOCK\"/" $APP_TOML +sed -i "s/gray-glacier-block = .*/gray-glacier-block = \"$GRAY_GLACIER_BLOCK\"/" $APP_TOML +sed -i "s/merge-netsplit-block = .*/merge-netsplit-block = \"$MERGE_NETSPLIT_BLOCK\"/" $APP_TOML +sed -i "s/shanghai-time = .*/shanghai-time = \"$SHANGHAI_TIME\"/" $APP_TOML +sed -i "s/terminal-total-difficulty = .*/terminal-total-difficulty = \"$TERMINAL_TOTAL_DIFFICULTY\"/" $APP_TOML +sed -i "s/terminal-total-difficulty-passed = .*/terminal-total-difficulty-passed = $TERMINAL_TOTAL_DIFFICULTY_PASSED/" $APP_TOML + +# sed -i 's/"null"/null/g' $APP_TOML +# sed -i 's/"null"/null/g' $APP_TOML +# cat "POSTSED" +# cat $APP_TOML +cat $APP_TOML +echo "BINGBONG" + # Start the node (remove the --pruning=nothing flag if historical queries are not needed)m polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" diff --git a/e2e/hive/simulators/rpc-compat/tests/genesis.json b/e2e/hive/simulators/rpc-compat/tests/genesis.json index 2cbc5bf453..e4a81dc93a 100644 --- a/e2e/hive/simulators/rpc-compat/tests/genesis.json +++ b/e2e/hive/simulators/rpc-compat/tests/genesis.json @@ -2,6 +2,8 @@ "config": { "chainId": 1337, "homesteadBlock": 0, + "daoForkBlock": 0, + "daoForkSupport": true, "eip150Block": 0, "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block": 0, diff --git a/e2e/hive/simulators/rpc/init/genesis.json b/e2e/hive/simulators/rpc/init/genesis.json index 78491db56a..2b0e50a657 100644 --- a/e2e/hive/simulators/rpc/init/genesis.json +++ b/e2e/hive/simulators/rpc/init/genesis.json @@ -11,6 +11,7 @@ "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0, + "muirGlacierBlock": 0, "berlinBlock": 0, "londonBlock": 0, "arrowGlacierBlock": 0, diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 75248f4715..be483cabc6 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/e2e/localnet go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f require ( github.com/docker/docker v24.0.5+incompatible diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index b5a6189f48..c4e7e7d8f3 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -107,8 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/e2e/localnet/network/node.go b/e2e/localnet/network/node.go index 4fe08647df..c57f05ee30 100644 --- a/e2e/localnet/network/node.go +++ b/e2e/localnet/network/node.go @@ -38,7 +38,7 @@ import ( const ( defaultTimeout = 30 * time.Second - nodeStartTime = 10 * time.Second + nodeStartTime = 7 * time.Second ) // ContainerizedNode is an interface for a containerized network. diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 084b2e0bae..717041cd9c 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index fdaa68b762..ebd87aefd7 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -107,8 +107,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/e2e/precompile/polard/config/app.toml b/e2e/precompile/polard/config/app.toml index f48cfbbdcf..a7615f28d7 100644 --- a/e2e/precompile/polard/config/app.toml +++ b/e2e/precompile/polard/config/app.toml @@ -8,7 +8,11 @@ # The minimum gas prices a validator is willing to accept for processing a # transaction. A transaction's fees must meet the minimum of any denomination # specified in this config (e.g. 0.25token1;0.0001token2). -minimum-gas-prices = "0abera" +minimum-gas-prices = "0stake" + +# The maximum gas a query coming over rest/grpc may consume. +# If this is set to zero, the query can consume an unbounded amount of gas. +query-gas-limit = "0" # default: the last 362880 states are kept, pruning at 10 block intervals # nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) @@ -60,20 +64,15 @@ inter-block-cache = true index-events = [] # IavlCacheSize set the size of the iavl tree cache (in number of nodes). -iavl-cache-size = 781250 +iavl-cache-size = 10000 # IAVLDisableFastNode enables or disables the fast node feature of IAVL. # Default is false. iavl-disable-fastnode = false -# IAVLLazyLoading enable/disable the lazy loading of iavl store. -# Default is false. -iavl-lazy-loading = false - # AppDBBackend defines the database backend type to use for the application and snapshots DBs. # An empty string indicates that a fallback will be used. -# First fallback is the deprecated compile-time types.DBBackend value. -# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in CometBFT's config.toml. +# The fallback is the db_backend value set in CometBFT's config.toml. app-db-backend = "" ############################################################################### @@ -107,8 +106,7 @@ prometheus-retention-time = 0 # # Example: # [["chain_id", "cosmoshub-1"]] -global-labels = [ -] +global-labels = [] ############################################################################### ### API Configuration ### @@ -123,7 +121,7 @@ enable = false swagger = false # Address defines the API server to listen on. -address = "tcp://0.0.0.0:1317" +address = "tcp://localhost:1317" # MaxOpenConnections defines the number of maximum open connections. max-open-connections = 1000 @@ -150,7 +148,7 @@ enabled-unsafe-cors = false enable = true # Address defines the gRPC server address to bind to. -address = "0.0.0.0:9090" +address = "localhost:9090" # MaxRecvMsgSize defines the max message size in bytes the server can receive. # The default value is 10MB. @@ -223,7 +221,7 @@ stop-node-on-err = true # # Note, this configuration only applies to SDK built-in app-side mempool # implementations. -max-txs = "5000" +max-txs = 5000 ############################################################################### ### Polaris ### @@ -242,6 +240,79 @@ rpc-evm-timeout = "5s" rpc-tx-fee-cap = "1" +[polaris.polar.chain] +chain-id = "2061" + +# Homestead switch block +homestead-block = "0" + +# DAO fork switch block +dao-fork-block = "0" + +# Whether to support DAO fork +dao-fork-support = true + +# EIP150 switch block +eip150-block = "0" + +# EIP155 switch block +eip155-block = "0" + +# EIP158 switch block +eip158-block = "0" + +# Byzanitum switch block +byzantium-block = "0" + +# Constantinople switch block +constantinople-block = "0" + +# Petersburg switch block +petersburg-block = "0" + +# Istanbul switch block +istanbul-block = "0" + +# Muir Glacier switch block +muir-glacier-block = "0" + +# Berlin switch block +berlin-block = "0" + +# London switch block +london-block = "0" + +# Arrow Glacier switch block +arrow-glacier-block = "0" + +# Gray Glacier switch block +gray-glacier-block = "0" + +# Merge Netsplit switch block +merge-netsplit-block = "0" + +# Shanghai switch time (nil == no fork, 0 = already on shanghai) +shanghai-time = "0" + +# Cancun switch time (nil == no fork, 0 = already on cancun) +cancun-time = "null" + +# Prague switch time (nil == no fork, 0 = already on prague) +prague-time = "null" + +# Verkle switch time (nil == no fork, 0 = already on verkle) +verkle-time = "null" + +# Terminal total difficulty +terminal-total-difficulty = "0" + +# Whether terminal total difficulty has passed +terminal-total-difficulty-passed = true + +# DevMode enabled +is-dev-mode = false + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices @@ -265,6 +336,42 @@ max-price = "500000000000" # Prices to ignore for gas price determination ignore-price = "2" +# LegacyTxPool settings +[polaris.polar.legacy-tx-pool] + +# Addresses that should be treated by default as local +locals = [] + +# Whether local transaction handling should be disabled +no-locals = false + +# Journal of local transactions to survive node restarts +journal = "transactions.rlp" + +# Time interval to regenerate the local transaction journal +rejournal = "1h0m0s" + +# Minimum gas price to enforce for acceptance into the pool +price-limit = 1 + +# Minimum price bump percentage to replace an already existing transaction (nonce) +price-bump = 10 + +# Number of executable transaction slots guaranteed per account +account-slots = 16 + +# Maximum number of executable transaction slots for all accounts +account-queue = 64 + +# Maximum number of non-executable transaction slots permitted per account +global-slots = 5120 + +# Maximum number of non-executable transaction slots for all accounts +global-queue = 1024 + +# Maximum amount of time non-executable transaction are queued +lifetime = "3h0m0s" + # Node-specific settings [polaris.node] @@ -381,4 +488,3 @@ write-timeout = "30s" # Timeout for idle HTTP connections idle-timeout = "2m0s" - diff --git a/e2e/precompile/polard/config/config.toml b/e2e/precompile/polard/config/config.toml index 8b30f02c48..608a74f812 100644 --- a/e2e/precompile/polard/config/config.toml +++ b/e2e/precompile/polard/config/config.toml @@ -95,10 +95,16 @@ laddr = "tcp://0.0.0.0:26657" cors_allowed_origins = [] # A list of methods the client is allowed to use with cross-domain requests -cors_allowed_methods = ["HEAD", "GET", "POST", ] +cors_allowed_methods = ["HEAD", "GET", "POST"] # A list of non simple headers the client is allowed to use with cross-domain requests -cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] +cors_allowed_headers = [ + "Origin", + "Accept", + "Content-Type", + "X-Requested-With", + "X-Server-Time", +] # TCP or UNIX socket address for the gRPC server to listen on # NOTE: This server only supports /broadcast_tx_commit @@ -438,7 +444,7 @@ discard_abci_responses = false # - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. # 3) "psql" - the indexer services backed by PostgreSQL. # When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. -indexer = "kv" +indexer = "null" # The PostgreSQL connection configuration, the connection format: # postgresql://:@:/? diff --git a/e2e/precompile/polard/config/genesis.json b/e2e/precompile/polard/config/genesis.json index 5c43e126d9..6a25263e16 100644 --- a/e2e/precompile/polard/config/genesis.json +++ b/e2e/precompile/polard/config/genesis.json @@ -394,7 +394,6 @@ "arrowGlacierBlock": 0, "grayGlacierBlock": 0, "mergeNetsplitBlock": 0, - "shanghaiTime": 0, "terminalTotalDifficulty": 0, "terminalTotalDifficultyPassed": true }, diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 1f30dc3a69..d14ebda30a 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -42,13 +42,9 @@ import ( "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - testdata_pulsar "github.com/cosmos/cosmos-sdk/testutil/testdata/testpb" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" @@ -61,11 +57,14 @@ import ( slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/ethereum/go-ethereum/node" + + "pkg.berachain.dev/polaris/cosmos/abci/prepare" evmconfig "pkg.berachain.dev/polaris/cosmos/config" ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" + "pkg.berachain.dev/polaris/cosmos/txpool" evmante "pkg.berachain.dev/polaris/cosmos/x/evm/ante" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" - evmmempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" ) @@ -104,9 +103,8 @@ type SimApp struct { // polaris keepers EVMKeeper *evmkeeper.Keeper - - // simulation manager - sm *module.SimulationManager + pp *prepare.Handler + mp *txpool.Mempool } //nolint:gochecknoinits // from sdk. @@ -132,9 +130,8 @@ func NewPolarisApp( baseAppOptions ...func(*baseapp.BaseApp), ) *SimApp { var ( - app = &SimApp{} - appBuilder *runtime.AppBuilder - ethTxMempool = evmmempool.NewPolarisEthereumTxPool() + app = &SimApp{} + appBuilder *runtime.AppBuilder // merge the AppConfig and other configuration in one config appConfig = depinject.Configs( MakeAppConfig(bech32Prefix), @@ -144,10 +141,10 @@ func NewPolarisApp( appOpts, // supply the logger logger, - // supply the mempool - ethTxMempool, // ADVANCED CONFIGURATION + PolarisConfigFn(evmconfig.MustReadConfigFromAppOpts(appOpts)), PrecompilesToInject(app), + QueryContextFn(app), // // AUTH // @@ -196,94 +193,51 @@ func NewPolarisApp( panic(err) } - // Below we could construct and set an application specific mempool and - // ABCI 1.0 PrepareProposal and ProcessProposal handlers. These defaults are - // already set in the SDK's BaseApp, this shows an example of how to override - // them. - // - // Example: - // - // app.App = appBuilder.Build(...) - // nonceMempool := mempool.NewSenderNonceMempool() - // abciPropHandler := NewDefaultProposalHandler(nonceMempool, app.App.BaseApp) - // - // app.App.BaseApp.SetMempool(nonceMempool) - // app.App.BaseApp.SetPrepareProposal(abciPropHandler.PrepareProposalHandler()) - // app.App.BaseApp.SetProcessProposal(abciPropHandler.ProcessProposalHandler()) - // - // Alternatively, you can construct BaseApp options, append those to - // baseAppOptions and pass them to the appBuilder. - // - // Example: - // - // prepareOpt = func(app *baseapp.BaseApp) { - // abciPropHandler := baseapp.NewDefaultProposalHandler(nonceMempool, app) - // app.SetPrepareProposal(abciPropHandler.PrepareProposalHandler()) - // } - // baseAppOptions = append(baseAppOptions, prepareOpt) - - app.App = appBuilder.Build(db, traceStore, append(baseAppOptions, baseapp.SetMempool(ethTxMempool))...) - - // read oracle config from app-opts, and construct oracle service - polarisCfg, err := evmconfig.ReadConfigFromAppOpts(appOpts) - if err != nil { - panic(err) - } + // Build the app using the app builder. + app.App = appBuilder.Build(db, traceStore, baseAppOptions...) - // TODO: MOVE EVM SETUP - // ----- BEGIN EVM SETUP ---------------------------------------------- + // SetupPrecompiles is used to setup the precompile contracts post depinject. + app.EVMKeeper.SetupPrecompiles() - // setup evm keeper and all of its plugins. - app.EVMKeeper.Setup( - polarisCfg, - app.CreateQueryContext, - logger, - ) - opt := ante.HandlerOptions{ - AccountKeeper: app.AccountKeeper, - BankKeeper: app.BankKeeper, - SignModeHandler: app.TxConfig().SignModeHandler(), - FeegrantKeeper: nil, - SigGasConsumer: evmante.SigVerificationGasConsumer, - } + // Setup TxPool Wrapper + app.mp = txpool.New(app.EVMKeeper.Polaris().TxPool()) + app.SetMempool(app.mp) + + // Setup Prepare Proposal + app.pp = prepare.NewHandler(app.EVMKeeper.Polaris(), app) + app.SetPrepareProposal(app.pp.PrepareProposal) + + // Setup Custom Ante Handler ch, _ := evmante.NewAnteHandler( - opt, + ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + SignModeHandler: app.TxConfig().SignModeHandler(), + FeegrantKeeper: nil, + SigGasConsumer: evmante.SigVerificationGasConsumer, + }, ) app.SetAnteHandler( ch, ) + + // Register eth_secp256k1 keys ethcryptocodec.RegisterInterfaces(app.interfaceRegistry) // ----- END EVM SETUP ------------------------------------------------- // register streaming services - if err = app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { + if err := app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { panic(err) } /**** Module Options ****/ - app.ModuleManager.RegisterInvariants(app.CrisisKeeper) // RegisterUpgradeHandlers is used for registering any on-chain upgrades. app.RegisterUpgradeHandlers() - // add test gRPC service for testing gRPC queries in isolation - testdata_pulsar.RegisterQueryServer(app.GRPCQueryRouter(), testdata_pulsar.QueryImpl{}) - - // create the simulation manager and define the order of the modules for deterministic simulations - // - // NOTE: this is not required apps that don't use the simulator for fuzz testing - // transactions - overrideModules := map[string]module.AppModuleSimulation{ - authtypes.ModuleName: auth.NewAppModule(app.appCodec, - app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), - } - app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, overrideModules) - - app.sm.RegisterStoreDecoders() - - if err = app.Load(loadLatest); err != nil { + if err := app.Load(loadLatest); err != nil { panic(err) } @@ -352,7 +306,7 @@ func (app *SimApp) GetSubspace(moduleName string) paramstypes.Subspace { // SimulationManager implements the SimulationApp interface. func (app *SimApp) SimulationManager() *module.SimulationManager { - return app.sm + return nil } // RegisterAPIRoutes registers all application module routes with the provided @@ -363,12 +317,24 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil { panic(err) } - app.EVMKeeper.SetClientCtx(apiSvr.ClientCtx) + + // Create a TxSerializer. + serializer := evmtypes.NewSerializer(apiSvr.ClientCtx.TxConfig) + + // Initialize services. + app.pp.Init(serializer) + app.mp.Init(app.Logger(), apiSvr.ClientCtx, serializer) + + // Register services with Polaris. + app.EVMKeeper.RegisterServices(apiSvr.ClientCtx, []node.Lifecycle{ + app.mp, + }) } +// Close shuts down the application. func (app *SimApp) Close() error { - if pl := app.EVMKeeper.GetPolaris(); pl != nil { - return pl.StopServices() + if pl := app.EVMKeeper.Polaris(); pl != nil { + return pl.Close() } return nil } diff --git a/e2e/testapp/docker/local/config/app.toml b/e2e/testapp/docker/local/config/app.toml index a9cc4f72e9..a7615f28d7 100644 --- a/e2e/testapp/docker/local/config/app.toml +++ b/e2e/testapp/docker/local/config/app.toml @@ -106,8 +106,7 @@ prometheus-retention-time = 0 # # Example: # [["chain_id", "cosmoshub-1"]] -global-labels = [ -] +global-labels = [] ############################################################################### ### API Configuration ### @@ -241,6 +240,79 @@ rpc-evm-timeout = "5s" rpc-tx-fee-cap = "1" +[polaris.polar.chain] +chain-id = "2061" + +# Homestead switch block +homestead-block = "0" + +# DAO fork switch block +dao-fork-block = "0" + +# Whether to support DAO fork +dao-fork-support = true + +# EIP150 switch block +eip150-block = "0" + +# EIP155 switch block +eip155-block = "0" + +# EIP158 switch block +eip158-block = "0" + +# Byzanitum switch block +byzantium-block = "0" + +# Constantinople switch block +constantinople-block = "0" + +# Petersburg switch block +petersburg-block = "0" + +# Istanbul switch block +istanbul-block = "0" + +# Muir Glacier switch block +muir-glacier-block = "0" + +# Berlin switch block +berlin-block = "0" + +# London switch block +london-block = "0" + +# Arrow Glacier switch block +arrow-glacier-block = "0" + +# Gray Glacier switch block +gray-glacier-block = "0" + +# Merge Netsplit switch block +merge-netsplit-block = "0" + +# Shanghai switch time (nil == no fork, 0 = already on shanghai) +shanghai-time = "0" + +# Cancun switch time (nil == no fork, 0 = already on cancun) +cancun-time = "null" + +# Prague switch time (nil == no fork, 0 = already on prague) +prague-time = "null" + +# Verkle switch time (nil == no fork, 0 = already on verkle) +verkle-time = "null" + +# Terminal total difficulty +terminal-total-difficulty = "0" + +# Whether terminal total difficulty has passed +terminal-total-difficulty-passed = true + +# DevMode enabled +is-dev-mode = false + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices @@ -264,6 +336,42 @@ max-price = "500000000000" # Prices to ignore for gas price determination ignore-price = "2" +# LegacyTxPool settings +[polaris.polar.legacy-tx-pool] + +# Addresses that should be treated by default as local +locals = [] + +# Whether local transaction handling should be disabled +no-locals = false + +# Journal of local transactions to survive node restarts +journal = "transactions.rlp" + +# Time interval to regenerate the local transaction journal +rejournal = "1h0m0s" + +# Minimum gas price to enforce for acceptance into the pool +price-limit = 1 + +# Minimum price bump percentage to replace an already existing transaction (nonce) +price-bump = 10 + +# Number of executable transaction slots guaranteed per account +account-slots = 16 + +# Maximum number of executable transaction slots for all accounts +account-queue = 64 + +# Maximum number of non-executable transaction slots permitted per account +global-slots = 5120 + +# Maximum number of non-executable transaction slots for all accounts +global-queue = 1024 + +# Maximum amount of time non-executable transaction are queued +lifetime = "3h0m0s" + # Node-specific settings [polaris.node] @@ -380,4 +488,3 @@ write-timeout = "30s" # Timeout for idle HTTP connections idle-timeout = "2m0s" - diff --git a/e2e/testapp/docker/local/config/config.toml b/e2e/testapp/docker/local/config/config.toml index aaa9a6f947..b34bd15644 100644 --- a/e2e/testapp/docker/local/config/config.toml +++ b/e2e/testapp/docker/local/config/config.toml @@ -95,10 +95,16 @@ laddr = "tcp://127.0.0.1:26657" cors_allowed_origins = [] # A list of methods the client is allowed to use with cross-domain requests -cors_allowed_methods = ["HEAD", "GET", "POST", ] +cors_allowed_methods = ["HEAD", "GET", "POST"] # A list of non simple headers the client is allowed to use with cross-domain requests -cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] +cors_allowed_headers = [ + "Origin", + "Accept", + "Content-Type", + "X-Requested-With", + "X-Server-Time", +] # TCP or UNIX socket address for the gRPC server to listen on # NOTE: This server only supports /broadcast_tx_commit @@ -428,7 +434,7 @@ discard_abci_responses = false # - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. # 3) "psql" - the indexer services backed by PostgreSQL. # When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. -indexer = "kv" +indexer = "null" # The PostgreSQL connection configuration, the connection format: # postgresql://:@:/? diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index 092d1d2eb4..4a7d60d835 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -65,9 +65,6 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) ./bin/polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" - cp ./e2e/testapp/docker/local/config/app.toml "$APP_TOML" - cp ./e2e/testapp/docker/local/config/config.toml "$CONFIG_TOML" - # Set client config ./bin/polard config set client keyring-backend $KEYRING --home "$HOMEDIR" ./bin/polard config set client chain-id "$CHAINID" --home "$HOMEDIR" diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index dc17268fac..6d7c0c0785 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) @@ -15,8 +15,8 @@ require ( cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 - pkg.berachain.dev/polaris/cosmos v0.0.0-20230925142347-326426fa61f6 - pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 + pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 ) require ( @@ -37,7 +37,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.0-rc.1 github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/go-ethereum v1.13.1 github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect @@ -272,8 +272,8 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a // indirect - pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 // indirect + pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index c4ed1c865a..49fab34867 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -276,8 +276,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -1885,14 +1884,11 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230925142347-326426fa61f6 h1:kMeJg5obVNhBHQCMnztPTv1nJGgf6lQSHu73orpgQ6U= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230925142347-326426fa61f6/go.mod h1:CI85P35I3drHdlokROrjQYLXQphPZo/jaxGQIl6mEpg= -pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6 h1:0dIN2V+giVZmUOPvDyOxnXfTgZIoBOqjZTpXn704edY= -pkg.berachain.dev/polaris/eth v0.0.0-20230925142347-326426fa61f6/go.mod h1:XDIlhb6eOL2Rq81b0OPzke5IFQyqgbD7f60NRomcmXc= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 h1:U5wpPv/ZitKJCZkHWVsWOzAfX3orlnHHhn5rYGJ1DPA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 h1:J/d2QQVxlFufmVNrK07uvnMbCFoIX8T0D7YRxvu0ntg= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/e2e/testapp/precompiles.go b/e2e/testapp/helpers.go similarity index 80% rename from e2e/testapp/precompiles.go rename to e2e/testapp/helpers.go index 4e6e4196cf..30a579431a 100644 --- a/e2e/testapp/precompiles.go +++ b/e2e/testapp/helpers.go @@ -21,10 +21,12 @@ package testapp import ( + sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + evmconfig "pkg.berachain.dev/polaris/cosmos/config" bankprecompile "pkg.berachain.dev/polaris/cosmos/precompile/bank" distrprecompile "pkg.berachain.dev/polaris/cosmos/precompile/distribution" govprecompile "pkg.berachain.dev/polaris/cosmos/precompile/governance" @@ -64,3 +66,19 @@ func PrecompilesToInject(app *SimApp, customPcs ...ethprecompile.Registrable) fu return pcs } } + +// PrecompilesToInject returns a function that provides the initialization of the standard +// set of precompiles. +func QueryContextFn(app *SimApp) func() func(height int64, prove bool) (sdk.Context, error) { + return func() func(height int64, prove bool) (sdk.Context, error) { + return app.BaseApp.CreateQueryContext + } +} + +// PolarisConfigFn returns a function that provides the initialization of the standard +// set of precompiles. +func PolarisConfigFn(cfg *evmconfig.Config) func() *evmconfig.Config { + return func() *evmconfig.Config { + return cfg + } +} diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 7255d9a8e0..728edec249 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -51,6 +51,7 @@ import ( "github.com/cosmos/cosmos-sdk/server" serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" @@ -63,7 +64,6 @@ import ( evmconfig "pkg.berachain.dev/polaris/cosmos/config" ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" "pkg.berachain.dev/polaris/cosmos/crypto/keyring" - evmmempool "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/txpool/mempool" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" testapp "pkg.berachain.dev/polaris/e2e/testapp" ) @@ -83,7 +83,12 @@ func NewRootCmd() *cobra.Command { if err := depinject.Inject(depinject.Configs( testapp.MakeAppConfig(""), - depinject.Supply(evmmempool.NewPolarisEthereumTxPool(), log.NewNopLogger()), + depinject.Supply( + testapp.PolarisConfigFn(evmconfig.DefaultConfig()), + testapp.QueryContextFn((&testapp.SimApp{})), + log.NewNopLogger(), + simtestutil.NewAppOptionsWithFlagHome(tempDir()), + ), depinject.Provide(evmtypes.ProvideEthereumTransactionGetSigners)), &interfaceRegistry, &appCodec, @@ -356,3 +361,13 @@ func appExport( return testApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } + +var tempDir = func() string { + dir, err := os.MkdirTemp("", "polard") + if err != nil { + dir = testapp.DefaultNodeHome + } + defer os.RemoveAll(dir) + + return dir +} diff --git a/eth/accounts/abi/errors.go b/eth/accounts/abi/errors.go index a398feb6a5..3aa854521e 100644 --- a/eth/accounts/abi/errors.go +++ b/eth/accounts/abi/errors.go @@ -23,7 +23,9 @@ package abi import "errors" var ( - // ErrTooManyIndexedArgs is returned when the number of indexed arguments in an event exceeds - // the maximum allowed by the Ethereum event log. - ErrTooManyIndexedArgs = errors.New("number of indexed arguments is more than allowed by Eth event log") + // ErrTooManyIndexedArgs is returned when the number of indexed arguments in an + // event exceeds the maximum allowed by the Ethereum event log. + ErrTooManyIndexedArgs = errors.New( + "number of indexed arguments is more than allowed by Eth event log", + ) ) diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 44c9ecffc1..df9c5a24d0 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -21,6 +21,9 @@ package core import ( + "errors" + + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/vm" ) @@ -28,13 +31,19 @@ import ( // ChainResources is the interface that defines functions for code paths within the chain to acquire // resources to use in execution such as StateDBss and EVMss. type ChainResources interface { - StateAtBlockNumber(uint64) (vm.GethStateDB, error) + StateAtBlockNumber(uint64) (state.StateDBI, error) + StateAt(root common.Hash) (state.StateDBI, error) GetVMConfig() *vm.Config } +// StateAt returns a statedb configured to read what the state of the blockchain is/was at a given. +func (bc *blockchain) StateAt(common.Hash) (state.StateDBI, error) { + return nil, errors.New("not implemented") +} + // StateAtBlockNumber returns a statedb configured to read what the state of the blockchain is/was // at a given block number. -func (bc *blockchain) StateAtBlockNumber(number uint64) (vm.GethStateDB, error) { +func (bc *blockchain) StateAtBlockNumber(number uint64) (state.StateDBI, error) { sp, err := bc.sp.StateAtBlockNumber(number) if err != nil { return nil, err diff --git a/eth/core/genesis.go b/eth/core/genesis.go index f9b01ab304..c66f3dfb32 100644 --- a/eth/core/genesis.go +++ b/eth/core/genesis.go @@ -28,7 +28,6 @@ import ( "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/common/hexutil" "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/params" ) type ( @@ -39,9 +38,6 @@ type ( // DefaultGenesis is the default genesis block used by Polaris. var DefaultGenesis = &core.Genesis{ - // Genesis Config - Config: params.DefaultChainConfig, - // Genesis Block Nonce: 0, Timestamp: 0, @@ -50,7 +46,6 @@ var DefaultGenesis = &core.Genesis{ Difficulty: big.NewInt(0), Mixhash: common.Hash{}, Coinbase: common.Address{}, - BaseFee: big.NewInt(int64(params.InitialBaseFee)), // Genesis Accounts Alloc: core.GenesisAlloc{ @@ -59,12 +54,23 @@ var DefaultGenesis = &core.Genesis{ Balance: big.NewInt(0).Mul(big.NewInt(5e18), big.NewInt(100)), //nolint:gomnd // its okay. }, }, + + // These fields are used for consensus tests. Please don't use them + // in actual genesis blocks. + Number: 0, + GasUsed: 0, + ParentHash: common.Hash{}, + BaseFee: nil, + ExcessBlobGas: nil, + BlobGasUsed: nil, + + // These fields are used for consensus tests. Please don't use them + // in actual genesis blocks. } // UnmarshalGenesisHeader sets the fields of the given header into the Genesis struct. func UnmarshalGenesisHeader(header *types.Header, gen *Genesis) { // Note: cannot set the state root on the genesis. - gen.Number = header.Number.Uint64() gen.Nonce = header.Nonce.Uint64() gen.Timestamp = header.Time gen.ParentHash = header.ParentHash @@ -75,4 +81,5 @@ func UnmarshalGenesisHeader(header *types.Header, gen *Genesis) { gen.Difficulty = header.Difficulty gen.Mixhash = header.MixDigest gen.Coinbase = header.Coinbase + gen.Number = header.Number.Uint64() } diff --git a/eth/core/host.go b/eth/core/host.go index 360c1a1098..2e90ea7545 100644 --- a/eth/core/host.go +++ b/eth/core/host.go @@ -25,7 +25,6 @@ import ( "math/big" "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/event" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/precompile" @@ -51,8 +50,6 @@ type PolarisHostChain interface { GetPrecompilePlugin() PrecompilePlugin // GetStatePlugin returns the `StatePlugin` of the Polaris host chain. GetStatePlugin() StatePlugin - // GetTxPoolPlugin returns the `TxPoolPlugin` of the Polaris host chain. - GetTxPoolPlugin() TxPoolPlugin } // ============================================================================= @@ -131,31 +128,6 @@ type ( // StateAtBlockNumber returns the state at the given block height. StateAtBlockNumber(uint64) (StatePlugin, error) } - - // TxPoolPlugin defines the methods that the chain running Polaris EVM should implement to - // support the transaction pool. - TxPoolPlugin interface { - // SetBaseFee sets the base fee of the transaction pool. - SetBaseFee(*big.Int) - // SendTx submits the tx to the transaction pool. - SendTx(tx *types.Transaction) error - // Pending returns all pending transactions in the transaction pool. - Pending(bool) map[common.Address][]*types.Transaction - // Get returns the transaction from the pool with the given hash. - Get(common.Hash) *types.Transaction - // Nonce returns the nonce of the given address in the transaction pool. - Nonce(common.Address) uint64 - // SubscribeNewTxsEvent returns a subscription with the new txs event channel. - SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription - // Stats returns the number of currently pending and queued (locally created) txs. - Stats() (int, int) - // Content retrieves the data content of the transaction pool, returning all the pending as - // well as queued transactions, grouped by account and nonce. - Content() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) - // ContentFrom retrieves the data content of the transaction pool, returning the pending - // as well as queued transactions of this address, grouped by nonce. - ContentFrom(addr common.Address) ([]*types.Transaction, []*types.Transaction) - } ) // ============================================================================= diff --git a/eth/core/mock/host.go b/eth/core/mock/host.go index 0f82892cf8..b6f5690f3f 100644 --- a/eth/core/mock/host.go +++ b/eth/core/mock/host.go @@ -26,7 +26,7 @@ import "pkg.berachain.dev/polaris/eth/core" func NewMockHostAndPlugins() ( *PolarisHostChainMock, *BlockPluginMock, *ConfigurationPluginMock, *GasPluginMock, - *HistoricalPluginMock, *PrecompilePluginMock, *StatePluginMock, *TxPoolPluginMock, + *HistoricalPluginMock, *PrecompilePluginMock, *StatePluginMock, ) { bp := NewBlockPluginMock() cp := NewConfigurationPluginMock() @@ -34,7 +34,6 @@ func NewMockHostAndPlugins() ( hp := NewHistoricalPluginMock() pp := NewPrecompilePluginMock() sp := NewStatePluginMock() - tp := &TxPoolPluginMock{} mockedPolarisHostChain := &PolarisHostChainMock{ GetBlockPluginFunc: func() core.BlockPlugin { return bp @@ -54,9 +53,6 @@ func NewMockHostAndPlugins() ( GetStatePluginFunc: func() core.StatePlugin { return sp }, - GetTxPoolPluginFunc: func() core.TxPoolPlugin { - return tp - }, } - return mockedPolarisHostChain, bp, cp, gp, hp, pp, sp, tp + return mockedPolarisHostChain, bp, cp, gp, hp, pp, sp } diff --git a/eth/core/mock/host.mock.go b/eth/core/mock/host.mock.go index 97e58c4cd1..e0067fcdbf 100644 --- a/eth/core/mock/host.mock.go +++ b/eth/core/mock/host.mock.go @@ -40,9 +40,6 @@ var _ core.PolarisHostChain = &PolarisHostChainMock{} // GetStatePluginFunc: func() core.StatePlugin { // panic("mock out the GetStatePlugin method") // }, -// GetTxPoolPluginFunc: func() core.TxPoolPlugin { -// panic("mock out the GetTxPoolPlugin method") -// }, // } // // // use mockedPolarisHostChain in code that requires core.PolarisHostChain @@ -71,9 +68,6 @@ type PolarisHostChainMock struct { // GetStatePluginFunc mocks the GetStatePlugin method. GetStatePluginFunc func() core.StatePlugin - // GetTxPoolPluginFunc mocks the GetTxPoolPlugin method. - GetTxPoolPluginFunc func() core.TxPoolPlugin - // calls tracks calls to the methods. calls struct { // GetBlockPlugin holds details about calls to the GetBlockPlugin method. @@ -97,9 +91,6 @@ type PolarisHostChainMock struct { // GetStatePlugin holds details about calls to the GetStatePlugin method. GetStatePlugin []struct { } - // GetTxPoolPlugin holds details about calls to the GetTxPoolPlugin method. - GetTxPoolPlugin []struct { - } } lockGetBlockPlugin sync.RWMutex lockGetConfigurationPlugin sync.RWMutex @@ -108,7 +99,6 @@ type PolarisHostChainMock struct { lockGetHistoricalPlugin sync.RWMutex lockGetPrecompilePlugin sync.RWMutex lockGetStatePlugin sync.RWMutex - lockGetTxPoolPlugin sync.RWMutex } // GetBlockPlugin calls GetBlockPluginFunc. @@ -299,30 +289,3 @@ func (mock *PolarisHostChainMock) GetStatePluginCalls() []struct { mock.lockGetStatePlugin.RUnlock() return calls } - -// GetTxPoolPlugin calls GetTxPoolPluginFunc. -func (mock *PolarisHostChainMock) GetTxPoolPlugin() core.TxPoolPlugin { - if mock.GetTxPoolPluginFunc == nil { - panic("PolarisHostChainMock.GetTxPoolPluginFunc: method is nil but PolarisHostChain.GetTxPoolPlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetTxPoolPlugin.Lock() - mock.calls.GetTxPoolPlugin = append(mock.calls.GetTxPoolPlugin, callInfo) - mock.lockGetTxPoolPlugin.Unlock() - return mock.GetTxPoolPluginFunc() -} - -// GetTxPoolPluginCalls gets all the calls that were made to GetTxPoolPlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetTxPoolPluginCalls()) -func (mock *PolarisHostChainMock) GetTxPoolPluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetTxPoolPlugin.RLock() - calls = mock.calls.GetTxPoolPlugin - mock.lockGetTxPoolPlugin.RUnlock() - return calls -} diff --git a/eth/core/mock/txpool_plugin.go b/eth/core/mock/txpool_plugin.go deleted file mode 100644 index 6d4f07874e..0000000000 --- a/eth/core/mock/txpool_plugin.go +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mock - -//go:generate moq -out ./txpool_plugin.mock.go -pkg mock ../ TxPoolPlugin diff --git a/eth/core/mock/txpool_plugin.mock.go b/eth/core/mock/txpool_plugin.mock.go deleted file mode 100644 index 0f4d863af5..0000000000 --- a/eth/core/mock/txpool_plugin.mock.go +++ /dev/null @@ -1,418 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package mock - -import ( - "github.com/ethereum/go-ethereum/common" - ethereumcore "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" - "math/big" - ethcore "pkg.berachain.dev/polaris/eth/core" - "sync" -) - -// Ensure, that TxPoolPluginMock does implement ethcore.TxPoolPlugin. -// If this is not the case, regenerate this file with moq. -var _ ethcore.TxPoolPlugin = &TxPoolPluginMock{} - -// TxPoolPluginMock is a mock implementation of ethcore.TxPoolPlugin. -// -// func TestSomethingThatUsesTxPoolPlugin(t *testing.T) { -// -// // make and configure a mocked ethcore.TxPoolPlugin -// mockedTxPoolPlugin := &TxPoolPluginMock{ -// ContentFunc: func() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) { -// panic("mock out the Content method") -// }, -// ContentFromFunc: func(addr common.Address) ([]*types.Transaction, []*types.Transaction) { -// panic("mock out the ContentFrom method") -// }, -// GetFunc: func(hash common.Hash) *types.Transaction { -// panic("mock out the Get method") -// }, -// NonceFunc: func(address common.Address) uint64 { -// panic("mock out the Nonce method") -// }, -// PendingFunc: func(b bool) map[common.Address][]*types.Transaction { -// panic("mock out the Pending method") -// }, -// SendTxFunc: func(tx *types.Transaction) error { -// panic("mock out the SendTx method") -// }, -// SetBaseFeeFunc: func(intMoqParam *big.Int) { -// panic("mock out the SetBaseFee method") -// }, -// StatsFunc: func() (int, int) { -// panic("mock out the Stats method") -// }, -// SubscribeNewTxsEventFunc: func(ch chan<- ethereumcore.NewTxsEvent) event.Subscription { -// panic("mock out the SubscribeNewTxsEvent method") -// }, -// } -// -// // use mockedTxPoolPlugin in code that requires ethcore.TxPoolPlugin -// // and then make assertions. -// -// } -type TxPoolPluginMock struct { - // ContentFunc mocks the Content method. - ContentFunc func() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) - - // ContentFromFunc mocks the ContentFrom method. - ContentFromFunc func(addr common.Address) ([]*types.Transaction, []*types.Transaction) - - // GetFunc mocks the Get method. - GetFunc func(hash common.Hash) *types.Transaction - - // NonceFunc mocks the Nonce method. - NonceFunc func(address common.Address) uint64 - - // PendingFunc mocks the Pending method. - PendingFunc func(b bool) map[common.Address][]*types.Transaction - - // SendTxFunc mocks the SendTx method. - SendTxFunc func(tx *types.Transaction) error - - // SetBaseFeeFunc mocks the SetBaseFee method. - SetBaseFeeFunc func(intMoqParam *big.Int) - - // StatsFunc mocks the Stats method. - StatsFunc func() (int, int) - - // SubscribeNewTxsEventFunc mocks the SubscribeNewTxsEvent method. - SubscribeNewTxsEventFunc func(ch chan<- ethereumcore.NewTxsEvent) event.Subscription - - // calls tracks calls to the methods. - calls struct { - // Content holds details about calls to the Content method. - Content []struct { - } - // ContentFrom holds details about calls to the ContentFrom method. - ContentFrom []struct { - // Addr is the addr argument value. - Addr common.Address - } - // Get holds details about calls to the Get method. - Get []struct { - // Hash is the hash argument value. - Hash common.Hash - } - // Nonce holds details about calls to the Nonce method. - Nonce []struct { - // Address is the address argument value. - Address common.Address - } - // Pending holds details about calls to the Pending method. - Pending []struct { - // B is the b argument value. - B bool - } - // SendTx holds details about calls to the SendTx method. - SendTx []struct { - // Tx is the tx argument value. - Tx *types.Transaction - } - // SetBaseFee holds details about calls to the SetBaseFee method. - SetBaseFee []struct { - // IntMoqParam is the intMoqParam argument value. - IntMoqParam *big.Int - } - // Stats holds details about calls to the Stats method. - Stats []struct { - } - // SubscribeNewTxsEvent holds details about calls to the SubscribeNewTxsEvent method. - SubscribeNewTxsEvent []struct { - // Ch is the ch argument value. - Ch chan<- ethereumcore.NewTxsEvent - } - } - lockContent sync.RWMutex - lockContentFrom sync.RWMutex - lockGet sync.RWMutex - lockNonce sync.RWMutex - lockPending sync.RWMutex - lockSendTx sync.RWMutex - lockSetBaseFee sync.RWMutex - lockStats sync.RWMutex - lockSubscribeNewTxsEvent sync.RWMutex -} - -// Content calls ContentFunc. -func (mock *TxPoolPluginMock) Content() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) { - if mock.ContentFunc == nil { - panic("TxPoolPluginMock.ContentFunc: method is nil but TxPoolPlugin.Content was just called") - } - callInfo := struct { - }{} - mock.lockContent.Lock() - mock.calls.Content = append(mock.calls.Content, callInfo) - mock.lockContent.Unlock() - return mock.ContentFunc() -} - -// ContentCalls gets all the calls that were made to Content. -// Check the length with: -// -// len(mockedTxPoolPlugin.ContentCalls()) -func (mock *TxPoolPluginMock) ContentCalls() []struct { -} { - var calls []struct { - } - mock.lockContent.RLock() - calls = mock.calls.Content - mock.lockContent.RUnlock() - return calls -} - -// ContentFrom calls ContentFromFunc. -func (mock *TxPoolPluginMock) ContentFrom(addr common.Address) ([]*types.Transaction, []*types.Transaction) { - if mock.ContentFromFunc == nil { - panic("TxPoolPluginMock.ContentFromFunc: method is nil but TxPoolPlugin.ContentFrom was just called") - } - callInfo := struct { - Addr common.Address - }{ - Addr: addr, - } - mock.lockContentFrom.Lock() - mock.calls.ContentFrom = append(mock.calls.ContentFrom, callInfo) - mock.lockContentFrom.Unlock() - return mock.ContentFromFunc(addr) -} - -// ContentFromCalls gets all the calls that were made to ContentFrom. -// Check the length with: -// -// len(mockedTxPoolPlugin.ContentFromCalls()) -func (mock *TxPoolPluginMock) ContentFromCalls() []struct { - Addr common.Address -} { - var calls []struct { - Addr common.Address - } - mock.lockContentFrom.RLock() - calls = mock.calls.ContentFrom - mock.lockContentFrom.RUnlock() - return calls -} - -// Get calls GetFunc. -func (mock *TxPoolPluginMock) Get(hash common.Hash) *types.Transaction { - if mock.GetFunc == nil { - panic("TxPoolPluginMock.GetFunc: method is nil but TxPoolPlugin.Get was just called") - } - callInfo := struct { - Hash common.Hash - }{ - Hash: hash, - } - mock.lockGet.Lock() - mock.calls.Get = append(mock.calls.Get, callInfo) - mock.lockGet.Unlock() - return mock.GetFunc(hash) -} - -// GetCalls gets all the calls that were made to Get. -// Check the length with: -// -// len(mockedTxPoolPlugin.GetCalls()) -func (mock *TxPoolPluginMock) GetCalls() []struct { - Hash common.Hash -} { - var calls []struct { - Hash common.Hash - } - mock.lockGet.RLock() - calls = mock.calls.Get - mock.lockGet.RUnlock() - return calls -} - -// Nonce calls NonceFunc. -func (mock *TxPoolPluginMock) Nonce(address common.Address) uint64 { - if mock.NonceFunc == nil { - panic("TxPoolPluginMock.NonceFunc: method is nil but TxPoolPlugin.Nonce was just called") - } - callInfo := struct { - Address common.Address - }{ - Address: address, - } - mock.lockNonce.Lock() - mock.calls.Nonce = append(mock.calls.Nonce, callInfo) - mock.lockNonce.Unlock() - return mock.NonceFunc(address) -} - -// NonceCalls gets all the calls that were made to Nonce. -// Check the length with: -// -// len(mockedTxPoolPlugin.NonceCalls()) -func (mock *TxPoolPluginMock) NonceCalls() []struct { - Address common.Address -} { - var calls []struct { - Address common.Address - } - mock.lockNonce.RLock() - calls = mock.calls.Nonce - mock.lockNonce.RUnlock() - return calls -} - -// Pending calls PendingFunc. -func (mock *TxPoolPluginMock) Pending(b bool) map[common.Address][]*types.Transaction { - if mock.PendingFunc == nil { - panic("TxPoolPluginMock.PendingFunc: method is nil but TxPoolPlugin.Pending was just called") - } - callInfo := struct { - B bool - }{ - B: b, - } - mock.lockPending.Lock() - mock.calls.Pending = append(mock.calls.Pending, callInfo) - mock.lockPending.Unlock() - return mock.PendingFunc(b) -} - -// PendingCalls gets all the calls that were made to Pending. -// Check the length with: -// -// len(mockedTxPoolPlugin.PendingCalls()) -func (mock *TxPoolPluginMock) PendingCalls() []struct { - B bool -} { - var calls []struct { - B bool - } - mock.lockPending.RLock() - calls = mock.calls.Pending - mock.lockPending.RUnlock() - return calls -} - -// SendTx calls SendTxFunc. -func (mock *TxPoolPluginMock) SendTx(tx *types.Transaction) error { - if mock.SendTxFunc == nil { - panic("TxPoolPluginMock.SendTxFunc: method is nil but TxPoolPlugin.SendTx was just called") - } - callInfo := struct { - Tx *types.Transaction - }{ - Tx: tx, - } - mock.lockSendTx.Lock() - mock.calls.SendTx = append(mock.calls.SendTx, callInfo) - mock.lockSendTx.Unlock() - return mock.SendTxFunc(tx) -} - -// SendTxCalls gets all the calls that were made to SendTx. -// Check the length with: -// -// len(mockedTxPoolPlugin.SendTxCalls()) -func (mock *TxPoolPluginMock) SendTxCalls() []struct { - Tx *types.Transaction -} { - var calls []struct { - Tx *types.Transaction - } - mock.lockSendTx.RLock() - calls = mock.calls.SendTx - mock.lockSendTx.RUnlock() - return calls -} - -// SetBaseFee calls SetBaseFeeFunc. -func (mock *TxPoolPluginMock) SetBaseFee(intMoqParam *big.Int) { - if mock.SetBaseFeeFunc == nil { - panic("TxPoolPluginMock.SetBaseFeeFunc: method is nil but TxPoolPlugin.SetBaseFee was just called") - } - callInfo := struct { - IntMoqParam *big.Int - }{ - IntMoqParam: intMoqParam, - } - mock.lockSetBaseFee.Lock() - mock.calls.SetBaseFee = append(mock.calls.SetBaseFee, callInfo) - mock.lockSetBaseFee.Unlock() - mock.SetBaseFeeFunc(intMoqParam) -} - -// SetBaseFeeCalls gets all the calls that were made to SetBaseFee. -// Check the length with: -// -// len(mockedTxPoolPlugin.SetBaseFeeCalls()) -func (mock *TxPoolPluginMock) SetBaseFeeCalls() []struct { - IntMoqParam *big.Int -} { - var calls []struct { - IntMoqParam *big.Int - } - mock.lockSetBaseFee.RLock() - calls = mock.calls.SetBaseFee - mock.lockSetBaseFee.RUnlock() - return calls -} - -// Stats calls StatsFunc. -func (mock *TxPoolPluginMock) Stats() (int, int) { - if mock.StatsFunc == nil { - panic("TxPoolPluginMock.StatsFunc: method is nil but TxPoolPlugin.Stats was just called") - } - callInfo := struct { - }{} - mock.lockStats.Lock() - mock.calls.Stats = append(mock.calls.Stats, callInfo) - mock.lockStats.Unlock() - return mock.StatsFunc() -} - -// StatsCalls gets all the calls that were made to Stats. -// Check the length with: -// -// len(mockedTxPoolPlugin.StatsCalls()) -func (mock *TxPoolPluginMock) StatsCalls() []struct { -} { - var calls []struct { - } - mock.lockStats.RLock() - calls = mock.calls.Stats - mock.lockStats.RUnlock() - return calls -} - -// SubscribeNewTxsEvent calls SubscribeNewTxsEventFunc. -func (mock *TxPoolPluginMock) SubscribeNewTxsEvent(ch chan<- ethereumcore.NewTxsEvent) event.Subscription { - if mock.SubscribeNewTxsEventFunc == nil { - panic("TxPoolPluginMock.SubscribeNewTxsEventFunc: method is nil but TxPoolPlugin.SubscribeNewTxsEvent was just called") - } - callInfo := struct { - Ch chan<- ethereumcore.NewTxsEvent - }{ - Ch: ch, - } - mock.lockSubscribeNewTxsEvent.Lock() - mock.calls.SubscribeNewTxsEvent = append(mock.calls.SubscribeNewTxsEvent, callInfo) - mock.lockSubscribeNewTxsEvent.Unlock() - return mock.SubscribeNewTxsEventFunc(ch) -} - -// SubscribeNewTxsEventCalls gets all the calls that were made to SubscribeNewTxsEvent. -// Check the length with: -// -// len(mockedTxPoolPlugin.SubscribeNewTxsEventCalls()) -func (mock *TxPoolPluginMock) SubscribeNewTxsEventCalls() []struct { - Ch chan<- ethereumcore.NewTxsEvent -} { - var calls []struct { - Ch chan<- ethereumcore.NewTxsEvent - } - mock.lockSubscribeNewTxsEvent.RLock() - calls = mock.calls.SubscribeNewTxsEvent - mock.lockSubscribeNewTxsEvent.RUnlock() - return calls -} diff --git a/eth/core/precompile/method_validation_test.go b/eth/core/precompile/method_validation_test.go index 0d0db22dfe..b1e9b37610 100644 --- a/eth/core/precompile/method_validation_test.go +++ b/eth/core/precompile/method_validation_test.go @@ -93,7 +93,9 @@ var _ = Describe("Method", func() { m := mockStruct{} mb := mockStructBad{} - Expect(validateArg(reflect.New(reflect.TypeOf(m)).Elem(), reflect.New(reflect.TypeOf(mb)).Elem())).To(HaveOccurred()) + Expect(validateArg( + reflect.New(reflect.TypeOf(m)).Elem(), + reflect.New(reflect.TypeOf(mb)).Elem())).To(HaveOccurred()) Expect(validateStruct(reflect.TypeOf(m), reflect.TypeOf(mb))).To(HaveOccurred()) mbn := mockStructBadNumFields{} @@ -118,7 +120,8 @@ var _ = Describe("Method", func() { numReturnMismatch, found := reflect.TypeOf(m).MethodByName("NumReturnMismatch") Expect(found).To(BeTrue()) Expect(validateOutputs(numReturnMismatch, &exampleFunc).Error()).To(Equal( - "number of return args mismatch: exampleFunc expects 1 return vals, NumReturnMismatch returns 0 vals")) + "number of return args mismatch: exampleFunc expects 1 return vals, " + + "NumReturnMismatch returns 0 vals")) returnTypeMismatch, found := reflect.TypeOf(m).MethodByName("ReturnTypeMismatch") Expect(found).To(BeTrue()) diff --git a/eth/core/processor.go b/eth/core/processor.go index 8e43d2ed36..32e0e8893b 100644 --- a/eth/core/processor.go +++ b/eth/core/processor.go @@ -187,6 +187,7 @@ func (sp *StateProcessor) Finalize( // BuildAndRegisterPrecompiles builds the given precompiles and registers them with the precompile // plugin. +// TODO: move precompile registration out of the state processor? func (sp *StateProcessor) BuildAndRegisterPrecompiles(precompiles []precompile.Registrable) { for _, pc := range precompiles { // skip registering precompiles that are already registered. diff --git a/eth/core/processor_test.go b/eth/core/processor_test.go index 5b36f3ac2a..6c435ff60c 100644 --- a/eth/core/processor_test.go +++ b/eth/core/processor_test.go @@ -71,7 +71,7 @@ var _ = Describe("StateProcessor", func() { BeforeEach(func() { sdb = vmmock.NewEmptyStateDB() - _, bp, cp, _, _, pp, _, _ = mock.NewMockHostAndPlugins() + _, bp, cp, _, _, pp, _ = mock.NewMockHostAndPlugins() bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) } @@ -187,7 +187,7 @@ var _ = Describe("StateProcessor", func() { var _ = Describe("No precompile plugin provided", func() { It("should use the default plugin if none is provided", func() { - _, bp, cp, gp, _, pp, _, _ := mock.NewMockHostAndPlugins() + _, bp, cp, gp, _, pp, _ := mock.NewMockHostAndPlugins() gp.SetBlockGasLimit(uint64(blockGasLimit)) bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) diff --git a/eth/core/state/journal/selfdestructs.go b/eth/core/state/journal/selfdestructs.go index f96b448a84..3fd28bd3d1 100644 --- a/eth/core/state/journal/selfdestructs.go +++ b/eth/core/state/journal/selfdestructs.go @@ -33,7 +33,8 @@ import ( // 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470. var emptyCodeHash = crypto.Keccak256Hash(nil) -// `selfDestructStatePlugin` defines the required funtions from the StatePlugin for the suicide journal. +// `selfDestructStatePlugin` defines the required funtions from the StatePlugin +// for the suicide journal. type selfDestructStatePlugin interface { // GetCodeHash returns the code hash of the given account. GetCodeHash(common.Address) common.Hash @@ -58,9 +59,10 @@ type SelfDestructs interface { GetSelfDestructs() []common.Address } -// Dirty tracking of self destructed accounts, we have to keep track of these manually, in order for the -// code and state to still be accessible even after the account has been deleted. -// NOTE: we are only supporting one self destructed address per EVM call (and consequently per snapshot). +// Dirty tracking of self destructed accounts, we have to keep track of these manually, +// in order for the code and state to still be accessible even after the account has +// been deleted. NOTE: we are only supporting one self destructed address per EVM call +// (and consequently per snapshot). type selfDestructs struct { // journal of suicide address per call, very rare to suicide so we alloc only 1 address baseJournal[*common.Address] diff --git a/eth/core/txpool/txpool.go b/eth/core/txpool/txpool.go deleted file mode 100644 index 5e1a65bd96..0000000000 --- a/eth/core/txpool/txpool.go +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// - -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package txpool - -import "pkg.berachain.dev/polaris/eth/core" - -// TxPool is an interface for the Polaris transaction pool. -type TxPool interface { - core.TxPoolPlugin -} - -// NewTxPool creates a new TxPool instance. -// It takes in a core.TxPoolPlugin to satisfy the interface. -func NewTxPool(plugin core.TxPoolPlugin) TxPool { - return &polarisTxPool{ - TxPoolPlugin: plugin, - } -} - -// polarisTxPool implements the TxPool interface. -// It embeds a core.TxPoolPlugin to satisfy the interface. -type polarisTxPool struct { - core.TxPoolPlugin -} diff --git a/eth/go.mod b/eth/go.mod index 8fb9415ac9..1f763f2c92 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,10 +3,9 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f require ( - github.com/BurntSushi/toml v1.3.2 github.com/ethereum/go-ethereum v1.13.1 github.com/holiman/uint256 v1.2.3 github.com/onsi/ginkgo/v2 v2.12.1 diff --git a/eth/go.sum b/eth/go.sum index b78641222d..0f74d581e9 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -1,5 +1,3 @@ -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -14,8 +12,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50 h1:E9s3qjJk9VJsWV2VA+I2dVdpsCg/6VO7TNDVmlBhU2E= -github.com/berachain/polaris-geth v0.0.0-20230926021825-5556e5557a50/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= diff --git a/eth/miner/miner.go b/eth/miner/miner.go index 3ca9166c15..020919c994 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -26,12 +26,12 @@ import ( "github.com/ethereum/go-ethereum/consensus/misc/eip1559" "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/core/txpool" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/state" - "pkg.berachain.dev/polaris/eth/core/txpool" "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/log" @@ -43,7 +43,7 @@ import ( type Backend interface { // Blockchain returns the blockchain instance. Blockchain() core.Blockchain - TxPool() txpool.TxPool + TxPool() *txpool.TxPool Host() core.PolarisHostChain } @@ -59,6 +59,9 @@ type Miner interface { // Finalize is called after the last tx in the block. Finalize(context.Context) error + + // TODO: deprecate + NextBaseFee() *big.Int } // miner implements the Miner interface. @@ -66,7 +69,7 @@ type miner struct { backend Backend chain core.Blockchain processor *core.StateProcessor - txPool txpool.TxPool + txPool *txpool.TxPool bp core.BlockPlugin cp core.ConfigurationPlugin gp core.GasPlugin @@ -86,7 +89,7 @@ type miner struct { } // NewMiner creates a new Miner instance. -func NewMiner(backend Backend) Miner { +func New(backend Backend) Miner { chain := backend.Blockchain() host := backend.Host() @@ -114,9 +117,15 @@ func NewMiner(backend Backend) Miner { return m } +// TODO: deprecate and properly recalculate in prepare proposal, this is fine for now though. +func (m *miner) NextBaseFee() *big.Int { + if m.pendingHeader == nil { + return big.NewInt(0) + } + return eip1559.CalcBaseFee(m.cp.ChainConfig(), m.pendingHeader) +} + // Prepare prepares the blockchain for processing a new block at the given height. -// -//nolint:funlen // todo:fix func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // Prepare the State, Block, Configuration, Gas, and Historical plugins for the block. m.sp.Prepare(ctx) @@ -203,8 +212,7 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. context = core.NewEVMBlockContext(m.pendingHeader, m.chain, &m.pendingHeader.Coinbase) vmenv = vm.NewGethEVMWithPrecompiles(context, - vm.TxContext{}, m.statedb, chainConfig, m.vmConfig, - m.pp, + vm.TxContext{}, m.statedb, chainConfig, m.vmConfig, m.pp, ) ) @@ -218,10 +226,6 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { m.pendingHeader, ) - // We update the base fee in the txpool to the next base fee. - // TODO: Move to prepare proposal - m.txPool.SetBaseFee(m.pendingHeader.BaseFee) - return m.pendingHeader } diff --git a/eth/params/chain_config.go b/eth/params/chain_config.go index afa250baa1..038e1e898f 100644 --- a/eth/params/chain_config.go +++ b/eth/params/chain_config.go @@ -36,13 +36,11 @@ var DefaultChainConfig = &ChainConfig{ EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(0), EIP158Block: big.NewInt(0), - ShanghaiTime: &zero, - CancunTime: nil, - PragueTime: nil, ByzantiumBlock: big.NewInt(0), ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(0), LondonBlock: big.NewInt(0), ArrowGlacierBlock: big.NewInt(0), @@ -50,6 +48,5 @@ var DefaultChainConfig = &ChainConfig{ MergeNetsplitBlock: big.NewInt(0), TerminalTotalDifficulty: big.NewInt(0), TerminalTotalDifficultyPassed: true, - Ethash: nil, - Clique: nil, + ShanghaiTime: &zero, } diff --git a/eth/params/imported.go b/eth/params/imported.go index 91a6008812..30b029768b 100644 --- a/eth/params/imported.go +++ b/eth/params/imported.go @@ -30,7 +30,8 @@ type ( ) var ( - // BloomBitsBlocks is the number of blocks a single bloom bit section vector contains on the server side. + // BloomBitsBlocks is the number of blocks a single bloom bit section vector + // contains on the server side. BloomBitsBlocks = params.BloomBitsBlocks // VersionWithMeta holds the textual version string including the metadata. VersionWithMeta = params.VersionWithMeta diff --git a/eth/polar/backend.go b/eth/polar/backend.go index e1fa168501..68119543d9 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -442,7 +442,7 @@ func (b *backend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.S // ============================================================================== func (b *backend) SendTx(_ context.Context, signedTx *types.Transaction) error { - return b.polar.txPool.SendTx(signedTx) + return b.polar.txPool.Add([]*types.Transaction{signedTx}, true, false)[0] } func (b *backend) GetPoolTransactions() (types.Transactions, error) { @@ -450,13 +450,11 @@ func (b *backend) GetPoolTransactions() (types.Transactions, error) { pending := b.polar.txPool.Pending(false) var txs types.Transactions for _, batch := range pending { - // TODO: Subpools. - // for _, lazy := range batch { - // if tx := lazy.Resolve(); tx != nil { - // txs = append(txs, tx) - // } - // } - txs = append(txs, batch...) + for _, lazy := range batch { + if tx := lazy.Resolve(); tx != nil { + txs = append(txs, tx) + } + } } return txs, nil } diff --git a/eth/polar/config.go b/eth/polar/config.go index 658f530add..66145cd7a8 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -21,15 +21,14 @@ package polar import ( - "fmt" "math/big" - "os" "time" - "github.com/BurntSushi/toml" - + "github.com/ethereum/go-ethereum/core/txpool/legacypool" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/gasprice" + + "pkg.berachain.dev/polaris/eth/params" ) const ( @@ -45,7 +44,9 @@ func DefaultConfig() *Config { gpoConfig := ethconfig.FullNodeGPO gpoConfig.Default = big.NewInt(gpoDefault) return &Config{ + Chain: *params.DefaultChainConfig, GPO: gpoConfig, + LegacyTxPool: legacypool.DefaultConfig, RPCGasCap: ethconfig.Defaults.RPCGasCap, RPCTxFeeCap: ethconfig.Defaults.RPCTxFeeCap, RPCEVMTimeout: ethconfig.Defaults.RPCEVMTimeout, @@ -54,34 +55,22 @@ func DefaultConfig() *Config { // Config represents the configurable parameters for Polaris. type Config struct { + // The chain configuration to use. + Chain params.ChainConfig + // Gas Price Oracle config. GPO gasprice.Config + // Transaction pool options + LegacyTxPool legacypool.Config + // RPCGasCap is the global gas cap for eth-call variants. - RPCGasCap uint64 `toml:""` + RPCGasCap uint64 // RPCEVMTimeout is the global timeout for eth-call. - RPCEVMTimeout time.Duration `toml:""` + RPCEVMTimeout time.Duration // RPCTxFeeCap is the global transaction fee(price * gaslimit) cap for // send-transaction variants. The unit is ether. - RPCTxFeeCap float64 `toml:""` -} - -// LoadConfigFromFilePath reads in a Polaris config file from the fileystem. -func LoadConfigFromFilePath(filename string) (*Config, error) { - var config Config - - // Read the TOML file - bytes, err := os.ReadFile(filename) //#nosec: G304 // required. - if err != nil { - return nil, fmt.Errorf("error reading file %s: %w", filename, err) - } - - // Unmarshal the TOML data into a struct - if err = toml.Unmarshal(bytes, &config); err != nil { - return nil, fmt.Errorf("error parsing TOML data: %w", err) - } - - return &config, nil + RPCTxFeeCap float64 } diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index f5d8afa422..01f86120e4 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -21,15 +21,18 @@ package polar import ( + "math/big" "net/http" "time" "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/core/txpool" + "github.com/ethereum/go-ethereum/core/txpool/legacypool" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/node" "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/txpool" "pkg.berachain.dev/polaris/eth/log" "pkg.berachain.dev/polaris/eth/miner" polarapi "pkg.berachain.dev/polaris/eth/polar/api" @@ -56,6 +59,9 @@ type NetworkingStack interface { // RegisterAPIs registers JSON-RPC handlers for the networking stack. RegisterAPIs([]rpc.API) + // RegisterLifecycles registers objects to have their lifecycle manged by the stack. + RegisterLifecycle(node.Lifecycle) + // Start starts the networking stack. Start() error @@ -73,7 +79,7 @@ type Polaris struct { // core pieces of the polaris stack host core.PolarisHostChain blockchain core.Blockchain - txPool txpool.TxPool + txPool *txpool.TxPool miner miner.Miner // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs and the core pieces. @@ -111,14 +117,42 @@ func NewWithNetworkingStack( log.Root().SetHandler(logHandler) } - // Build and set the RPC Backend and other services. - pl.backend = NewBackend(pl, stack.ExtRPCEnabled(), cfg) - pl.txPool = txpool.NewTxPool(host.GetTxPoolPlugin()) - pl.miner = miner.NewMiner(pl) + pl.backend = NewBackend(pl, pl.stack.ExtRPCEnabled(), pl.cfg) return pl } +// Init initializes the Polaris struct. +func (pl *Polaris) Init() error { + var err error + pl.miner = miner.New(pl) + // eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) + + // For now, we only have a legacy pool, we will implement blob pool later. + legacyPool := legacypool.New( + pl.cfg.LegacyTxPool, pl.Blockchain(), + ) + + // Setup the transaction pool and attach the legacyPool. + if pl.txPool, err = txpool.New( + new(big.Int).SetUint64(pl.cfg.LegacyTxPool.PriceLimit), + pl.blockchain, + []txpool.SubPool{legacyPool}, + ); err != nil { + return err + } + + // eth.miner = miner.New(eth, &config.Miner, eth.blockchain.Config(), eth.EventMux(), eth.engine, eth.isLocalBlock) + + // Build and set the RPC Backend and other services. + + // if eth.APIBackend.allowUnprotectedTxs { + // log.Info("Unprotected transactions allowed") + // } + + return nil +} + // APIs return the collection of RPC services the polar package offers. // NOTE, some of these services probably need to be moved to somewhere else. func (pl *Polaris) APIs() []rpc.API { @@ -147,8 +181,7 @@ func (pl *Polaris) StartServices() error { pl.filterSystem = utils.RegisterFilterAPI(pl.stack, pl.backend, &defaultEthConfig) go func() { - // TODO: unhack this. - time.Sleep(2 * time.Second) //nolint:gomnd // we will fix this eventually. + time.Sleep(3 * time.Second) //nolint:gomnd // TODO:fix, this is required for hive... if err := pl.stack.Start(); err != nil { panic(err) } @@ -156,7 +189,12 @@ func (pl *Polaris) StartServices() error { return nil } -func (pl *Polaris) StopServices() error { +// RegisterService adds a service to the networking stack. +func (pl *Polaris) RegisterService(lc node.Lifecycle) { + pl.stack.RegisterLifecycle(lc) +} + +func (pl *Polaris) Close() error { return pl.stack.Close() } @@ -168,7 +206,7 @@ func (pl *Polaris) Miner() miner.Miner { return pl.miner } -func (pl *Polaris) TxPool() txpool.TxPool { +func (pl *Polaris) TxPool() *txpool.TxPool { return pl.txPool } diff --git a/go.work.sum b/go.work.sum index 907ae496f3..7c8347d241 100644 --- a/go.work.sum +++ b/go.work.sum @@ -731,6 +731,7 @@ gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354/go.mod h1:9aoV2M/XfS/kryhjpJWNjhGMDsZe28k5g8uLBsMB7aA= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= diff --git a/lib/ds/stack/cloneable_stack.go b/lib/ds/stack/cloneable_stack.go index 54a802420b..1a77b7dd1a 100644 --- a/lib/ds/stack/cloneable_stack.go +++ b/lib/ds/stack/cloneable_stack.go @@ -37,7 +37,9 @@ type cloneableStack[T libtypes.Cloneable[T]] struct { } // NewCloneable creates and returns a new cloneableStack instance. -func NewCloneable[T libtypes.Cloneable[T]](capacity int) cloneableStack[T] { //nolint:revive // it's ok. +func NewCloneable[T libtypes.Cloneable[T]]( + capacity int, +) cloneableStack[T] { //nolint:revive // it's ok. return cloneableStack[T]{ New[T](capacity), } From dc73e1692220f8141bef85a970f244b0c45dd58d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:29:32 -0400 Subject: [PATCH 050/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /cosmos (#1179) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cosmos/go.mod | 2 +- cosmos/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index c77ac22a72..e0956f27e1 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -77,7 +77,7 @@ require ( github.com/cockroachdb/redact v1.1.5 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 4ef2424eed..a80560cd4c 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -215,8 +215,8 @@ github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AK github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= From 6d4aa281e0c55674c61076bfdf4d770cec99a2a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:29:51 -0400 Subject: [PATCH 051/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /e2e/localnet (#1177) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- e2e/localnet/go.mod | 2 +- e2e/localnet/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index be483cabc6..4249a6e5fe 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -50,7 +50,7 @@ require ( github.com/cometbft/cometbft v0.38.0 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index c4e7e7d8f3..03c48ef64d 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -182,8 +182,8 @@ github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AK github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= From fbf9de9a1f69202a6a7e534b8624afe0cd7b9c4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:29:58 -0400 Subject: [PATCH 052/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /contracts (#1176) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- contracts/go.mod | 2 +- contracts/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/go.mod b/contracts/go.mod index 457d58105d..6949199de4 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -13,7 +13,7 @@ require ( github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect diff --git a/contracts/go.sum b/contracts/go.sum index 80c474c1cc..6d1e629b6c 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -30,8 +30,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From c337c9d77fb346bed5551b02286dcb2ee0b5a76e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:30:08 -0400 Subject: [PATCH 053/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /eth (#1175) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- eth/go.mod | 2 +- eth/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eth/go.mod b/eth/go.mod index 1f763f2c92..23f58f9ca9 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -34,7 +34,7 @@ require ( github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect diff --git a/eth/go.sum b/eth/go.sum index 0f74d581e9..d49ee896e0 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -50,8 +50,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= From 36e63002b6c246004685a4f07b20a6c18c8996a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:30:20 -0400 Subject: [PATCH 054/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /e2e/precompile (#1178) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Devon Bear --- e2e/precompile/go.mod | 2 +- e2e/precompile/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 717041cd9c..97ba324bc9 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -52,7 +52,7 @@ require ( github.com/cometbft/cometbft v0.38.0 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.0 // indirect diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index ebd87aefd7..0dd89be20f 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -182,8 +182,8 @@ github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AK github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= From c1231fa456dfe5a297ad21a39540cdb0d8df4bb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:30:29 -0400 Subject: [PATCH 055/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /tools (#1174) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/go.mod | 2 +- tools/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/go.mod b/tools/go.mod index 16def41255..7db66305c9 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -67,7 +67,7 @@ require ( github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect diff --git a/tools/go.sum b/tools/go.sum index 2033f07993..41c9c56daa 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -175,8 +175,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= From 2a69dddb3c589083549db060fce351887124ba6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:30:40 -0400 Subject: [PATCH 056/122] chore(deps): bump zod from 3.20.6 to 3.22.3 in /docs/web (#1180) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/web/pnpm-lock.yaml | 13 ++++++++++--- docs/web/yarn.lock | 6 +++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/web/pnpm-lock.yaml b/docs/web/pnpm-lock.yaml index 362d8a952f..9ae1a730e0 100644 --- a/docs/web/pnpm-lock.yaml +++ b/docs/web/pnpm-lock.yaml @@ -461,6 +461,7 @@ packages: /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.10): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -474,6 +475,7 @@ packages: /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -496,6 +498,7 @@ packages: /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -507,6 +510,7 @@ packages: /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -518,6 +522,7 @@ packages: /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.10): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -532,6 +537,7 @@ packages: /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -543,6 +549,7 @@ packages: /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.10): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -6126,7 +6133,7 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.0.6 - zod: 3.21.1 + zod: 3.22.3 dev: false /nextra@2.2.17(next@13.2.3)(react-dom@18.2.0)(react@18.2.0): @@ -8221,8 +8228,8 @@ packages: resolution: {integrity: sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==} dev: false - /zod@3.21.1: - resolution: {integrity: sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==} + /zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} dev: false /zustand@3.7.2(react@18.2.0): diff --git a/docs/web/yarn.lock b/docs/web/yarn.lock index 601ca50cdf..0d59c2a46a 100644 --- a/docs/web/yarn.lock +++ b/docs/web/yarn.lock @@ -3816,9 +3816,9 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zod@^3.20.2: - version "3.20.6" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.6.tgz#2f2f08ff81291d47d99e86140fedb4e0db08361a" - integrity sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA== + version "3.22.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.3.tgz#2fbc96118b174290d94e8896371c95629e87a060" + integrity sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug== zwitch@^2.0.0: version "2.0.4" From acc5528fcc9e58126e749e7072103ba798397242 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:35:58 -0400 Subject: [PATCH 057/122] chore(deps): bump github.com/consensys/gnark-crypto from 0.11.2 to 0.12.0 in /e2e/testapp (#1181) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- e2e/testapp/go.mod | 6 +++--- e2e/testapp/go.sum | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 6d7c0c0785..442c880127 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,7 +15,7 @@ require ( cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 - pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/cosmos v0.0.0-20231004173040-2a69dddb3c58 pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 ) @@ -89,7 +89,7 @@ require ( github.com/cockroachdb/redact v1.1.5 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.2 // indirect + github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect @@ -272,7 +272,7 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 // indirect pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 49fab34867..9ca221622c 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -277,6 +277,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -379,8 +380,8 @@ github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AK github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= -github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -1884,11 +1885,14 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 h1:U5wpPv/ZitKJCZkHWVsWOzAfX3orlnHHhn5rYGJ1DPA= -pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 h1:J/d2QQVxlFufmVNrK07uvnMbCFoIX8T0D7YRxvu0ntg= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231004173040-2a69dddb3c58 h1:EBuK92BixoWjocscxzOJW9dfroWjMRzscsaGHFqPj5o= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231004173040-2a69dddb3c58/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From d9335a52a099743b9d87d05a483c4f650fa5acd5 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 4 Oct 2023 13:37:03 -0400 Subject: [PATCH 058/122] fix(linter): golangci-lint `lll` wasn't active (#1170) Co-authored-by: Cal Bera Co-authored-by: ocnc --- .golangci.yaml | 2 +- Makefile | 4 +- cosmos/config/config.go | 25 +++-- cosmos/crypto/keys/ethsecp256k1/keys.go | 6 +- cosmos/lib/conversions.go | 19 +++- cosmos/lib/evm.go | 6 +- cosmos/precompile/bank/bank_test.go | 7 +- .../precompile/distribution/distribution.go | 15 ++- cosmos/precompile/governance/governance.go | 42 ++++--- cosmos/precompile/governance/testutil.go | 8 +- cosmos/precompile/staking/staking.go | 15 ++- cosmos/precompile/staking/staking_test.go | 15 ++- cosmos/store/snapmulti/store.go | 6 +- cosmos/store/snapmulti/store_test.go | 6 +- cosmos/testing/types/mock/store.go | 6 +- cosmos/testing/utils/setup.go | 3 +- cosmos/txpool/handler.go | 12 -- cosmos/txpool/handler_test.go | 4 +- cosmos/txpool/mempool.go | 4 +- cosmos/txpool/mempool_test.go | 14 ++- cosmos/types/config_test.go | 18 ++- cosmos/x/evm/genesis.go | 18 ++- cosmos/x/evm/interfaces.go | 4 +- cosmos/x/evm/keeper/deprecate_me_please.go | 6 +- cosmos/x/evm/keeper/processor.go | 5 +- cosmos/x/evm/keeper/processor_test.go | 17 ++- cosmos/x/evm/plugins/block/header.go | 4 +- cosmos/x/evm/plugins/block/header_test.go | 3 +- cosmos/x/evm/plugins/block/interfaces.go | 2 +- cosmos/x/evm/plugins/gas/plugin_test.go | 2 +- .../evm/plugins/historical/historical_data.go | 17 ++- .../x/evm/plugins/historical/plugin_test.go | 4 +- .../evm/plugins/precompile/log/attributes.go | 4 +- cosmos/x/evm/plugins/precompile/log/errors.go | 12 +- .../plugins/precompile/log/factory_test.go | 9 +- cosmos/x/evm/plugins/precompile/recovery.go | 3 +- cosmos/x/evm/plugins/state/plugin.go | 15 +-- cosmos/x/evm/plugins/state/plugin_test.go | 6 +- e2e/localnet/network/fixture.go | 3 +- .../contracts/gov/governance_test.go | 3 +- .../contracts/staking/staking_test.go | 3 +- e2e/testapp/app.go | 4 +- e2e/testapp/app_config.go | 21 ++-- e2e/testapp/export.go | 103 +++++++++--------- e2e/testapp/helpers.go | 5 +- e2e/testapp/polard/cmd/root_test.go | 2 +- e2e/testapp/sim_test.go | 12 +- e2e/testapp/upgrades.go | 4 +- eth/core/chain_helpers.go | 5 +- eth/core/chain_reader.go | 3 +- eth/core/chain_resources.go | 4 +- eth/core/chain_writer.go | 9 +- eth/core/genesis.go | 7 +- eth/core/imported.go | 3 +- eth/core/precompile/errors.go | 15 ++- eth/core/precompile/factories_test.go | 9 +- eth/core/precompile/method_validation.go | 4 +- eth/core/precompile/method_validation_test.go | 14 ++- .../precompile/stateful_container_test.go | 36 +++--- eth/core/state/journal/selfdestructs.go | 10 +- eth/core/state/statedb.go | 4 +- eth/core/vm/errors.go | 3 +- eth/miner/miner.go | 14 +-- eth/polar/backend.go | 51 ++++++--- eth/polar/mining.go | 7 +- eth/polar/node.go | 3 +- eth/polar/polaris.go | 11 +- go.work.sum | 5 + 68 files changed, 475 insertions(+), 270 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index fd4785b06f..996a47f6af 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -166,7 +166,7 @@ linters-settings: # Max line length, lines longer will be reported. # '\t' is counted as 1 character by default, and can be changed with the tab-width option. # Default: 120. - line-length: 120 + line-length: 99 # Tab width in spaces. # Default: 1 tab-width: 1 diff --git a/Makefile b/Makefile index f4f3248c0b..5133cb633c 100644 --- a/Makefile +++ b/Makefile @@ -258,7 +258,7 @@ test-hive: @cd $(CLONE_PATH) && \ hive --sim polaris/rpc -client polard -testv-hive: +test-hive-v: @cd $(CLONE_PATH) && \ hive --sim polaris/rpc -client polard --docker.output @@ -430,7 +430,7 @@ repo-rinse: | abigen-install moq-install mockery-install mockery \ start test-unit test-unit-race test-unit-cover forge-test \ test-e2e test-e2e-no-build hive-setup hive-view test-hive \ - testv-hive test-localnet test-localnet-no-build format lint \ + test-hive-v test-localnet test-localnet-no-build format lint \ forge-lint-fix forge-lint golangci-install golangci golangci-fix \ golines-install golines license-install license license-fix \ gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse diff --git a/cosmos/config/config.go b/cosmos/config/config.go index e559553f31..7bf471377b 100644 --- a/cosmos/config/config.go +++ b/cosmos/config/config.go @@ -113,10 +113,18 @@ func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { } return num, nil } - getFloat64 := func(key string) (float64, error) { return cast.ToFloat64E(opts.Get(key)) } - getBool := func(key string) (bool, error) { return cast.ToBoolE(opts.Get(key)) } - getStringSlice := func(key string) ([]string, error) { return cast.ToStringSliceE(opts.Get(key)) } - getTimeDuration := func(key string) (time.Duration, error) { return cast.ToDurationE(opts.Get(key)) } + getFloat64 := func(key string) (float64, error) { + return cast.ToFloat64E(opts.Get(key)) + } + getBool := func(key string) (bool, error) { + return cast.ToBoolE(opts.Get(key)) + } + getStringSlice := func(key string) ([]string, error) { + return cast.ToStringSliceE(opts.Get(key)) + } + getTimeDuration := func(key string) (time.Duration, error) { + return cast.ToDurationE(opts.Get(key)) + } // Polar settings if conf.Polar.RPCGasCap, err = getUint64(flagRPCGasCap); err != nil { @@ -195,10 +203,12 @@ func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { return nil, handleError(err, flagVerkleTime) } - if conf.Polar.Chain.TerminalTotalDifficulty, err = getBigInt(flagTerminalTotalDifficulty); err != nil { + if conf.Polar.Chain.TerminalTotalDifficulty, err = getBigInt( + flagTerminalTotalDifficulty); err != nil { return nil, handleError(err, flagTerminalTotalDifficulty) } - if conf.Polar.Chain.TerminalTotalDifficultyPassed, err = getBool(flagTerminalTotalDifficultyPassed); err != nil { + if conf.Polar.Chain.TerminalTotalDifficultyPassed, err = getBool( + flagTerminalTotalDifficultyPassed); err != nil { return nil, handleError(err, flagTerminalTotalDifficultyPassed) } if conf.Polar.Chain.IsDevMode, err = getBool(flagIsDevMode); err != nil { @@ -387,7 +397,8 @@ func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { if conf.Node.HTTPTimeouts.ReadTimeout, err = getTimeDuration(flagReadTimeout); err != nil { return nil, handleError(err, flagReadTimeout) } - if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = getTimeDuration(flagReadHeaderTimeout); err != nil { + if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = getTimeDuration( + flagReadHeaderTimeout); err != nil { return nil, handleError(err, flagReadHeaderTimeout) } if conf.Node.HTTPTimeouts.WriteTimeout, err = getTimeDuration(flagWriteTimeout); err != nil { diff --git a/cosmos/crypto/keys/ethsecp256k1/keys.go b/cosmos/crypto/keys/ethsecp256k1/keys.go index bba2d8e5b3..5636e0aea4 100644 --- a/cosmos/crypto/keys/ethsecp256k1/keys.go +++ b/cosmos/crypto/keys/ethsecp256k1/keys.go @@ -46,7 +46,8 @@ const ( // =============================================================================================== // PrivKey is a wrapper around the Ethereum secp256k1 private key type. This wrapper conforms to -// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 private key type within the Cosmos SDK. +// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 private key type within the +// Cosmos SDK. // Compile-time type assertion. var _ cryptotypes.PrivKey = &PrivKey{} @@ -71,7 +72,8 @@ func (privKey PrivKey) PubKey() cryptotypes.PubKey { // Equals returns true if two ECDSA private keys are equal and false otherwise. func (privKey PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool { - return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 + return privKey.Type() == other.Type() && + subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } // Type returns eth_secp256k1. diff --git a/cosmos/lib/conversions.go b/cosmos/lib/conversions.go index 22ce8e9416..de6a9d6f6b 100644 --- a/cosmos/lib/conversions.go +++ b/cosmos/lib/conversions.go @@ -60,7 +60,9 @@ func SdkCoinToEvmCoin(coin sdk.Coin) libgenerated.CosmosCoin { return evmCoin } -func SdkPageResponseToEvmPageResponse(pageResponse *query.PageResponse) libgenerated.CosmosPageResponse { +func SdkPageResponseToEvmPageResponse( + pageResponse *query.PageResponse, +) libgenerated.CosmosPageResponse { if pageResponse == nil { return libgenerated.CosmosPageResponse{} } @@ -138,7 +140,9 @@ func ExtractCoinFromInputToCoin(coin any) (sdk.Coin, error) { // SdkUDEToStakingUDE converts a Cosmos SDK Unbonding Delegation Entry list to a geth compatible // list of Unbonding Delegation Entries. -func SdkUDEToStakingUDE(ude []stakingtypes.UnbondingDelegationEntry) []staking.IStakingModuleUnbondingDelegationEntry { +func SdkUDEToStakingUDE( + ude []stakingtypes.UnbondingDelegationEntry, +) []staking.IStakingModuleUnbondingDelegationEntry { entries := make([]staking.IStakingModuleUnbondingDelegationEntry, len(ude)) for i, entry := range ude { entries[i] = staking.IStakingModuleUnbondingDelegationEntry{ @@ -153,7 +157,9 @@ func SdkUDEToStakingUDE(ude []stakingtypes.UnbondingDelegationEntry) []staking.I // SdkREToStakingRE converts a Cosmos SDK Redelegation Entry list to a geth compatible list of // Redelegation Entries. -func SdkREToStakingRE(re []stakingtypes.RedelegationEntry) []staking.IStakingModuleRedelegationEntry { +func SdkREToStakingRE( + re []stakingtypes.RedelegationEntry, +) []staking.IStakingModuleRedelegationEntry { entries := make([]staking.IStakingModuleRedelegationEntry, len(re)) for i, entry := range re { entries[i] = staking.IStakingModuleRedelegationEntry{ @@ -168,9 +174,10 @@ func SdkREToStakingRE(re []stakingtypes.RedelegationEntry) []staking.IStakingMod // SdkValidatorsToStakingValidators converts a Cosmos SDK Validator list to a geth compatible list // of Validators. -func SdkValidatorsToStakingValidators(valAddrCodec address.Codec, vals []stakingtypes.Validator) ( - []staking.IStakingModuleValidator, error, -) { +func SdkValidatorsToStakingValidators( + valAddrCodec address.Codec, + vals []stakingtypes.Validator, +) ([]staking.IStakingModuleValidator, error) { valsOut := make([]staking.IStakingModuleValidator, len(vals)) for i, val := range vals { operEthAddr, err := EthAddressFromString(valAddrCodec, val.OperatorAddress) diff --git a/cosmos/lib/evm.go b/cosmos/lib/evm.go index 8a420bd420..811d7bcca5 100644 --- a/cosmos/lib/evm.go +++ b/cosmos/lib/evm.go @@ -66,7 +66,8 @@ func DeployOnEVMFromPrecompile( ) // consume gas used by EVM during contract creation - ctx.GasMeter().ConsumeGas(suppliedGas-gasRemaining, "EVM contract creation "+contractAddr.Hex()) + ctx.GasMeter().ConsumeGas( + suppliedGas-gasRemaining, "EVM contract creation "+contractAddr.Hex()) return contractAddr, ret, err } @@ -116,7 +117,8 @@ func CallEVMFromPrecompileUnpackArgs( methodName string, args ...any, ) ([]any, error) { - ret, err := CallEVMFromPrecompile(ctx, plugin, evm, caller, address, contract, value, methodName, args...) + ret, err := CallEVMFromPrecompile( + ctx, plugin, evm, caller, address, contract, value, methodName, args...) if err != nil { return nil, err } diff --git a/cosmos/precompile/bank/bank_test.go b/cosmos/precompile/bank/bank_test.go index 564dbbe833..d9c1554cf6 100644 --- a/cosmos/precompile/bank/bank_test.go +++ b/cosmos/precompile/bank/bank_test.go @@ -520,7 +520,12 @@ var _ = Describe("Bank Precompile Test", func() { }) }) -func FundAccount(ctx sdk.Context, bk bankkeeper.BaseKeeper, account sdk.AccAddress, coins sdk.Coins) error { +func FundAccount( + ctx sdk.Context, + bk bankkeeper.BaseKeeper, + account sdk.AccAddress, + coins sdk.Coins, +) error { if err := bk.MintCoins(ctx, evmtypes.ModuleName, coins); err != nil { return err } diff --git a/cosmos/precompile/distribution/distribution.go b/cosmos/precompile/distribution/distribution.go index 144a31ce0f..f1e27b4e2c 100644 --- a/cosmos/precompile/distribution/distribution.go +++ b/cosmos/precompile/distribution/distribution.go @@ -73,7 +73,8 @@ func (c *Contract) CustomValueDecoders() ethprecompile.ValueDecoders { } } -// SetWithdrawAddress is the precompile contract method for the `setWithdrawAddress(address)` method. +// SetWithdrawAddress is the precompile contract method for the +// `setWithdrawAddress(address)` method. func (c *Contract) SetWithdrawAddress( ctx context.Context, withdrawAddress common.Address, @@ -96,7 +97,8 @@ func (c *Contract) SetWithdrawAddress( return err == nil, err } -// GetWithdrawAddress is the precompile contract method for the `getWithdrawAddress(address)` method. +// GetWithdrawAddress is the precompile contract method for the +// `getWithdrawAddress(address)` method. func (c *Contract) GetWithdrawAddress( ctx context.Context, delegator common.Address, @@ -147,10 +149,11 @@ func (c *Contract) WithdrawDelegatorReward( return nil, err } - res, err := c.msgServer.WithdrawDelegatorReward(ctx, &distributiontypes.MsgWithdrawDelegatorReward{ - DelegatorAddress: delAddr, - ValidatorAddress: valAddr, - }) + res, err := c.msgServer.WithdrawDelegatorReward(ctx, + &distributiontypes.MsgWithdrawDelegatorReward{ + DelegatorAddress: delAddr, + ValidatorAddress: valAddr, + }) if err != nil { return nil, err } diff --git a/cosmos/precompile/governance/governance.go b/cosmos/precompile/governance/governance.go index c597080cb0..e7b9dc0d57 100644 --- a/cosmos/precompile/governance/governance.go +++ b/cosmos/precompile/governance/governance.go @@ -79,7 +79,8 @@ func (c *Contract) CustomValueDecoders() ethprecompile.ValueDecoders { } } -// SubmitProposal is the method for the `submitProposal` method of the governance precompile contract. +// SubmitProposal is the method for the `submitProposal` method of the +// governance precompile contract. func (c *Contract) SubmitProposal( ctx context.Context, proposalMsg []byte, @@ -101,7 +102,8 @@ func (c *Contract) SubmitProposal( sdk.UnwrapSDKContext(polarCtx.Context()).EventManager().EmitEvent( sdk.NewEvent( EventTypeProposalSubmitted, - sdk.NewAttribute(govtypes.AttributeKeyProposalID, strconv.FormatUint(res.ProposalId, 10)), + sdk.NewAttribute( + govtypes.AttributeKeyProposalID, strconv.FormatUint(res.ProposalId, 10)), sdk.NewAttribute(AttributeProposalSender, polarCtx.MsgSender().Hex()), ), ) @@ -110,7 +112,8 @@ func (c *Contract) SubmitProposal( return res.ProposalId, nil } -// CancelProposal is the method for the `cancelProposal` method of the governance precompile contract. +// CancelProposal is the method for the `cancelProposal` method of the +// governance precompile contract. func (c *Contract) CancelProposal( ctx context.Context, id uint64, @@ -250,7 +253,9 @@ func (c *Contract) GetProposal( return cosmlib.SdkProposalToGovProposal(*res.Proposal), nil } -// GetProposals is the method for the `getProposal` method of the governance precompile contract. +// GetProposals is the method for the `getProposal` +// +// method of the governance precompile contract. func (c *Contract) GetProposals( ctx context.Context, proposalStatus int32, @@ -272,7 +277,8 @@ func (c *Contract) GetProposals( return proposals, cosmlib.SdkPageResponseToEvmPageResponse(res.Pagination), nil } -// GetProposalDeposits is the method for the `getProposalDeposits` method of the governance precompile contract. +// GetProposalDeposits is the method for the `getProposalDeposits` +// method of the governance precompile contract. func (c *Contract) GetProposalDeposits( ctx context.Context, proposalID uint64, @@ -325,7 +331,8 @@ func (c *Contract) GetProposalDepositsByDepositor( return deposits, nil } -// GetProposalVotes is the method for the `getProposalVotes` method of the governance precompile contract. +// GetProposalVotes is the method for the `getProposalVotes` method of the +// governance precompile contract. func (c *Contract) GetProposalTallyResult( ctx context.Context, proposalID uint64, @@ -345,7 +352,8 @@ func (c *Contract) GetProposalTallyResult( }, nil } -// GetProposalVotes is the method for the `getProposalVotes` method of the governance precompile contract. +// GetProposalVotes is the method for the `getProposalVotes` method of the +// governance precompile contract. func (c *Contract) GetProposalVotes( ctx context.Context, proposalID uint64, @@ -387,8 +395,8 @@ func (c *Contract) GetProposalVotes( return votes, cosmlib.SdkPageResponseToEvmPageResponse(res.Pagination), nil } -// GetProposalVotesByVoter is the method for the `getProposalVotesByVoter` method of the governance -// precompile contract. +// GetProposalVotesByVoter is the method for the `getProposalVotesByVoter` +// method of the governance precompile contract. func (c *Contract) GetProposalVotesByVoter( ctx context.Context, proposalID uint64, @@ -425,8 +433,8 @@ func (c *Contract) GetProposalVotesByVoter( }, nil } -// GetProposalVoteByVoter is the method for the `getProposalVoteByVoter` method of the governance -// precompile contract. +// GetProposalVoteByVoter is the method for the `getProposalVoteByVoter` +// method of the governance precompile contract. func (c *Contract) GetParams( ctx context.Context, ) (generated.IGovernanceModuleParams, error) { @@ -469,7 +477,8 @@ func (c *Contract) GetParams( }, nil } -// GetDepositParams is the method for the `getDepositParams` method of the governance precompile contract. +// GetDepositParams is the method for the `getDepositParams` method of the +// governance precompile contract. func (c *Contract) GetDepositParams( ctx context.Context, ) (generated.IGovernanceModuleDepositParams, error) { @@ -491,7 +500,8 @@ func (c *Contract) GetDepositParams( }, nil } -// GetVotingParams is the method for the `getVotingParams` method of the governance precompile contract. +// GetVotingParams is the method for the `getVotingParams` method of the +// governance precompile contract. func (c *Contract) GetVotingParams( ctx context.Context, ) (generated.IGovernanceModuleVotingParams, error) { @@ -505,7 +515,8 @@ func (c *Contract) GetVotingParams( }, nil } -// GetTallyParams is the method for the `getTallyParams` method of the governance precompile contract. +// GetTallyParams is the method for the `getTallyParams` method of the +// governance precompile contract. func (c *Contract) GetTallyParams( ctx context.Context, ) (generated.IGovernanceModuleTallyParams, error) { @@ -521,7 +532,8 @@ func (c *Contract) GetTallyParams( }, nil } -// GetConstitution is the method for the `getConstitution` method of the governance precompile contract. +// GetConstitution is the method for the `getConstitution` method of the +// governance precompile contract. func (c *Contract) GetConstitution( ctx context.Context, ) (string, error) { diff --git a/cosmos/precompile/governance/testutil.go b/cosmos/precompile/governance/testutil.go index 120c9741f2..07e5a46d0c 100644 --- a/cosmos/precompile/governance/testutil.go +++ b/cosmos/precompile/governance/testutil.go @@ -87,7 +87,8 @@ func setupGovTest(ctrl *gomock.Controller, caller sdk.AccAddress) ( } // Create the governance keeper. - authority, err := ak.AddressCodec().BytesToString(authtypes.NewModuleAddress(governancetypes.ModuleName)) + authority, err := ak.AddressCodec().BytesToString( + authtypes.NewModuleAddress(governancetypes.ModuleName)) if err != nil { panic(err) } @@ -118,8 +119,9 @@ func setupGovTest(ctrl *gomock.Controller, caller sdk.AccAddress) ( // Fund the caller with some coins. err = testutils.MintCoinsToAddress( - //nolint:gomnd // magic number is fine here. - ctx, bk, governancetypes.ModuleName, common.BytesToAddress(caller), "abera", big.NewInt(100000000), + + ctx, bk, governancetypes.ModuleName, + common.BytesToAddress(caller), "abera", big.NewInt(100000000), //nolint:gomnd // its okay. ) if err != nil { panic(err) diff --git a/cosmos/precompile/staking/staking.go b/cosmos/precompile/staking/staking.go index 942611e694..4e175f617f 100644 --- a/cosmos/precompile/staking/staking.go +++ b/cosmos/precompile/staking/staking.go @@ -326,7 +326,8 @@ func (c *Contract) GetUnbondingDelegation( return cosmlib.SdkUDEToStakingUDE(res.GetUnbond().Entries), nil } -// GetDelegatorUnbondingDelegations implements the `getDelegatorUnbondingDelegations(address)` method. +// GetDelegatorUnbondingDelegations implements the `getDelegatorUnbondingDelegations(address)` +// method. func (c *Contract) GetDelegatorUnbondingDelegations( ctx context.Context, delegatorAddress common.Address, @@ -337,10 +338,11 @@ func (c *Contract) GetDelegatorUnbondingDelegations( return nil, cbindings.CosmosPageResponse{}, err } - res, err := c.querier.DelegatorUnbondingDelegations(ctx, &stakingtypes.QueryDelegatorUnbondingDelegationsRequest{ - DelegatorAddr: delAddr, - Pagination: cosmlib.ExtractPageRequestFromInput(pagination), - }) + res, err := c.querier.DelegatorUnbondingDelegations(ctx, + &stakingtypes.QueryDelegatorUnbondingDelegationsRequest{ + DelegatorAddr: delAddr, + Pagination: cosmlib.ExtractPageRequestFromInput(pagination), + }) if status.Code(err) == codes.NotFound { return []generated.IStakingModuleUnbondingDelegation{}, cbindings.CosmosPageResponse{}, nil @@ -355,7 +357,8 @@ func (c *Contract) GetDelegatorUnbondingDelegations( delegator common.Address ) - valAddr, err = cosmlib.EthAddressFromString(c.vs.ValidatorAddressCodec(), u.ValidatorAddress) + valAddr, err = cosmlib.EthAddressFromString( + c.vs.ValidatorAddressCodec(), u.ValidatorAddress) if err != nil { return nil, cbindings.CosmosPageResponse{}, err } diff --git a/cosmos/precompile/staking/staking_test.go b/cosmos/precompile/staking/staking_test.go index 9cb7fa094e..bb548c9432 100644 --- a/cosmos/precompile/staking/staking_test.go +++ b/cosmos/precompile/staking/staking_test.go @@ -62,8 +62,12 @@ func createValAddrs(count int) ([]sdk.AccAddress, []sdk.ValAddress) { return addrs, valAddrs } -func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey) (stakingtypes.Validator, error) { - return stakingtypes.NewValidator(operator.String() /* todo move to codec */, pubKey, stakingtypes.Description{}) +func NewValidator( + operator sdk.ValAddress, pubKey cryptotypes.PubKey, +) (stakingtypes.Validator, error) { + return stakingtypes.NewValidator( + operator.String() /* todo move to codec */, pubKey, stakingtypes.Description{}, + ) } var ( @@ -603,7 +607,12 @@ var _ = Describe("Staking", func() { }) }) -func FundAccount(ctx sdk.Context, bk bankkeeper.BaseKeeper, account sdk.AccAddress, coins sdk.Coins) error { +func FundAccount( + ctx sdk.Context, + bk bankkeeper.BaseKeeper, + account sdk.AccAddress, + coins sdk.Coins, +) error { if err := bk.MintCoins(ctx, stakingtypes.ModuleName, coins); err != nil { return err } diff --git a/cosmos/store/snapmulti/store.go b/cosmos/store/snapmulti/store.go index 842d253dfa..4dfe0e31e2 100644 --- a/cosmos/store/snapmulti/store.go +++ b/cosmos/store/snapmulti/store.go @@ -131,9 +131,9 @@ func (s *store) RevertToSnapshot(id int) { s.journal.PopToSize(id) } -// Finalize commits each of the individual cachekv stores to its corresponding parent cachekv stores -// in the journal. Finally it commits the root cachekv stores. Skip committing writes to the -// underlying multistore if in read-only mode. +// Finalize commits each of the individual cachekv stores to its corresponding parent cachekv +// stores in the journal. Finally it commits the root cachekv stores. Skip committing writes +// to the underlying multistore if in read-only mode. // // Finalize implements `libtypes.Controllable`. func (s *store) Finalize() { diff --git a/cosmos/store/snapmulti/store_test.go b/cosmos/store/snapmulti/store_test.go index 3dd3a688ba..c9cda96513 100644 --- a/cosmos/store/snapmulti/store_test.go +++ b/cosmos/store/snapmulti/store_test.go @@ -74,8 +74,10 @@ var _ = Describe("Snapmulti Store", func() { It("CorrectStoreType", func() { // Test that the correct store type is returned - Expect(reflect.TypeOf(cms.GetKVStore(evmStoreKey))).To(Equal(reflect.TypeOf(&sdkcachekv.Store{}))) - Expect(reflect.TypeOf(cms.GetKVStore(accStoreKey))).To(Equal(reflect.TypeOf(&sdkcachekv.Store{}))) + Expect(reflect.TypeOf(cms.GetKVStore(evmStoreKey))). + To(Equal(reflect.TypeOf(&sdkcachekv.Store{}))) + Expect(reflect.TypeOf(cms.GetKVStore(accStoreKey))). + To(Equal(reflect.TypeOf(&sdkcachekv.Store{}))) }) It("TestWrite", func() { diff --git a/cosmos/testing/types/mock/store.go b/cosmos/testing/types/mock/store.go index 5b3aa2f7d0..62b6f87d32 100644 --- a/cosmos/testing/types/mock/store.go +++ b/cosmos/testing/types/mock/store.go @@ -196,7 +196,8 @@ func (t TestKVStore) Iterator(start, end []byte) types.Iterator { return newMockIterator(start, end, t.store) } -// ReverseIterator returns an iterator that iterates over all keys in the given domain in reverse order. +// ReverseIterator returns an iterator +// that iterates over all keys in the given domain in reverse order. func (t TestKVStore) ReverseIterator(start, end []byte) types.Iterator { t.mutex.Lock() defer t.mutex.Unlock() @@ -231,7 +232,8 @@ func newMockIterator(start, end []byte, content map[string][]byte) *mockIterator for k := range content { b := []byte(k) - if (start == nil && end == nil) || (bytes.Compare(b, start) >= 0 && bytes.Compare(b, end) < 0) { + if (start == nil && end == nil) || + (bytes.Compare(b, start) >= 0 && bytes.Compare(b, end) < 0) { // make sure data is a copy so that there is no concurrent writing temp := make([]byte, len(k)) copy(temp, k) diff --git a/cosmos/testing/utils/setup.go b/cosmos/testing/utils/setup.go index d1596fc1a7..5517e42e2f 100644 --- a/cosmos/testing/utils/setup.go +++ b/cosmos/testing/utils/setup.go @@ -68,7 +68,8 @@ var ( // NewContext creates a SDK context and mounts a mock multistore. func NewContext() sdk.Context { - return sdk.NewContext(mock.NewMultiStore(), cometproto.Header{}, false, log.NewTestLogger(&testing.T{})) + return sdk.NewContext( + mock.NewMultiStore(), cometproto.Header{}, false, log.NewTestLogger(&testing.T{})) } func NewContextWithMultiStore(ms storetypes.MultiStore) sdk.Context { diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index e2bc16420a..8bc50b673d 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -64,11 +64,6 @@ type Subscription interface { event.Subscription } -// Handler exposes a basic interface to utilize the Handler. -type Handler interface { - Lifecycle -} - // handler listens for new insertions into the geth txpool and broadcasts them to the CometBFT // layer for p2p and ABCI. type handler struct { @@ -85,13 +80,6 @@ type handler struct { running atomic.Bool } -// NewHandler creates a new Handler. -func NewHandler( - clientCtx TxBroadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, -) Handler { - return newHandler(clientCtx, txPool, serializer, logger) -} - // newHandler creates a new handler. func newHandler( clientCtx TxBroadcaster, txPool TxSubProvider, serializer TxSerializer, logger log.Logger, diff --git a/cosmos/txpool/handler_test.go b/cosmos/txpool/handler_test.go index b981cb3337..18c9c71df5 100644 --- a/cosmos/txpool/handler_test.go +++ b/cosmos/txpool/handler_test.go @@ -83,7 +83,9 @@ var _ = Describe("", func() { serializer.On("SerializeToBytes", mock.Anything).Return([]byte{123}, nil).Once() broadcaster.On("BroadcastTxSync", []byte{123}).Return(nil, nil).Once() - h.txsCh <- core.NewTxsEvent{Txs: []*coretypes.Transaction{coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5})}} + h.txsCh <- core.NewTxsEvent{ + Txs: []*coretypes.Transaction{coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5})}, + } }) It("should handle multiple tx", func() { diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index df4e4dbab0..7d99c3d929 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -103,7 +103,9 @@ func (m *Mempool) Insert(ctx context.Context, sdkTx sdk.Tx) error { if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); !ok { return errors.New("only WrappedEthereumTransactions are supported") - } else if errs := m.txpool.Add([]*coretypes.Transaction{wet.AsTransaction()}, false, false); len(errs) != 0 { + } else if errs := m.txpool.Add( + []*coretypes.Transaction{wet.AsTransaction()}, false, false, + ); len(errs) != 0 { // Handle case where a node broadcasts to itself, we don't want it to fail CheckTx. if errors.Is(errs[0], legacypool.ErrAlreadyKnown) && sCtx.IsCheckTx() { return nil diff --git a/cosmos/txpool/mempool_test.go b/cosmos/txpool/mempool_test.go index 5bc1357d6f..dd8742310e 100644 --- a/cosmos/txpool/mempool_test.go +++ b/cosmos/txpool/mempool_test.go @@ -54,15 +54,21 @@ var _ = Describe("", func() { When("we call insert", func() { When("the txpool does not error", func() { It("does not error", func() { - sdkTx.On("GetMsgs").Return([]sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}).Once() - txPool.On("Add", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() + sdkTx.On("GetMsgs"). + Return([]sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}). + Once() + txPool.On("Add", mock.Anything, mock.Anything, mock.Anything). + Return(nil).Once() Expect(mempool.Insert(ctx, sdkTx)).ToNot(HaveOccurred()) }) }) When("the txpool errors", func() { It("does error", func() { - sdkTx.On("GetMsgs").Return([]sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}).Once() - txPool.On("Add", mock.Anything, mock.Anything, mock.Anything).Return([]error{errors.New("mock error")}).Once() + sdkTx.On("GetMsgs").Return( + []sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}).Once() + txPool.On("Add", + mock.Anything, mock.Anything, mock.Anything). + Return([]error{errors.New("mock error")}).Once() Expect(mempool.Insert(ctx, sdkTx)).To(HaveOccurred()) }) }) diff --git a/cosmos/types/config_test.go b/cosmos/types/config_test.go index dc8ada6d3d..8fa35fa819 100644 --- a/cosmos/types/config_test.go +++ b/cosmos/types/config_test.go @@ -58,12 +58,18 @@ var _ = Describe("Configuration", func() { Expect(config.GetBech32ConsensusAddrPrefix()).To(Equal(sgconfig.Bech32PrefixConsAddr)) Expect(config.GetBech32ConsensusPubPrefix()).To(Equal(sgconfig.Bech32PrefixConsPub)) - Expect(config.GetBech32AccountAddrPrefix()).To(Equal(sdk.GetConfig().GetBech32AccountAddrPrefix())) - Expect(config.GetBech32AccountPubPrefix()).To(Equal(sdk.GetConfig().GetBech32AccountPubPrefix())) - Expect(config.GetBech32ValidatorAddrPrefix()).To(Equal(sdk.GetConfig().GetBech32ValidatorAddrPrefix())) - Expect(config.GetBech32ValidatorPubPrefix()).To(Equal(sdk.GetConfig().GetBech32ValidatorPubPrefix())) - Expect(config.GetBech32ConsensusAddrPrefix()).To(Equal(sdk.GetConfig().GetBech32ConsensusAddrPrefix())) - Expect(config.GetBech32ConsensusPubPrefix()).To(Equal(sdk.GetConfig().GetBech32ConsensusPubPrefix())) + Expect(config.GetBech32AccountAddrPrefix()). + To(Equal(sdk.GetConfig().GetBech32AccountAddrPrefix())) + Expect(config.GetBech32AccountPubPrefix()). + To(Equal(sdk.GetConfig().GetBech32AccountPubPrefix())) + Expect(config.GetBech32ValidatorAddrPrefix()). + To(Equal(sdk.GetConfig().GetBech32ValidatorAddrPrefix())) + Expect(config.GetBech32ValidatorPubPrefix()). + To(Equal(sdk.GetConfig().GetBech32ValidatorPubPrefix())) + Expect(config.GetBech32ConsensusAddrPrefix()). + To(Equal(sdk.GetConfig().GetBech32ConsensusAddrPrefix())) + Expect(config.GetBech32ConsensusPubPrefix()). + To(Equal(sdk.GetConfig().GetBech32ConsensusPubPrefix())) }) It("should set CoinType", func() { diff --git a/cosmos/x/evm/genesis.go b/cosmos/x/evm/genesis.go index 9b1026a871..3e13c6406c 100644 --- a/cosmos/x/evm/genesis.go +++ b/cosmos/x/evm/genesis.go @@ -44,7 +44,11 @@ func (AppModuleBasic) DefaultGenesis(_ codec.JSONCodec) json.RawMessage { } // ValidateGenesis performs genesis state validation for the evm module. -func (AppModuleBasic) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { +func (AppModuleBasic) ValidateGenesis( + _ codec.JSONCodec, + _ client.TxEncodingConfig, + bz json.RawMessage, +) error { ethGen := new(core.Genesis) if err := ethGen.UnmarshalJSON(bz); err != nil { return err @@ -52,10 +56,12 @@ func (AppModuleBasic) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConf // TODO: this code actually needs to be removed as it will cause issues. // for address, account := range ethGen.Alloc { - // if ethGen.Config.IsEIP155(big.NewInt(0)) && account.Code != nil && account.Nonce == 0 { + // if ethGen.Config.IsEIP155(big.NewInt(0)) && account.Code != nil && + // account.Nonce == 0 { // // NOTE: EIP 161 was released at the same block as EIP 155. // return fmt.Errorf( - // "EIP-161 requires an account with code (%s) to have nonce of at least 1, given (0)", + // "EIP-161 requires an account with code (%s) to have nonce of at + // least 1, given (0)", // address.Hex(), // ) // } @@ -66,7 +72,11 @@ func (AppModuleBasic) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConf // InitGenesis performs genesis initialization for the evm module. It returns // no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, _ codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { +func (am AppModule) InitGenesis( + ctx sdk.Context, + _ codec.JSONCodec, + data json.RawMessage, +) []abci.ValidatorUpdate { var ethGen core.Genesis if err := ethGen.UnmarshalJSON(data); err != nil { panic(err) diff --git a/cosmos/x/evm/interfaces.go b/cosmos/x/evm/interfaces.go index d01f684e98..cea88cc24b 100644 --- a/cosmos/x/evm/interfaces.go +++ b/cosmos/x/evm/interfaces.go @@ -51,10 +51,10 @@ type BankKeeper interface { senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error MintCoins(ctx context.Context, moduleName string, amt sdk.Coins) error BurnCoins(ctx context.Context, moduleName string, amt sdk.Coins) error - SendCoins(ctx context.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + SendCoins(ctx context.Context, from sdk.AccAddress, to sdk.AccAddress, amt sdk.Coins) error } type StakingKeeper interface { - GetValidatorByConsAddr(ctx context.Context, consAddr sdk.ConsAddress) (validator stakingtypes.Validator, err error) + GetValidatorByConsAddr(context.Context, sdk.ConsAddress) (stakingtypes.Validator, error) ValidatorAddressCodec() addresscodec.Codec } diff --git a/cosmos/x/evm/keeper/deprecate_me_please.go b/cosmos/x/evm/keeper/deprecate_me_please.go index 2b318c7c18..fb9c75d272 100644 --- a/cosmos/x/evm/keeper/deprecate_me_please.go +++ b/cosmos/x/evm/keeper/deprecate_me_please.go @@ -49,7 +49,8 @@ func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.In return } ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), new(big.Int).Add(k.GetBalance(ctx, addr), amount).Bytes()) + ctx.KVStore(k.storeKey).Set( + state.BalanceKeyFor(ethAddr), new(big.Int).Add(k.GetBalance(ctx, addr), amount).Bytes()) } func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { @@ -57,5 +58,6 @@ func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.In return } ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), new(big.Int).Sub(k.GetBalance(ctx, addr), amount).Bytes()) + ctx.KVStore(k.storeKey).Set( + state.BalanceKeyFor(ethAddr), new(big.Int).Sub(k.GetBalance(ctx, addr), amount).Bytes()) } diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 2e256a6e3d..314de5f509 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -30,7 +30,10 @@ import ( ) // ProcessTransaction is called during the DeliverTx processing of the ABCI lifecycle. -func (k *Keeper) ProcessTransaction(ctx context.Context, tx *coretypes.Transaction) (*coretypes.Receipt, error) { +func (k *Keeper) ProcessTransaction( + ctx context.Context, + tx *coretypes.Transaction, +) (*coretypes.Receipt, error) { sCtx := sdk.UnwrapSDKContext(ctx) gasMeter := sCtx.GasMeter() // We zero-out the gas meter prior to evm execution in order to ensure that the receipt output diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index 3b46bca2e9..852e1c5a36 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -51,8 +51,12 @@ import ( . "github.com/onsi/gomega" ) -func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey) (stakingtypes.Validator, error) { - return stakingtypes.NewValidator(operator.String() /* todo move to codec */, pubKey, stakingtypes.Description{}) +func NewValidator( + operator sdk.ValAddress, + pubKey cryptotypes.PubKey, +) (stakingtypes.Validator, error) { + return stakingtypes.NewValidator( + operator.String() /* todo move to codec */, pubKey, stakingtypes.Description{}) } var ( @@ -167,7 +171,8 @@ var _ = Describe("Processor", func() { // create the contract // Zero out the meters. ctx.BlockGasMeter().RefundGas( - ctx.BlockGasMeter().GasConsumed(), "reset gas meter prior to ethereum state transition") + ctx.BlockGasMeter().GasConsumed(), + "reset gas meter prior to ethereum state transition") Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal(uint64(0))) // Execute state transition. @@ -187,7 +192,8 @@ var _ = Describe("Processor", func() { var solmateABI abi.ABI err = solmateABI.UnmarshalJSON([]byte(bindings.SolmateERC20ABI)) Expect(err).ToNot(HaveOccurred()) - input, err := solmateABI.Pack("mint", common.BytesToAddress([]byte{0x88}), big.NewInt(8888888)) + input, err := solmateABI.Pack("mint", common.BytesToAddress([]byte{0x88}), + big.NewInt(8888888)) Expect(err).ToNot(HaveOccurred()) legacyTxData.Data = input legacyTxData.Nonce++ @@ -221,7 +227,8 @@ var _ = Describe("Processor", func() { Expect(ctx.GasMeter().GasConsumed()).To(Equal((result3.GasUsed))) // After the tx is fully processed. ctx.BlockGasMeter().ConsumeGas(result3.GasUsed, "consume gas") - Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed + result2.GasUsed + result3.GasUsed))) + Expect(ctx.BlockGasMeter().GasConsumed()). + To(Equal((result.GasUsed + result2.GasUsed + result3.GasUsed))) }) }) }) diff --git a/cosmos/x/evm/plugins/block/header.go b/cosmos/x/evm/plugins/block/header.go index a4f72e99c5..7c3a08746a 100644 --- a/cosmos/x/evm/plugins/block/header.go +++ b/cosmos/x/evm/plugins/block/header.go @@ -42,8 +42,8 @@ const prevHeaderHashes = 256 // ===========================================================================. // SetQueryContextFn sets the query context func for the plugin. -func (p *plugin) SetQueryContextFn(gqc func() func(height int64, prove bool) (sdk.Context, error)) { - p.getQueryContext = gqc +func (p *plugin) SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) { + p.getQueryContext = fn } // GetHeaderByNumber returns the header at the given height, using the plugin's query context. diff --git a/cosmos/x/evm/plugins/block/header_test.go b/cosmos/x/evm/plugins/block/header_test.go index 2d248894e2..07a6abe291 100644 --- a/cosmos/x/evm/plugins/block/header_test.go +++ b/cosmos/x/evm/plugins/block/header_test.go @@ -47,7 +47,8 @@ var _ = Describe("Header", func() { _, _, _, sk := testutil.SetupMinimalKeepers() ctx = testutil.NewContext().WithBlockGasMeter(storetypes.NewGasMeter(uint64(10000))) p = utils.MustGetAs[*plugin](NewPlugin(testutil.EvmKey, sk)) - p.SetQueryContextFn(func() func(height int64, prove bool) (sdk.Context, error) { return mockQueryContext }) + p.SetQueryContextFn( + func() func(height int64, prove bool) (sdk.Context, error) { return mockQueryContext }) p.Prepare(ctx) // on block 0 (genesis) }) diff --git a/cosmos/x/evm/plugins/block/interfaces.go b/cosmos/x/evm/plugins/block/interfaces.go index 5f1c46b334..de6e54412e 100644 --- a/cosmos/x/evm/plugins/block/interfaces.go +++ b/cosmos/x/evm/plugins/block/interfaces.go @@ -30,7 +30,7 @@ import ( ) type StakingKeeper interface { - GetValidatorByConsAddr(ctx context.Context, consAddr sdk.ConsAddress) (validator stakingtypes.Validator, err error) + GetValidatorByConsAddr(context.Context, sdk.ConsAddress) (stakingtypes.Validator, error) ValidatorAddressCodec() addresscodec.Codec } diff --git a/cosmos/x/evm/plugins/gas/plugin_test.go b/cosmos/x/evm/plugins/gas/plugin_test.go index a2408bbcfb..4ac1564860 100644 --- a/cosmos/x/evm/plugins/gas/plugin_test.go +++ b/cosmos/x/evm/plugins/gas/plugin_test.go @@ -74,7 +74,7 @@ var _ = Describe("plugin", func() { Expect(err).ToNot(HaveOccurred()) Expect(p.gasMeter.GasConsumed()).To(Equal(uint64(1000))) Expect(p.gasMeter.GasRemaining()).To(Equal(uint64(0))) - Expect(p.BlockGasConsumed()).To(Equal(uint64(250))) // shouldn't have consumed any additional gas yet. + Expect(p.BlockGasConsumed()).To(Equal(uint64(250))) // shouldn't use any xtra gas yet. blockGasMeter.ConsumeGas(1000, "") // finalize tx 2 Expect(p.BlockGasConsumed()).To(Equal(uint64(1250))) p.Reset(testutil.NewContext().WithBlockGasMeter(blockGasMeter)) diff --git a/cosmos/x/evm/plugins/historical/historical_data.go b/cosmos/x/evm/plugins/historical/historical_data.go index 4ea28c5630..53957fdd57 100644 --- a/cosmos/x/evm/plugins/historical/historical_data.go +++ b/cosmos/x/evm/plugins/historical/historical_data.go @@ -51,17 +51,19 @@ func (p *plugin) StoreBlock(block *coretypes.Block) error { if err != nil { return err } - prefix.NewStore(store, []byte{types.BlockNumKeyToBlockPrefix}).Set(numBz, blockBz) + prefix.NewStore(store, []byte{types.BlockNumKeyToBlockPrefix}). + Set(numBz, blockBz) // store block hash to block number. - prefix.NewStore(store, []byte{types.BlockHashKeyToNumPrefix}).Set(block.Hash().Bytes(), numBz) + prefix.NewStore(store, []byte{types.BlockHashKeyToNumPrefix}). + Set(block.Hash().Bytes(), numBz) // store the version offchain for consistency. offChainNum := sdk.BigEndianToUint64(store.Get([]byte{types.VersionKey})) if blockNum > 0 && offChainNum != blockNum-1 { panic( fmt.Errorf( - "off-chain store's latest block number %d is not synced with previous block number %d", + "off-chain store's latest block number %d not synced with prev block number %d", offChainNum, blockNum-1, ), @@ -131,7 +133,8 @@ func (p *plugin) GetBlockByNumber(number uint64) (*coretypes.Block, error) { // GetBlockByHash returns the block at the given hash. func (p *plugin) GetBlockByHash(blockHash common.Hash) (*coretypes.Block, error) { store := p.ctx.KVStore(p.storeKey) - numBz := prefix.NewStore(store, []byte{types.BlockHashKeyToNumPrefix}).Get(blockHash.Bytes()) + numBz := prefix.NewStore( + store, []byte{types.BlockHashKeyToNumPrefix}).Get(blockHash.Bytes()) if numBz == nil { return nil, core.ErrBlockNotFound } @@ -149,7 +152,8 @@ func (p *plugin) GetBlockByHash(blockHash common.Hash) (*coretypes.Block, error) // GetTransactionByHash returns the transaction lookup entry with the given hash. func (p *plugin) GetTransactionByHash(txHash common.Hash) (*coretypes.TxLookupEntry, error) { // get tx from off chain. - tleBz := prefix.NewStore(p.ctx.KVStore(p.storeKey), []byte{types.TxHashKeyToTxPrefix}).Get(txHash.Bytes()) + tleBz := prefix.NewStore( + p.ctx.KVStore(p.storeKey), []byte{types.TxHashKeyToTxPrefix}).Get(txHash.Bytes()) if tleBz == nil { return nil, core.ErrTxNotFound } @@ -171,7 +175,8 @@ func (p *plugin) GetReceiptsByHash(blockHash common.Hash) (coretypes.Receipts, e } receipts, err := coretypes.UnmarshalReceipts(receiptsBz) if err != nil { - return nil, errorslib.Wrapf(err, "failed to unmarshal receipts for block hash %s", blockHash.Hex()) + return nil, errorslib.Wrapf( + err, "failed to unmarshal receipts for block hash %s", blockHash.Hex()) } // get block to derive fields on receipts diff --git a/cosmos/x/evm/plugins/historical/plugin_test.go b/cosmos/x/evm/plugins/historical/plugin_test.go index 2b142d94ec..7815df67f2 100644 --- a/cosmos/x/evm/plugins/historical/plugin_test.go +++ b/cosmos/x/evm/plugins/historical/plugin_test.go @@ -73,7 +73,9 @@ var _ = Describe("Historical Data", func() { Number: big.NewInt(1), GasLimit: 1000, } - tx := coretypes.NewTransaction(0, common.Address{0x1}, big.NewInt(1), 1000, big.NewInt(1), []byte{0x12}) + tx := coretypes.NewTransaction( + 0, common.Address{0x1}, big.NewInt(1), 1000, big.NewInt(1), []byte{0x12}, + ) txHash := tx.Hash() receipts := coretypes.Receipts{ { diff --git a/cosmos/x/evm/plugins/precompile/log/attributes.go b/cosmos/x/evm/plugins/precompile/log/attributes.go index 172c3fb539..afa3d1d959 100644 --- a/cosmos/x/evm/plugins/precompile/log/attributes.go +++ b/cosmos/x/evm/plugins/precompile/log/attributes.go @@ -73,8 +73,8 @@ var ( _ precompile.ValueDecoder = ConvertCommonHexAddress ) -// ConvertSdkCoins converts the string representation of an `sdk.Coins` to a `[]generated.CosmosCoin`. -// +// ConvertSdkCoins converts the string representation of an `sdk.Coins` +// to a `[]generated.CosmosCoin`. // ConvertSdkCoins is a `precompile.ValueDecoder`. func ConvertSdkCoins(attributeValue string) (any, error) { // extract the sdk.Coins from string value diff --git a/cosmos/x/evm/plugins/precompile/log/errors.go b/cosmos/x/evm/plugins/precompile/log/errors.go index b37d5bbff3..3efd8c6f91 100644 --- a/cosmos/x/evm/plugins/precompile/log/errors.go +++ b/cosmos/x/evm/plugins/precompile/log/errors.go @@ -25,15 +25,19 @@ import "errors" var ( // ErrNoAttributeKeyFound is returned when no Cosmos event attribute is provided for a // certain Ethereum event's argument. - ErrNoAttributeKeyFound = errors.New("this Ethereum event argument has no matching Cosmos attribute key") + ErrNoAttributeKeyFound = errors.New( + "this Ethereum event argument has no matching Cosmos attribute key") // ErrNotEnoughAttributes is returned when a Cosmos event does not have enough attributes for // its corresponding Ethereum event; there are less Cosmos event attributes than Ethereum event // arguments. - ErrNotEnoughAttributes = errors.New("not enough event attributes provided") + ErrNotEnoughAttributes = errors.New( + "not enough event attributes provided") // ErrNoValueDecoderFunc is returned when a Cosmos event's attribute key is not mapped to any // attribute value decoder function. - ErrNoValueDecoderFunc = errors.New("no value decoder function is found for event attribute key") + ErrNoValueDecoderFunc = errors.New( + "no value decoder function is found for event attribute key") // ErrNumberOfCoinsNotSupported is returned when the number of coins in a Cosmos event for the // "amount" attribute is not equal to 1. - ErrNumberOfCoinsNotSupported = errors.New("number of coins not supported") + ErrNumberOfCoinsNotSupported = errors.New( + "number of coins not supported") ) diff --git a/cosmos/x/evm/plugins/precompile/log/factory_test.go b/cosmos/x/evm/plugins/precompile/log/factory_test.go index f551602296..d5e7ffd8c8 100644 --- a/cosmos/x/evm/plugins/precompile/log/factory_test.go +++ b/cosmos/x/evm/plugins/precompile/log/factory_test.go @@ -179,7 +179,8 @@ var _ = Describe("Factory", func() { ) log, err := f.Build(&event) Expect(log).To(BeNil()) - Expect(err.Error()).To(Equal("no value decoder function is found for event attribute key: invalid_arg")) + Expect(err.Error()).To( + Equal("no value decoder function is found for event attribute key: invalid_arg")) }) It("should error on decoders returning errors", func() { @@ -240,7 +241,8 @@ var _ = Describe("Factory", func() { ) log, err := f.Build(&event) Expect(log).To(BeNil()) - Expect(err.Error()).To(Equal("this Ethereum event argument has no matching Cosmos attribute key: customAmount")) + Expect(err.Error()).To(Equal( + "this Ethereum event argument has no matching Cosmos attribute key: customAmount")) event = sdk.NewEvent( "custom_unbonding_delegation", @@ -249,7 +251,8 @@ var _ = Describe("Factory", func() { ) log, err = f.Build(&event) Expect(log).To(BeNil()) - Expect(err.Error()).To(Equal("this Ethereum event argument has no matching Cosmos attribute key: customValidator")) + Expect(err.Error()).To(Equal( + "this Ethereum event argument has no matching Cosmos attribute key: customValidator")) }) }) }) diff --git a/cosmos/x/evm/plugins/precompile/recovery.go b/cosmos/x/evm/plugins/precompile/recovery.go index 7f900a7a1d..3e9b74cc21 100644 --- a/cosmos/x/evm/plugins/precompile/recovery.go +++ b/cosmos/x/evm/plugins/precompile/recovery.go @@ -38,7 +38,8 @@ func RecoveryHandler(err *error) { // is ErrWriteProtection, Cosmos ErrorOutOfGas, Cosmos ErrorGasOverflow, or Cosmos // ErrorNegativeGasConsumed. switch { - case utils.Implements[error](panicked) && errors.Is(utils.MustGetAs[error](panicked), vm.ErrWriteProtection): + case utils.Implements[error](panicked) && + errors.Is(utils.MustGetAs[error](panicked), vm.ErrWriteProtection): *err = vm.ErrWriteProtection case utils.Implements[storetypes.ErrorGasOverflow](panicked): fallthrough diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 7054f51b77..dbc226d948 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -57,9 +57,9 @@ type Plugin interface { core.StatePlugin // SetQueryContextFn sets the query context func for the plugin. SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) - // IterateBalances iterates over the balances of all accounts and calls the given callback function. + // IterateBalances iterates over the balances of all accounts and calls the callback function. IterateBalances(fn func(common.Address, *big.Int) bool) - // IterateState iterates over the state of all accounts and calls the given callback function. + // IterateState iterates over the state of all accounts and calls the callback function. IterateState(fn func(addr common.Address, key common.Hash, value common.Hash) bool) // SetGasConfig sets the gas config for the plugin. SetGasConfig(storetypes.GasConfig, storetypes.GasConfig) @@ -162,8 +162,8 @@ func (p *plugin) Reset(ctx context.Context) { // a way to handle converting Cosmos events from precompiles into Ethereum logs. cem := events.NewManagerFrom(sdkCtx.EventManager(), p.plf) - // We need to build a custom configuration for the context in order to handle precompile event logs - // and proper gas consumption. + // We need to build a custom configuration for the context in order to handle precompile event + // logs and proper gas consumption. p.ctx = sdkCtx.WithMultiStore(p.cms).WithEventManager(cem) // We also remove the KVStore gas metering from the context prior to entering the EVM @@ -173,7 +173,8 @@ func (p *plugin) Reset(ctx context.Context) { // in the EVM are not being charged additional gas unknowingly. p.SetGasConfig(storetypes.GasConfig{}, storetypes.GasConfig{}) - // We setup a snapshot controller to properly revert the Controllable MultiStore and EventManager. + // We setup a snapshot controller to properly revert the Controllable MultiStore + // and EventManager. p.Controller = snapshot.NewController[string, libtypes.Controllable[string]]() _ = p.Controller.Register(p.cms) _ = p.Controller.Register(cem) @@ -522,8 +523,8 @@ func (p *plugin) IterateBalances(fn func(common.Address, *big.Int) bool) { // ============================================================================= // SetQueryContextFn sets the query context func for the plugin. -func (p *plugin) SetQueryContextFn(gqc func() func(height int64, prove bool) (sdk.Context, error)) { - p.getQueryContext = gqc +func (p *plugin) SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) { + p.getQueryContext = fn } // StateAtBlockNumber implements `core.StatePlugin`. diff --git a/cosmos/x/evm/plugins/state/plugin_test.go b/cosmos/x/evm/plugins/state/plugin_test.go index 63e2e14de5..9796970650 100644 --- a/cosmos/x/evm/plugins/state/plugin_test.go +++ b/cosmos/x/evm/plugins/state/plugin_test.go @@ -278,9 +278,11 @@ var _ = Describe("State Plugin", func() { Expect(err).ToNot(HaveOccurred()) Expect(bobStorage).To(HaveLen(1)) Expect(bobStorage[0].Key). - To(Equal(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001"))) + To(Equal(common.HexToHash( + "0x0000000000000000000000000000000000000000000000000000000000000001"))) Expect(bobStorage[0].Value). - To(Equal(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000002"))) + To(Equal(common.HexToHash( + "0x0000000000000000000000000000000000000000000000000000000000000002"))) sp.SetState(bob, common.BytesToHash([]byte{3}), common.BytesToHash([]byte{4})) var bobStorage2 Storage diff --git a/e2e/localnet/network/fixture.go b/e2e/localnet/network/fixture.go index 7a2fa228c8..77f786a8c3 100644 --- a/e2e/localnet/network/fixture.go +++ b/e2e/localnet/network/fixture.go @@ -91,7 +91,8 @@ func NewFixtureConfig( } } -// TestFixture is a testing fixture that runs a single Polaris validator node in a Docker container. +// TestFixture is a testing fixture that runs a single Polaris validator +// node in a Docker container. type TestFixture struct { ContainerizedNode t ginkgo.FullGinkgoTInterface diff --git a/e2e/precompile/contracts/gov/governance_test.go b/e2e/precompile/contracts/gov/governance_test.go index 8e568abc67..279597a09c 100644 --- a/e2e/precompile/contracts/gov/governance_test.go +++ b/e2e/precompile/contracts/gov/governance_test.go @@ -95,7 +95,8 @@ var _ = Describe("Call the Precompile Directly", func() { // Alice Submits a proposal. amt := sdkmath.NewInt(100000000) - prop, _ := propAndMsgBz(accCodec, cosmlib.MustStringFromEthAddress(accCodec, tf.Address("alice")), amt) + prop, _ := propAndMsgBz( + accCodec, cosmlib.MustStringFromEthAddress(accCodec, tf.Address("alice")), amt) txr := tf.GenerateTransactOpts("alice") tx, err = precompile.SubmitProposal(txr, prop) Expect(err).ToNot(HaveOccurred()) diff --git a/e2e/precompile/contracts/staking/staking_test.go b/e2e/precompile/contracts/staking/staking_test.go index 7d7ec07dc7..581596b400 100644 --- a/e2e/precompile/contracts/staking/staking_test.go +++ b/e2e/precompile/contracts/staking/staking_test.go @@ -101,7 +101,8 @@ var _ = Describe("Staking", func() { Expect(err).ToNot(HaveOccurred()) Expect(delegated.Cmp(delegateAmt)).To(Equal(0)) - delVals, _, err := stakingPrecompile.GetDelegatorValidators(nil, tf.Address("alice"), bindings.CosmosPageRequest{}) + delVals, _, err := stakingPrecompile.GetDelegatorValidators( + nil, tf.Address("alice"), bindings.CosmosPageRequest{}) Expect(err).ToNot(HaveOccurred()) Expect(delVals).To(HaveLen(1)) Expect(delVals[0].OperatorAddr).To(Equal(validator)) diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index d14ebda30a..000baf87f7 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -314,7 +314,9 @@ func (app *SimApp) SimulationManager() *module.SimulationManager { func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { app.App.RegisterAPIRoutes(apiSvr, apiConfig) // register swagger API in app.go so that other applications can override easily - if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil { + if err := server.RegisterSwaggerAPI( + apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger, + ); err != nil { panic(err) } diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index fab387a3c1..8976c2780d 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -88,11 +88,16 @@ var ( moduleAccPerms = []*authmodulev1.ModuleAccountPermission{ {Account: authtypes.FeeCollectorName}, {Account: distrtypes.ModuleName}, - {Account: minttypes.ModuleName, Permissions: []string{authtypes.Minter}}, - {Account: stakingtypes.BondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}}, - {Account: stakingtypes.NotBondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}}, - {Account: govtypes.ModuleName, Permissions: []string{authtypes.Burner}}, - {Account: evmtypes.ModuleName, Permissions: []string{authtypes.Minter, authtypes.Burner}}, + {Account: minttypes.ModuleName, + Permissions: []string{authtypes.Minter}}, + {Account: stakingtypes.BondedPoolName, + Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}}, + {Account: stakingtypes.NotBondedPoolName, + Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}}, + {Account: govtypes.ModuleName, + Permissions: []string{authtypes.Burner}}, + {Account: evmtypes.ModuleName, + Permissions: []string{authtypes.Minter, authtypes.Burner}}, } // blocked account addresses. @@ -155,7 +160,8 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { }, // NOTE: The genutils module must occur after staking so that pools are // properly initialized with tokens from genesis accounts. - // NOTE: The genutils module must also occur after auth so that it can access the params from auth. + // NOTE: The genutils module must also occur after auth so that + // it can access the params from auth. InitGenesis: []string{ authtypes.ModuleName, banktypes.ModuleName, @@ -186,7 +192,8 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { Config: appconfig.WrapAny(&authmodulev1.Module{ Bech32Prefix: bech32Prefix, ModuleAccountPermissions: moduleAccPerms, - // By default modules authority is the governance module. This is configurable with the following: + // By default modules authority is the governance module. + // This is configurable with the following: // Authority: "group", // A custom module authority can be set using a module name // Authority: "cosmos1cwwv22j5ca08ggdv9c2uky355k908694z577tv", // or a specific address }), diff --git a/e2e/testapp/export.go b/e2e/testapp/export.go index 4e915bb3dc..bc6e40cb27 100644 --- a/e2e/testapp/export.go +++ b/e2e/testapp/export.go @@ -100,14 +100,16 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] /* Handle fee distribution state. */ // withdraw all validator commission - if err := app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) bool { - valBz, err := app.StakingKeeper.ValidatorAddressCodec().StringToBytes(val.GetOperator()) - if err != nil { - panic(err) - } - _, _ = app.DistrKeeper.WithdrawValidatorCommission(ctx, valBz) - return false - }); err != nil { + if err := app.StakingKeeper.IterateValidators(ctx, + func(_ int64, val stakingtypes.ValidatorI) bool { + valBz, err := app.StakingKeeper.ValidatorAddressCodec().StringToBytes( + val.GetOperator()) + if err != nil { + panic(err) + } + _, _ = app.DistrKeeper.WithdrawValidatorCommission(ctx, valBz) + return false + }); err != nil { panic(err) } @@ -138,30 +140,31 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] ctx = ctx.WithBlockHeight(0) // reinitialize all validators - if err := app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) bool { - valBz, err := app.StakingKeeper.ValidatorAddressCodec().StringToBytes(val.GetOperator()) - if err != nil { - panic(err) - } - // donate any unwithdrawn outstanding reward fraction tokens to the community pool - scraps, err := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, valBz) - if err != nil { - panic(err) - } - feePool, err := app.DistrKeeper.FeePool.Get(ctx) - if err != nil { - panic(err) - } - feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) - if err = app.DistrKeeper.FeePool.Set(ctx, feePool); err != nil { - panic(err) - } + if err := app.StakingKeeper.IterateValidators( + ctx, func(_ int64, val stakingtypes.ValidatorI) bool { + valBz, err := app.StakingKeeper.ValidatorAddressCodec().StringToBytes(val.GetOperator()) + if err != nil { + panic(err) + } + // donate any unwithdrawn outstanding reward fraction tokens to the community pool + scraps, err := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, valBz) + if err != nil { + panic(err) + } + feePool, err := app.DistrKeeper.FeePool.Get(ctx) + if err != nil { + panic(err) + } + feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) + if err = app.DistrKeeper.FeePool.Set(ctx, feePool); err != nil { + panic(err) + } - if err = app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, valBz); err != nil { - panic(err) - } - return false - }); err != nil { + if err = app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, valBz); err != nil { + panic(err) + } + return false + }); err != nil { panic(err) } @@ -190,28 +193,30 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] /* Handle staking state. */ // iterate through redelegations, reset creation height - if err := app.StakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) bool { - for i := range red.Entries { - red.Entries[i].CreationHeight = 0 - } - if err := app.StakingKeeper.SetRedelegation(ctx, red); err != nil { - panic(err) - } - return false - }); err != nil { + if err := app.StakingKeeper.IterateRedelegations( + ctx, func(_ int64, red stakingtypes.Redelegation) bool { + for i := range red.Entries { + red.Entries[i].CreationHeight = 0 + } + if err := app.StakingKeeper.SetRedelegation(ctx, red); err != nil { + panic(err) + } + return false + }); err != nil { panic(err) } // iterate through unbonding delegations, reset creation height - if err := app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) bool { - for i := range ubd.Entries { - ubd.Entries[i].CreationHeight = 0 - } - if err := app.StakingKeeper.SetUnbondingDelegation(ctx, ubd); err != nil { - panic(err) - } - return false - }); err != nil { + if err := app.StakingKeeper.IterateUnbondingDelegations( + ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) bool { + for i := range ubd.Entries { + ubd.Entries[i].CreationHeight = 0 + } + if err := app.StakingKeeper.SetUnbondingDelegation(ctx, ubd); err != nil { + panic(err) + } + return false + }); err != nil { panic(err) } diff --git a/e2e/testapp/helpers.go b/e2e/testapp/helpers.go index 30a579431a..53a2e6f5f3 100644 --- a/e2e/testapp/helpers.go +++ b/e2e/testapp/helpers.go @@ -36,7 +36,10 @@ import ( // PrecompilesToInject returns a function that provides the initialization of the standard // set of precompiles. -func PrecompilesToInject(app *SimApp, customPcs ...ethprecompile.Registrable) func() *ethprecompile.Injector { +func PrecompilesToInject( + app *SimApp, + customPcs ...ethprecompile.Registrable, +) func() *ethprecompile.Injector { return func() *ethprecompile.Injector { // Create the precompile injector with the standard precompiles. pcs := ethprecompile.NewPrecompiles([]ethprecompile.Registrable{ diff --git a/e2e/testapp/polard/cmd/root_test.go b/e2e/testapp/polard/cmd/root_test.go index 20d5b07381..aa1dcd01c0 100644 --- a/e2e/testapp/polard/cmd/root_test.go +++ b/e2e/testapp/polard/cmd/root_test.go @@ -55,7 +55,7 @@ var _ = Describe("Init command", func() { rootCmd.SetArgs([]string{ "init", // Test the init cmd "simapp-test", // Moniker - fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json, in case it already exists + fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json }) err := svrcmd.Execute(rootCmd, "", testapp.DefaultNodeHome) diff --git a/e2e/testapp/sim_test.go b/e2e/testapp/sim_test.go index c796434caa..40aa028951 100644 --- a/e2e/testapp/sim_test.go +++ b/e2e/testapp/sim_test.go @@ -104,8 +104,10 @@ func TestAppSimulationAfterImport(t *testing.T) { t, os.Stdout, app.BaseApp, - simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), app.DefaultGenesis()), - simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 + simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), + app.DefaultGenesis()), + simtypes.RandomAccounts, // Replace with own + // random account function if using keys other than secp256k1 simtestutil.SimulationOperations(app, app.AppCodec(), config), BlockedAddresses(), config, @@ -173,8 +175,10 @@ func TestAppSimulationAfterImport(t *testing.T) { t, os.Stdout, newApp.BaseApp, - simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), app.DefaultGenesis()), - simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 + simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), + app.DefaultGenesis()), + // Replace with own random account function if using keys other than secp256k1 + simtypes.RandomAccounts, simtestutil.SimulationOperations(newApp, newApp.AppCodec(), config), BlockedAddresses(), config, diff --git a/e2e/testapp/upgrades.go b/e2e/testapp/upgrades.go index d1a65fec73..725b594c18 100644 --- a/e2e/testapp/upgrades.go +++ b/e2e/testapp/upgrades.go @@ -40,7 +40,9 @@ const UpgradeName = "v047-to-v050" func (app SimApp) RegisterUpgradeHandlers() { app.UpgradeKeeper.SetUpgradeHandler( UpgradeName, - func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + func( + ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap, + ) (module.VersionMap, error) { return app.ModuleManager.RunMigrations(ctx, app.Configurator(), fromVM) }, ) diff --git a/eth/core/chain_helpers.go b/eth/core/chain_helpers.go index a60485c8ba..6233745131 100644 --- a/eth/core/chain_helpers.go +++ b/eth/core/chain_helpers.go @@ -26,7 +26,10 @@ import ( ) // deriveReceipts derives the receipts from the block. -func (bc *blockchain) deriveReceipts(receipts types.Receipts, blockHash common.Hash) (types.Receipts, error) { +func (bc *blockchain) deriveReceipts( + receipts types.Receipts, + blockHash common.Hash, +) (types.Receipts, error) { // get the block to derive the receipts block := bc.GetBlockByHash(blockHash) if block == nil { diff --git a/eth/core/chain_reader.go b/eth/core/chain_reader.go index d28962f91c..5dcbe8371f 100644 --- a/eth/core/chain_reader.go +++ b/eth/core/chain_reader.go @@ -236,7 +236,8 @@ func (bc *blockchain) GetReceiptsByHash(blockHash common.Hash) types.Receipts { // check the historical plugin receipts, err := bc.hp.GetReceiptsByHash(blockHash) if receipts == nil || err != nil { - bc.logger.Debug("failed to get receipts from historical plugin", "receipts", receipts, "err", err) + bc.logger.Debug( + "failed to get receipts from historical plugin", "receipts", receipts, "err", err) return nil } diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index df9c5a24d0..0def5e1b4a 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -28,8 +28,8 @@ import ( "pkg.berachain.dev/polaris/eth/core/vm" ) -// ChainResources is the interface that defines functions for code paths within the chain to acquire -// resources to use in execution such as StateDBss and EVMss. +// ChainResources is the interface that defines functions for code paths within the chain to +// acquire resources to use in execution such as StateDBss and EVMss. type ChainResources interface { StateAtBlockNumber(uint64) (state.StateDBI, error) StateAt(root common.Hash) (state.StateDBI, error) diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 51588c7ca2..b26fc58b44 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -30,7 +30,11 @@ type ChainWriter interface { } // InsertBlock inserts a block into the canonical chain and updates the state of the blockchain. -func (bc *blockchain) InsertBlock(block *types.Block, receipts types.Receipts, logs []*types.Log) error { +func (bc *blockchain) InsertBlock( + block *types.Block, + receipts types.Receipts, + logs []*types.Log, +) error { var err error // TODO: prepare historical plugin here? @@ -44,7 +48,8 @@ func (bc *blockchain) InsertBlock(block *types.Block, receipts types.Receipts, l // TODO: restructure this function / flow it sucks // // *********************************************** // blockHash, blockNum := block.Hash(), block.Number().Uint64() - bc.logger.Info("finalizing evm block", "block_hash", blockHash.Hex(), "num_txs", len(receipts)) + bc.logger.Info( + "finalizing evm block", "block_hash", blockHash.Hex(), "num_txs", len(receipts)) // store the block header on the host chain err = bc.bp.StoreHeader(block.Header()) diff --git a/eth/core/genesis.go b/eth/core/genesis.go index c66f3dfb32..4a598d66e8 100644 --- a/eth/core/genesis.go +++ b/eth/core/genesis.go @@ -39,9 +39,10 @@ type ( // DefaultGenesis is the default genesis block used by Polaris. var DefaultGenesis = &core.Genesis{ // Genesis Block - Nonce: 0, - Timestamp: 0, - ExtraData: hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"), + Nonce: 0, + Timestamp: 0, + ExtraData: hexutil.MustDecode( + "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"), GasLimit: 30_000_000, //nolint:gomnd // its okay. Difficulty: big.NewInt(0), Mixhash: common.Hash{}, diff --git a/eth/core/imported.go b/eth/core/imported.go index 23ec404711..194a7649f6 100644 --- a/eth/core/imported.go +++ b/eth/core/imported.go @@ -62,6 +62,7 @@ var ( ) var ( - // ErrInsufficientBalanceForGas is the error return when gas required to execute a transaction overflows. + // ErrInsufficientBalanceForGas is the error return when + // gas required to execute a transaction overflows. ErrGasUintOverflow = core.ErrGasUintOverflow ) diff --git a/eth/core/precompile/errors.go b/eth/core/precompile/errors.go index caf8db263a..ee114489ce 100644 --- a/eth/core/precompile/errors.go +++ b/eth/core/precompile/errors.go @@ -24,21 +24,26 @@ import "errors" var ( // ErrMethodNotFound is returned when the precompile method is not found. - ErrMethodNotFound = errors.New("precompile method not found in contract ABI") + ErrMethodNotFound = errors.New( + "precompile method not found in contract ABI") // ErrContainerHasNoMethods is returned when a stateful container function is invoked but no // precompile methods were registered. - ErrContainerHasNoMethods = errors.New("the stateful precompile has no methods to run") + ErrContainerHasNoMethods = errors.New( + "the stateful precompile has no methods to run") // ErrInvalidInputToPrecompile is returned when a precompile container receives invalid // input. - ErrInvalidInputToPrecompile = errors.New("input bytes to precompile container are invalid") + ErrInvalidInputToPrecompile = errors.New( + "input bytes to precompile container are invalid") // ErrWrongContainerFactory is returned when the wrong precompile container factory is used // to build a precompile contract. - ErrWrongContainerFactory = errors.New("wrong container factory for this precompile implementation") + ErrWrongContainerFactory = errors.New( + "wrong container factory for this precompile implementation") // ErrNoPrecompileMethodForABIMethod is returned when no precompile method is provided for a // corresponding ABI method. - ErrNoPrecompileMethodForABIMethod = errors.New("this ABI method does not have a corresponding precompile method") + ErrNoPrecompileMethodForABIMethod = errors.New( + "this ABI method does not have a corresponding precompile method") ) diff --git a/eth/core/precompile/factories_test.go b/eth/core/precompile/factories_test.go index e0f4632503..78515677bd 100644 --- a/eth/core/precompile/factories_test.go +++ b/eth/core/precompile/factories_test.go @@ -53,7 +53,9 @@ var _ = Describe("Container Factories", func() { Expect(pc).ToNot(BeNil()) _, err = scf.Build(&mockBase{}, nil) - Expect(err.Error()).To(Equal("wrong container factory for this precompile implementation: StatelessImpl")) + Expect(err.Error()). + To(Equal( + "wrong container factory for this precompile implementation: StatelessImpl")) }) }) @@ -83,7 +85,10 @@ var _ = Describe("Container Factories", func() { It("should error on missing precompile method for ABI method", func() { _, err := scf.Build(&badMockStateful{&mockBase{}}, nil) - Expect(err.Error()).To(Equal("this ABI method does not have a corresponding precompile method: getOutputPartial")) + Expect(err.Error()). + To(Equal( + "this ABI method does not have a " + + "corresponding precompile method: getOutputPartial")) }) }) diff --git a/eth/core/precompile/method_validation.go b/eth/core/precompile/method_validation.go index a24256d27c..f311dee384 100644 --- a/eth/core/precompile/method_validation.go +++ b/eth/core/precompile/method_validation.go @@ -90,8 +90,8 @@ func validateArg(implMethodVar reflect.Value, abiMethodVar reflect.Value) error return nil } -// validateStruct checks to make sure that the implementation struct's fields match the ABI struct's -// fields. +// validateStruct checks to make sure that the implementation struct's fields match the ABI +// struct's fields. func validateStruct(implMethodVarType reflect.Type, abiMethodVarType reflect.Type) error { if implMethodVarType.Kind() != reflect.Struct || abiMethodVarType.Kind() != reflect.Struct { return errors.New("validateStruct: not a struct") diff --git a/eth/core/precompile/method_validation_test.go b/eth/core/precompile/method_validation_test.go index b1e9b37610..4aa9fa42b4 100644 --- a/eth/core/precompile/method_validation_test.go +++ b/eth/core/precompile/method_validation_test.go @@ -159,11 +159,21 @@ type mockStructBadNumFields struct { func (m *mockImpl) MockMethod() error { return nil } -func (m *mockImpl) ExampleFunc(_ context.Context, _ *big.Int, _ common.Address, _ []mockStruct) (bool, error) { +func (m *mockImpl) ExampleFunc( + _ context.Context, + _ *big.Int, + _ common.Address, + _ []mockStruct, +) (bool, error) { return true, nil } -func (m *mockImpl) ExampleFuncBad(_ context.Context, _ *big.Int, _ common.Address, _ []mockStructBad) (bool, error) { +func (m *mockImpl) ExampleFuncBad( + _ context.Context, + _ *big.Int, + _ common.Address, + _ []mockStructBad, +) (bool, error) { return true, nil } diff --git a/eth/core/precompile/stateful_container_test.go b/eth/core/precompile/stateful_container_test.go index 1b3b738efd..e6e4901752 100644 --- a/eth/core/precompile/stateful_container_test.go +++ b/eth/core/precompile/stateful_container_test.go @@ -144,21 +144,27 @@ var _ = Describe("Stateful Container", func() { // MOCKS BELOW. var ( - mock, _ = solidity.MockPrecompileMetaData.GetAbi() - getOutputABI = mock.Methods["getOutput"] - getOutputPartialABI = mock.Methods["getOutputPartial"] - contractFuncAddrABI = mock.Methods["contractFunc"] - contractFuncStrABI = mock.Methods["contractFuncStr"] - overloadedFuncABI = mock.Methods["overloadedFunc"] - overloadedFunc0ABI = mock.Methods["overloadedFunc0"] - mockStatefulDummy = &mockStateful{&mockBase{}} - getOutputFunc, _ = reflect.TypeOf(mockStatefulDummy).MethodByName("GetOutput") - getOutputPartialFunc, _ = reflect.TypeOf(mockStatefulDummy).MethodByName("GetOutputPartial") - contractFuncAddrInputFunc, _ = reflect.TypeOf(mockStatefulDummy).MethodByName("ContractFuncAddrInput") - contractFuncStrInputFunc, _ = reflect.TypeOf(mockStatefulDummy).MethodByName("ContractFuncStrInput") - overloadedFunc, _ = reflect.TypeOf(mockStatefulDummy).MethodByName("OverloadedFunc") - overloadedFunc0, _ = reflect.TypeOf(mockStatefulDummy).MethodByName("OverloadedFunc0") - mockIdsToMethods = map[methodID]*method{ + mock, _ = solidity.MockPrecompileMetaData.GetAbi() + getOutputABI = mock.Methods["getOutput"] + getOutputPartialABI = mock.Methods["getOutputPartial"] + contractFuncAddrABI = mock.Methods["contractFunc"] + contractFuncStrABI = mock.Methods["contractFuncStr"] + overloadedFuncABI = mock.Methods["overloadedFunc"] + overloadedFunc0ABI = mock.Methods["overloadedFunc0"] + mockStatefulDummy = &mockStateful{&mockBase{}} + getOutputFunc, _ = reflect.TypeOf( + mockStatefulDummy).MethodByName("GetOutput") + getOutputPartialFunc, _ = reflect.TypeOf( + mockStatefulDummy).MethodByName("GetOutputPartial") + contractFuncAddrInputFunc, _ = reflect.TypeOf( + mockStatefulDummy).MethodByName("ContractFuncAddrInput") + contractFuncStrInputFunc, _ = reflect.TypeOf( + mockStatefulDummy).MethodByName("ContractFuncStrInput") + overloadedFunc, _ = reflect.TypeOf( + mockStatefulDummy).MethodByName("OverloadedFunc") + overloadedFunc0, _ = reflect.TypeOf( + mockStatefulDummy).MethodByName("OverloadedFunc0") + mockIdsToMethods = map[methodID]*method{ methodID(getOutputABI.ID): newMethod( mockStatefulDummy, getOutputABI, diff --git a/eth/core/state/journal/selfdestructs.go b/eth/core/state/journal/selfdestructs.go index 3fd28bd3d1..fa29772a6c 100644 --- a/eth/core/state/journal/selfdestructs.go +++ b/eth/core/state/journal/selfdestructs.go @@ -85,9 +85,9 @@ func (s *selfDestructs) RegistryKey() string { return suicidesRegistryKey } -// SelfDestruct implements the PolarisStateDB interface by marking the given address as self destructed . -// This clears the account balance, but the code and state of the address remains available -// until after Commit is called. +// SelfDestruct implements the PolarisStateDB interface by marking the given address as self +// destructed. This clears the account balance, but the code and state of the address remains +// available until after Commit is called. func (s *selfDestructs) SelfDestruct(addr common.Address) { // ensure only one suicide per snapshot call if s.Size() > s.lastSnapshot { @@ -112,8 +112,8 @@ func (s *selfDestructs) Selfdestruct6780(_ common.Address) { // TODO: IMPLEMENT EIP-6780 } -// HasSelfDestructed implements the PolarisStateDB interface by returning if the contract was self destructed -// in current transaction. +// HasSelfDestructed implements the PolarisStateDB interface by returning if the contract was +// self destructed in current transaction. func (s *selfDestructs) HasSelfDestructed(addr common.Address) bool { for i := s.Size() - 1; i >= 0; i-- { if *s.PeekAt(i) == addr { diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index 9e79abcb9a..4275d78908 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -122,8 +122,8 @@ func (sdb *stateDB) RevertToSnapshot(id int) { // Commit state // ============================================================================= -// Finalise deletes the SelfDestructd accounts and finalizes all plugins, preparing the statedb for the -// next transaction. +// Finalise deletes the SelfDestructd accounts and finalizes all plugins, preparing +// the statedb for the next transaction. func (sdb *stateDB) Finalise(bool) { sdb.DeleteAccounts(sdb.GetSelfDestructs()) sdb.ctrl.Finalize() diff --git a/eth/core/vm/errors.go b/eth/core/vm/errors.go index 0d83ccdb8c..26af6f9cba 100644 --- a/eth/core/vm/errors.go +++ b/eth/core/vm/errors.go @@ -25,5 +25,6 @@ import "errors" var ( // ErrStateDBNotSupported is returned when the state DB is not compatible for running // stateful precompiles. - ErrStateDBNotSupported = errors.New("given StateDB is not compatible for running stateful precompiles") + ErrStateDBNotSupported = errors.New( + "given StateDB is not compatible for running stateful precompiles") ) diff --git a/eth/miner/miner.go b/eth/miner/miner.go index 020919c994..d02925a218 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -196,7 +196,8 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { if chainConfig.IsCancun(parent.Number, parent.Time) { excessBlobGas = eip4844.CalcExcessBlobGas(*parent.ExcessBlobGas, *parent.BlobGasUsed) } else { - // For the first post-fork block, both parent.data_gas_used and parent.excess_data_gas are evaluated as 0 + // For the first post-fork block, both parent.data_gas_used and + // parent.excess_data_gas are evaluated as 0 excessBlobGas = eip4844.CalcExcessBlobGas(0, 0) } m.pendingHeader.BlobGasUsed = new(uint64) @@ -206,7 +207,6 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { m.logger.Info("preparing evm block", "seal_hash", m.pendingHeader.Hash()) - // TODO: abstract the evm from the miner, so that the miner is only concerned with txs and blocks. var ( // TODO: we are hardcoding author to coinbase, this may be incorrect. // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. @@ -219,19 +219,19 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { // Prepare the State Processor, StateDB and the EVM for the block. // TODO: miner should not have a processor. Copy what dydx does in which validators and full nodes // have different prepare and process proposals. - // // Heuristic: Validators get miners. Full nodes get processors. m.processor.Prepare( vmenv, m.pendingHeader, ) - return m.pendingHeader } -// ProcessTransaction processes the given transaction and returns the receipt after applying -// the state transition. This method is called for each tx in the block. -func (m *miner) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*types.Receipt, error) { +// ProcessTransaction processes the given transaction and returns the receipt after +// applying the state transition. This method is called for each tx in the block. +func (m *miner) ProcessTransaction( + ctx context.Context, tx *types.Transaction, +) (*types.Receipt, error) { m.logger.Debug("processing evm transaction", "tx_hash", tx.Hash()) // Reset the Gas and State plugins for the tx. diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 68119543d9..a7de2f94d5 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -115,8 +115,12 @@ func (b *backend) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { } // FeeHistory returns the base fee and gas used history of the last N blocks. -func (b *backend) FeeHistory(ctx context.Context, blockCount uint64, lastBlock rpc.BlockNumber, - rewardPercentiles []float64) (*big.Int, [][]*big.Int, []*big.Int, []float64, error) { +func (b *backend) FeeHistory( + ctx context.Context, + blockCount uint64, + lastBlock rpc.BlockNumber, + rewardPercentiles []float64, +) (*big.Int, [][]*big.Int, []*big.Int, []float64, error) { return b.gpo.FeeHistory(ctx, blockCount, lastBlock, rewardPercentiles) } @@ -169,7 +173,10 @@ func (b *backend) SetHead(_ uint64) { panic("not implemented") } -func (b *backend) HeaderByNumber(_ context.Context, number rpc.BlockNumber) (*types.Header, error) { +func (b *backend) HeaderByNumber( + _ context.Context, + number rpc.BlockNumber, +) (*types.Header, error) { switch number { case rpc.PendingBlockNumber: // TODO: handle "miner" stuff, Pending block is only known by the miner @@ -261,7 +268,10 @@ func (b *backend) BlockByHash(_ context.Context, hash common.Hash) (*types.Block return block, nil } -func (b *backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) { +func (b *backend) BlockByNumberOrHash( + ctx context.Context, + blockNrOrHash rpc.BlockNumberOrHash, +) (*types.Block, error) { if blockNr, ok := blockNrOrHash.Number(); ok { return b.BlockByNumber(ctx, blockNr) } @@ -270,7 +280,8 @@ func (b *backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Blo if block == nil { return nil, core.ErrBlockNotFound } - // if blockNrOrHash.RequireCanonical && b.polar.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + // if blockNrOrHash.RequireCanonical && + // b.polar.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { // return nil, errors.New("hash is not currently canonical") // } // block := b.polar.blockchain.GetBlock(hash, header.Number.Uint64()) @@ -283,7 +294,8 @@ func (b *backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Blo } func (b *backend) StateAndHeaderByNumber( - ctx context.Context, number rpc.BlockNumber, + ctx context.Context, + number rpc.BlockNumber, ) (state.StateDBI, *types.Header, error) { // TODO: handling pending better // // Pending state is only known by the miner @@ -314,7 +326,8 @@ func (b *backend) StateAndHeaderByNumber( } func (b *backend) StateAndHeaderByNumberOrHash( - ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, + ctx context.Context, + blockNrOrHash rpc.BlockNumberOrHash, ) (state.StateDBI, *types.Header, error) { if blockNr, ok := blockNrOrHash.Number(); ok { return b.StateAndHeaderByNumber(ctx, blockNr) @@ -329,7 +342,8 @@ func (b *backend) StateAndHeaderByNumberOrHash( // to match Geth return nil, nil, core.ErrBlockNotFound } - // if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + // if blockNrOrHash.RequireCanonical && + // b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { // return nil, nil, errors.New("hash is not currently canonical") // } return b.StateAndHeaderByNumber(ctx, rpc.BlockNumber(header.Number.Int64())) @@ -340,7 +354,8 @@ func (b *backend) StateAndHeaderByNumberOrHash( // GetTransaction returns the transaction identified by `txHash`, along with // information about the transaction. func (b *backend) GetTransaction( - _ context.Context, txHash common.Hash, + _ context.Context, + txHash common.Hash, ) (*types.Transaction, common.Hash, uint64, uint64, error) { b.logger.Debug("called eth.rpc.backend.GetTransaction", "tx_hash", txHash) txLookup := b.polar.blockchain.GetTransactionLookup(txHash) @@ -476,14 +491,19 @@ func (b *backend) Stats() (int, int) { return pending, queued } -func (b *backend) TxPoolContent() (map[common.Address][]*types.Transaction, map[common.Address][]*types.Transaction) { +func (b *backend) TxPoolContent() ( + map[common.Address][]*types.Transaction, + map[common.Address][]*types.Transaction, +) { pending, queued := b.polar.txPool.Content() - b.logger.Debug("called eth.rpc.backend.TxPoolContent", "pending", len(pending), "queued", len(queued)) + b.logger.Debug( + "called eth.rpc.backend.TxPoolContent", "pending", len(pending), "queued", len(queued)) return pending, queued } func (b *backend) TxPoolContentFrom(addr common.Address) ( - []*types.Transaction, []*types.Transaction, + []*types.Transaction, + []*types.Transaction, ) { pending, queued := b.polar.txPool.ContentFrom(addr) b.logger.Debug("called eth.rpc.backend.TxPoolContentFrom", @@ -500,14 +520,17 @@ func (b *backend) Engine() consensus.Engine { } // GetBody retrieves the block body corresponding to block by has or number.. -func (b *backend) GetBody(ctx context.Context, hash common.Hash, +func (b *backend) GetBody( + ctx context.Context, + hash common.Hash, number rpc.BlockNumber, ) (*types.Body, error) { if number < 0 || hash == (common.Hash{}) { b.logger.Error("eth.rpc.backend.GetBody", "number", number, "hash", hash) return nil, errors.New("invalid arguments; expect hash and no special block numbers") } - block, err := b.BlockByNumberOrHash(ctx, rpc.BlockNumberOrHash{BlockNumber: &number, BlockHash: &hash}) + block, err := b.BlockByNumberOrHash( + ctx, rpc.BlockNumberOrHash{BlockNumber: &number, BlockHash: &hash}) if block == nil || err != nil { b.logger.Error("eth.rpc.backend.GetBody", "number", number, "hash", hash, "err", err) return nil, nil //nolint:nilnil // to match geth. diff --git a/eth/polar/mining.go b/eth/polar/mining.go index 94bf981df3..d28b2a0d5a 100644 --- a/eth/polar/mining.go +++ b/eth/polar/mining.go @@ -26,7 +26,7 @@ import ( "pkg.berachain.dev/polaris/eth/core/types" ) -// TODO: replace this file with a proper mining object and use message passing instead of direct calls. +// TODO: replace this file with a proper mining object and use message passing // Prepare prepares the Polaris chain for processing a new block at the given height. func (pl *Polaris) Prepare(ctx context.Context, number uint64) { header := pl.miner.Prepare(ctx, number) @@ -36,7 +36,10 @@ func (pl *Polaris) Prepare(ctx context.Context, number uint64) { } // ProcessTransaction processes the given transaction and returns the receipt. -func (pl *Polaris) ProcessTransaction(ctx context.Context, tx *types.Transaction) (*types.Receipt, error) { +func (pl *Polaris) ProcessTransaction( + ctx context.Context, + tx *types.Transaction, +) (*types.Receipt, error) { return pl.miner.ProcessTransaction(ctx, tx) } diff --git a/eth/polar/node.go b/eth/polar/node.go index 24b249ccb9..0b5bf148e2 100644 --- a/eth/polar/node.go +++ b/eth/polar/node.go @@ -30,7 +30,8 @@ type Node struct { *node.Node } -// NewGetNetworkingStack creates a new NetworkingStack instance for use on an underlying blockchain. +// NewGetNetworkingStack creates a new NetworkingStack instance for use on an +// underlying blockchain. func NewGethNetworkingStack(config *node.Config) (NetworkingStack, error) { node, err := node.New(config) if err != nil { diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index 01f86120e4..31b8b71c67 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -72,8 +72,9 @@ type NetworkingStack interface { // Polaris is the only object that an implementing chain should use. type Polaris struct { cfg *Config - // NetworkingStack represents the networking stack responsible for exposes the JSON-RPC APIs. - // Although possible, it does not handle p2p networking like its sibling in geth would. + // NetworkingStack represents the networking stack responsible for exposes the JSON-RPC + // APIs. Although possible, it does not handle p2p networking like its sibling in geth + // would. stack NetworkingStack // core pieces of the polaris stack @@ -82,7 +83,8 @@ type Polaris struct { txPool *txpool.TxPool miner miner.Miner - // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs and the core pieces. + // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs + // and the core pieces. backend Backend // engine represents the consensus engine for the backend. @@ -142,7 +144,8 @@ func (pl *Polaris) Init() error { return err } - // eth.miner = miner.New(eth, &config.Miner, eth.blockchain.Config(), eth.EventMux(), eth.engine, eth.isLocalBlock) + // eth.miner = miner.New(eth, + // &config.Miner, eth.blockchain.Config(), eth.EventMux(), eth.engine, eth.isLocalBlock) // Build and set the RPC Backend and other services. diff --git a/go.work.sum b/go.work.sum index 7c8347d241..2903c5e39c 100644 --- a/go.work.sum +++ b/go.work.sum @@ -302,6 +302,7 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= @@ -651,6 +652,7 @@ github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeX github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -710,11 +712,14 @@ go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzc go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= From b545063ee02b334109b70ceb0ddaaadddd0b65a5 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 4 Oct 2023 13:37:50 -0400 Subject: [PATCH 059/122] chore(deps): remove unused `paramskeeper` from testapp (#1171) Co-authored-by: Cal Bera Co-authored-by: ocnc --- e2e/testapp/app.go | 12 ------------ e2e/testapp/app_config.go | 16 ---------------- e2e/testapp/go.mod | 4 ++-- e2e/testapp/go.sum | 10 +++------- 4 files changed, 5 insertions(+), 37 deletions(-) diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 000baf87f7..526f0e049a 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -52,8 +52,6 @@ import ( distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" @@ -96,7 +94,6 @@ type SimApp struct { GovKeeper *govkeeper.Keeper CrisisKeeper *crisiskeeper.Keeper UpgradeKeeper *upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper AuthzKeeper authzkeeper.Keeper EvidenceKeeper evidencekeeper.Keeper ConsensusParamsKeeper consensuskeeper.Keeper @@ -184,7 +181,6 @@ func NewPolarisApp( &app.GovKeeper, &app.CrisisKeeper, &app.UpgradeKeeper, - &app.ParamsKeeper, &app.AuthzKeeper, &app.EvidenceKeeper, &app.ConsensusParamsKeeper, @@ -296,14 +292,6 @@ func (app *SimApp) kvStoreKeys() map[string]*storetypes.KVStoreKey { return keys } -// GetSubspace returns a param subspace for a given module name. -// -// NOTE: This is solely to be used for testing purposes. -func (app *SimApp) GetSubspace(moduleName string) paramstypes.Subspace { - subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) - return subspace -} - // SimulationManager implements the SimulationApp interface. func (app *SimApp) SimulationManager() *module.SimulationManager { return nil diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index 8976c2780d..ce7c596267 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -33,7 +33,6 @@ import ( genutilmodulev1 "cosmossdk.io/api/cosmos/genutil/module/v1" govmodulev1 "cosmossdk.io/api/cosmos/gov/module/v1" mintmodulev1 "cosmossdk.io/api/cosmos/mint/module/v1" - paramsmodulev1 "cosmossdk.io/api/cosmos/params/module/v1" slashingmodulev1 "cosmossdk.io/api/cosmos/slashing/module/v1" stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1" txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" @@ -55,12 +54,8 @@ import ( distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/cosmos/cosmos-sdk/x/gov" - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -77,7 +72,6 @@ import ( _ "github.com/cosmos/cosmos-sdk/x/crisis" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/distribution" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/mint" // import for side-effects - _ "github.com/cosmos/cosmos-sdk/x/params" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/slashing" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/staking" // import for side-effects _ "pkg.berachain.dev/polaris/cosmos/x/evm" // import for side-effects @@ -174,7 +168,6 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, - paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, consensustypes.ModuleName, @@ -216,10 +209,6 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { Name: slashingtypes.ModuleName, Config: appconfig.WrapAny(&slashingmodulev1.Module{}), }, - { - Name: paramstypes.ModuleName, - Config: appconfig.WrapAny(¶msmodulev1.Module{}), - }, { Name: "tx", Config: appconfig.WrapAny(&txconfigv1.Config{}), @@ -270,11 +259,6 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { // supply custom module basics map[string]module.AppModuleBasic{ genutiltypes.ModuleName: genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), - govtypes.ModuleName: gov.NewAppModuleBasic( - []govclient.ProposalHandler{ - paramsclient.ProposalHandler, - }, - ), }, )) } diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 442c880127..d20016dc9a 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,7 +15,7 @@ require ( cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 - pkg.berachain.dev/polaris/cosmos v0.0.0-20231004173040-2a69dddb3c58 + pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 ) @@ -272,7 +272,7 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 // indirect pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 9ca221622c..94e7d27655 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -277,7 +277,6 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -1885,14 +1884,11 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231004173040-2a69dddb3c58 h1:EBuK92BixoWjocscxzOJW9dfroWjMRzscsaGHFqPj5o= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231004173040-2a69dddb3c58/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= +pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 h1:U5wpPv/ZitKJCZkHWVsWOzAfX3orlnHHhn5rYGJ1DPA= +pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 h1:J/d2QQVxlFufmVNrK07uvnMbCFoIX8T0D7YRxvu0ntg= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 13af72250fc5273b9a5208b83b9b4192cd1a8468 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 4 Oct 2023 13:38:52 -0400 Subject: [PATCH 060/122] chore(deps): Remove unused `authz` keeper (#1173) Co-authored-by: Cal Bera --- cosmos/testing/utils/setup.go | 3 --- e2e/hive/clients/polard/config/genesis.json | 3 --- e2e/precompile/polard/config/genesis.json | 3 --- e2e/testapp/app.go | 3 --- e2e/testapp/app_config.go | 9 --------- 5 files changed, 21 deletions(-) diff --git a/cosmos/testing/utils/setup.go b/cosmos/testing/utils/setup.go index 5517e42e2f..b48a3004c7 100644 --- a/cosmos/testing/utils/setup.go +++ b/cosmos/testing/utils/setup.go @@ -42,7 +42,6 @@ import ( authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authz "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" @@ -126,7 +125,6 @@ func SetupMinimalKeepers() ( auth.AppModuleBasic{}, bank.AppModuleBasic{}, staking.AppModuleBasic{}, - authz.AppModuleBasic{}, ) addrCodec := addresscodec.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix()) @@ -179,6 +177,5 @@ func GetEncodingConfig() testutil.TestEncodingConfig { auth.AppModuleBasic{}, bank.AppModuleBasic{}, staking.AppModuleBasic{}, - authz.AppModuleBasic{}, ) } diff --git a/e2e/hive/clients/polard/config/genesis.json b/e2e/hive/clients/polard/config/genesis.json index 750e22bf97..5cab532775 100644 --- a/e2e/hive/clients/polard/config/genesis.json +++ b/e2e/hive/clients/polard/config/genesis.json @@ -38,9 +38,6 @@ } ] }, - "authz": { - "authorization": [] - }, "bank": { "params": { "send_enabled": [], diff --git a/e2e/precompile/polard/config/genesis.json b/e2e/precompile/polard/config/genesis.json index 6a25263e16..c0182436b5 100644 --- a/e2e/precompile/polard/config/genesis.json +++ b/e2e/precompile/polard/config/genesis.json @@ -66,9 +66,6 @@ } ] }, - "authz": { - "authorization": [] - }, "bank": { "params": { "send_enabled": [], diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 526f0e049a..c14537047e 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -45,7 +45,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" @@ -94,7 +93,6 @@ type SimApp struct { GovKeeper *govkeeper.Keeper CrisisKeeper *crisiskeeper.Keeper UpgradeKeeper *upgradekeeper.Keeper - AuthzKeeper authzkeeper.Keeper EvidenceKeeper evidencekeeper.Keeper ConsensusParamsKeeper consensuskeeper.Keeper @@ -181,7 +179,6 @@ func NewPolarisApp( &app.GovKeeper, &app.CrisisKeeper, &app.UpgradeKeeper, - &app.AuthzKeeper, &app.EvidenceKeeper, &app.ConsensusParamsKeeper, &app.EVMKeeper, diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index ce7c596267..a482943161 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -24,7 +24,6 @@ import ( runtimev1alpha1 "cosmossdk.io/api/cosmos/app/runtime/v1alpha1" appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1" authmodulev1 "cosmossdk.io/api/cosmos/auth/module/v1" - authzmodulev1 "cosmossdk.io/api/cosmos/authz/module/v1" bankmodulev1 "cosmossdk.io/api/cosmos/bank/module/v1" consensusmodulev1 "cosmossdk.io/api/cosmos/consensus/module/v1" crisismodulev1 "cosmossdk.io/api/cosmos/crisis/module/v1" @@ -47,7 +46,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" @@ -66,7 +64,6 @@ import ( _ "cosmossdk.io/x/upgrade" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side-effects - _ "github.com/cosmos/cosmos-sdk/x/authz/module" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/bank" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/consensus" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/crisis" // import for side-effects @@ -136,7 +133,6 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { evidencetypes.ModuleName, stakingtypes.ModuleName, genutiltypes.ModuleName, - authz.ModuleName, evmtypes.ModuleName, }, EndBlockers: []string{ @@ -167,7 +163,6 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { crisistypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, - authz.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, consensustypes.ModuleName, @@ -217,10 +212,6 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { Name: genutiltypes.ModuleName, Config: appconfig.WrapAny(&genutilmodulev1.Module{}), }, - { - Name: authz.ModuleName, - Config: appconfig.WrapAny(&authzmodulev1.Module{}), - }, { Name: upgradetypes.ModuleName, Config: appconfig.WrapAny(&upgrademodulev1.Module{}), From d975586a7cddb581ef673d9621663bba3320e2de Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Wed, 4 Oct 2023 19:53:44 -0400 Subject: [PATCH 061/122] fix(gov): Correctly handle governance messages in proposals (#1182) --- .../cosmos/lib/cosmos_types.abigen.go | 39 ++++- .../governance/i_governance_module.abigen.go | 57 ++++--- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 53 ++++--- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- contracts/src/cosmos/CosmosTypes.sol | 10 ++ .../src/cosmos/precompile/Governance.sol | 21 ++- .../precompile/testing/GovernanceWrapper.sol | 6 +- cosmos/lib/conversions.go | 149 ++++++++++++++++-- cosmos/precompile/errors.go | 27 ++-- cosmos/precompile/governance/governance.go | 21 ++- .../precompile/governance/governance_test.go | 46 ++++-- cosmos/txpool/mocks/geth_tx_pool.go | 2 +- cosmos/txpool/mocks/handler.go | 2 +- cosmos/txpool/mocks/lifecycle.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_broadcaster.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- .../contracts/gov/governance_test.go | 84 ++++++---- e2e/precompile/go.mod | 6 +- e2e/testapp/helpers.go | 1 + eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- eth/core/types/transaction.rlpgen.go | 3 + 35 files changed, 424 insertions(+), 141 deletions(-) diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index 8ae378d30f..f88039d90f 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// CosmosCodecAny is an auto generated low-level Go binding around an user-defined struct. +type CosmosCodecAny struct { + TypeURL string + Value []uint8 +} + // CosmosCoin is an auto generated low-level Go binding around an user-defined struct. type CosmosCoin struct { Amount *big.Int @@ -52,8 +58,8 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102118061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631acc976f146100435780632ff6e5df1461005f578063426ce1a91461007b575b5f80fd5b61005d600480360381019061005891906100ca565b610097565b005b6100796004803603810190610074919061012f565b61009a565b005b61009560048036038101906100909190610194565b61009d565b005b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f60a082840312156100c1576100c06100a8565b5b81905092915050565b5f602082840312156100df576100de6100a0565b5b5f82013567ffffffffffffffff8111156100fc576100fb6100a4565b5b610108848285016100ac565b91505092915050565b5f60408284031215610126576101256100a8565b5b81905092915050565b5f60208284031215610144576101436100a0565b5b5f82013567ffffffffffffffff811115610161576101606100a4565b5b61016d84828501610111565b91505092915050565b5f6040828403121561018b5761018a6100a8565b5b81905092915050565b5f602082840312156101a9576101a86100a0565b5b5f82013567ffffffffffffffff8111156101c6576101c56100a4565b5b6101d284828501610176565b9150509291505056fea26469706673582212209aab16f351eb9960748ce609cf022485ffc8384536c515505e4e7382a8e40a2264736f6c63430008150033", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063050cea7c1461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220e8504d14e7bbabd8bc841629fc086fa043bd1f8eb114531756938515e3580a4a64736f6c63430008150033", } // CosmosTypesABI is the input ABI used to generate the binding from. @@ -223,6 +229,35 @@ func (_CosmosTypes *CosmosTypesTransactorRaw) Transact(opts *bind.TransactOpts, return _CosmosTypes.Contract.contract.Transact(opts, method, params...) } +// CodecAny is a free data retrieval call binding the contract method 0x050cea7c. +// +// Solidity: function codecAny((string,uint8[]) ) pure returns() +func (_CosmosTypes *CosmosTypesCaller) CodecAny(opts *bind.CallOpts, arg0 CosmosCodecAny) error { + var out []interface{} + err := _CosmosTypes.contract.Call(opts, &out, "codecAny", arg0) + + if err != nil { + return err + } + + return err + +} + +// CodecAny is a free data retrieval call binding the contract method 0x050cea7c. +// +// Solidity: function codecAny((string,uint8[]) ) pure returns() +func (_CosmosTypes *CosmosTypesSession) CodecAny(arg0 CosmosCodecAny) error { + return _CosmosTypes.Contract.CodecAny(&_CosmosTypes.CallOpts, arg0) +} + +// CodecAny is a free data retrieval call binding the contract method 0x050cea7c. +// +// Solidity: function codecAny((string,uint8[]) ) pure returns() +func (_CosmosTypes *CosmosTypesCallerSession) CodecAny(arg0 CosmosCodecAny) error { + return _CosmosTypes.Contract.CodecAny(&_CosmosTypes.CallOpts, arg0) +} + // Coin is a free data retrieval call binding the contract method 0x2ff6e5df. // // Solidity: function coin((uint256,string) ) pure returns() diff --git a/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go b/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go index b139f53bd2..41c7df2e10 100644 --- a/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go +++ b/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// CosmosCodecAny is an auto generated low-level Go binding around an user-defined struct. +type CosmosCodecAny struct { + TypeURL string + Value []uint8 +} + // CosmosCoin is an auto generated low-level Go binding around an user-defined struct. type CosmosCoin struct { Amount *big.Int @@ -56,6 +62,17 @@ type IGovernanceModuleDepositParams struct { MaxDepositPeriod uint64 } +// IGovernanceModuleMsgSubmitProposal is an auto generated low-level Go binding around an user-defined struct. +type IGovernanceModuleMsgSubmitProposal struct { + Messages []CosmosCodecAny + InitialDeposit []CosmosCoin + Proposer string + Metadata string + Title string + Summary string + Expedited bool +} + // IGovernanceModuleParams is an auto generated low-level Go binding around an user-defined struct. type IGovernanceModuleParams struct { MinDeposit []CosmosCoin @@ -78,7 +95,7 @@ type IGovernanceModuleParams struct { // IGovernanceModuleProposal is an auto generated low-level Go binding around an user-defined struct. type IGovernanceModuleProposal struct { Id uint64 - Message []byte + Messages []CosmosCodecAny Status int32 FinalTallyResult IGovernanceModuleTallyResult SubmitTime uint64 @@ -128,7 +145,7 @@ type IGovernanceModuleWeightedVoteOption struct { // GovernanceModuleMetaData contains all meta data concerning the GovernanceModule contract. var GovernanceModuleMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CancelProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"ProposalDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposalSender\",\"type\":\"address\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"proposalVote\",\"type\":\"tuple\"}],\"name\":\"ProposalVoted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConstitution\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.DepositParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"minInitialDepositRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelDest\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"expeditedVotingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"expeditedThreshold\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"expeditedMinDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"burnVoteQuorum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnProposalDepositPrevote\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnVoteVeto\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.Params\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"getProposalDepositsByDepositor\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalTallyResult\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposalVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"getProposalVotesByVoter\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTallyParams\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.VotingParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proposalMsg\",\"type\":\"bytes\"}],\"name\":\"submitProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"voteWeighted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CancelProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"ProposalDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposalSender\",\"type\":\"address\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"proposalVote\",\"type\":\"tuple\"}],\"name\":\"ProposalVoted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConstitution\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.DepositParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"minInitialDepositRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelDest\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"expeditedVotingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"expeditedThreshold\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"expeditedMinDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"burnVoteQuorum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnProposalDepositPrevote\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnVoteVeto\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.Params\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"getProposalDepositsByDepositor\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalTallyResult\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposalVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"getProposalVotesByVoter\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTallyParams\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.VotingParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"submitProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"voteWeighted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // GovernanceModuleABI is the input ABI used to generate the binding from. @@ -372,7 +389,7 @@ func (_GovernanceModule *GovernanceModuleCallerSession) GetParams() (IGovernance // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) func (_GovernanceModule *GovernanceModuleCaller) GetProposal(opts *bind.CallOpts, proposalId uint64) (IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceModule.contract.Call(opts, &out, "getProposal", proposalId) @@ -389,14 +406,14 @@ func (_GovernanceModule *GovernanceModuleCaller) GetProposal(opts *bind.CallOpts // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) func (_GovernanceModule *GovernanceModuleSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceModule.Contract.GetProposal(&_GovernanceModule.CallOpts, proposalId) } // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) func (_GovernanceModule *GovernanceModuleCallerSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceModule.Contract.GetProposal(&_GovernanceModule.CallOpts, proposalId) } @@ -559,7 +576,7 @@ func (_GovernanceModule *GovernanceModuleCallerSession) GetProposalVotesByVoter( // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleCaller) GetProposals(opts *bind.CallOpts, proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { var out []interface{} err := _GovernanceModule.contract.Call(opts, &out, "getProposals", proposalStatus, pagination) @@ -577,14 +594,14 @@ func (_GovernanceModule *GovernanceModuleCaller) GetProposals(opts *bind.CallOpt // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleSession) GetProposals(proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { return _GovernanceModule.Contract.GetProposals(&_GovernanceModule.CallOpts, proposalStatus, pagination) } // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleCallerSession) GetProposals(proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { return _GovernanceModule.Contract.GetProposals(&_GovernanceModule.CallOpts, proposalStatus, pagination) } @@ -672,25 +689,25 @@ func (_GovernanceModule *GovernanceModuleTransactorSession) CancelProposal(propo return _GovernanceModule.Contract.CancelProposal(&_GovernanceModule.TransactOpts, proposalId) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xd2383136. +// SubmitProposal is a paid mutator transaction binding the contract method 0xd6ff05e7. // -// Solidity: function submitProposal(bytes proposalMsg) returns(uint64) -func (_GovernanceModule *GovernanceModuleTransactor) SubmitProposal(opts *bind.TransactOpts, proposalMsg []byte) (*types.Transaction, error) { - return _GovernanceModule.contract.Transact(opts, "submitProposal", proposalMsg) +// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal) returns(uint64) +func (_GovernanceModule *GovernanceModuleTransactor) SubmitProposal(opts *bind.TransactOpts, proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { + return _GovernanceModule.contract.Transact(opts, "submitProposal", proposal) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xd2383136. +// SubmitProposal is a paid mutator transaction binding the contract method 0xd6ff05e7. // -// Solidity: function submitProposal(bytes proposalMsg) returns(uint64) -func (_GovernanceModule *GovernanceModuleSession) SubmitProposal(proposalMsg []byte) (*types.Transaction, error) { - return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposalMsg) +// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal) returns(uint64) +func (_GovernanceModule *GovernanceModuleSession) SubmitProposal(proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { + return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposal) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xd2383136. +// SubmitProposal is a paid mutator transaction binding the contract method 0xd6ff05e7. // -// Solidity: function submitProposal(bytes proposalMsg) returns(uint64) -func (_GovernanceModule *GovernanceModuleTransactorSession) SubmitProposal(proposalMsg []byte) (*types.Transaction, error) { - return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposalMsg) +// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal) returns(uint64) +func (_GovernanceModule *GovernanceModuleTransactorSession) SubmitProposal(proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { + return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposal) } // Vote is a paid mutator transaction binding the contract method 0x19f7a0fb. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index 7f38d198c2..3ed97e890f 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220d55ff6e47540c6013ff6f852d1f50dafdad161b2c9b5cc3e82260979ddd5d45864736f6c63430008150033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index e3174443fc..a459f059a6 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212203b9bf03ac37088fd143e3bf5b92a98badf7b709ac1dd6737c320f93bef88aaf464736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212202d601bc628a360b6c897b2ee881c654315bd1cde1c07c561e4097872ac2c899f64736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index ab4698628c..eeb6495f17 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -29,16 +29,33 @@ var ( _ = abi.ConvertType ) +// CosmosCodecAny is an auto generated low-level Go binding around an user-defined struct. +type CosmosCodecAny struct { + TypeURL string + Value []uint8 +} + // CosmosCoin is an auto generated low-level Go binding around an user-defined struct. type CosmosCoin struct { Amount *big.Int Denom string } +// IGovernanceModuleMsgSubmitProposal is an auto generated low-level Go binding around an user-defined struct. +type IGovernanceModuleMsgSubmitProposal struct { + Messages []CosmosCodecAny + InitialDeposit []CosmosCoin + Proposer string + Metadata string + Title string + Summary string + Expedited bool +} + // IGovernanceModuleProposal is an auto generated low-level Go binding around an user-defined struct. type IGovernanceModuleProposal struct { Id uint64 - Message []byte + Messages []CosmosCodecAny Status int32 FinalTallyResult IGovernanceModuleTallyResult SubmitTime uint64 @@ -62,8 +79,8 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proposal\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b5060405162001ec038038062001ec083398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051611ce9620001d75f395f6104e90152611ce95ff3fe608060405260043610610073575f3560e01c8063566fbd001161004d578063566fbd001461012157806376cdb03b14610151578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061094a565b6101f3565b6040516100b191906109d0565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a63565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a7c565b6102bd565b604051610118929190610ab6565b60405180910390f35b61013b60048036038101906101369190610bc2565b61035f565b6040516101489190610c53565b60405180910390f35b34801561015c575f80fd5b506101656104e7565b6040516101729190610c8c565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610ca5565b61050b565b6040516101ae919061112e565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a7c565b6105c0565b6040516101ea919061128e565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611305565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061136b565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c53565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906113aa565b91509150915091565b5f80600167ffffffffffffffff81111561037c5761037b610826565b5b6040519080825280602002602001820160405280156103b557816020015b6103a2610669565b81526020019060019003908161039a5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061040f5761040e6113e8565b5b60200260200101516020018190525082815f81518110610432576104316113e8565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d238313688886040518363ffffffff1660e01b815260040161049b929190611451565b6020604051808303815f875af11580156104b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104db9190611473565b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610515610682565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b8152600401610571929190611520565b5f60405180830381865afa15801561058b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b39190611bf6565b5090508092505050919050565b6105c86106c5565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b81526004016106209190610c53565b5f60405180830381865afa15801561063a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906106629190611c6c565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f9610762565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b78161079b565b81146107c1575f80fd5b50565b5f813590506107d2816107ae565b92915050565b5f8160030b9050919050565b6107ed816107d8565b81146107f7575f80fd5b50565b5f81359050610808816107e4565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085c82610816565b810181811067ffffffffffffffff8211171561087b5761087a610826565b5b80604052505050565b5f61088d61078a565b90506108998282610853565b919050565b5f67ffffffffffffffff8211156108b8576108b7610826565b5b6108c182610816565b9050602081019050919050565b828183375f83830152505050565b5f6108ee6108e98461089e565b610884565b90508281526020810184848401111561090a57610909610812565b5b6109158482856108ce565b509392505050565b5f82601f8301126109315761093061080e565b5b81356109418482602086016108dc565b91505092915050565b5f805f6060848603121561096157610960610793565b5b5f61096e868287016107c4565b935050602061097f868287016107fa565b925050604084013567ffffffffffffffff8111156109a05761099f610797565b5b6109ac8682870161091d565b9150509250925092565b5f8115159050919050565b6109ca816109b6565b82525050565b5f6020820190506109e35f8301846109c1565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a2b610a26610a21846109e9565b610a08565b6109e9565b9050919050565b5f610a3c82610a11565b9050919050565b5f610a4d82610a32565b9050919050565b610a5d81610a43565b82525050565b5f602082019050610a765f830184610a54565b92915050565b5f60208284031215610a9157610a90610793565b5b5f610a9e848285016107c4565b91505092915050565b610ab08161079b565b82525050565b5f604082019050610ac95f830185610aa7565b610ad66020830184610aa7565b9392505050565b5f80fd5b5f80fd5b5f8083601f840112610afa57610af961080e565b5b8235905067ffffffffffffffff811115610b1757610b16610add565b5b602083019150836001820283011115610b3357610b32610ae1565b5b9250929050565b5f8083601f840112610b4f57610b4e61080e565b5b8235905067ffffffffffffffff811115610b6c57610b6b610add565b5b602083019150836001820283011115610b8857610b87610ae1565b5b9250929050565b5f819050919050565b610ba181610b8f565b8114610bab575f80fd5b50565b5f81359050610bbc81610b98565b92915050565b5f805f805f60608688031215610bdb57610bda610793565b5b5f86013567ffffffffffffffff811115610bf857610bf7610797565b5b610c0488828901610ae5565b9550955050602086013567ffffffffffffffff811115610c2757610c26610797565b5b610c3388828901610b3a565b93509350506040610c4688828901610bae565b9150509295509295909350565b5f602082019050610c665f830184610aa7565b92915050565b5f610c7682610a32565b9050919050565b610c8681610c6c565b82525050565b5f602082019050610c9f5f830184610c7d565b92915050565b5f60208284031215610cba57610cb9610793565b5b5f610cc7848285016107fa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610d028161079b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d3f578082015181840152602081019050610d24565b5f8484015250505050565b5f610d5482610d08565b610d5e8185610d12565b9350610d6e818560208601610d22565b610d7781610816565b840191505092915050565b610d8b816107d8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610db582610d91565b610dbf8185610d9b565b9350610dcf818560208601610d22565b610dd881610816565b840191505092915050565b5f608083015f8301518482035f860152610dfd8282610dab565b91505060208301518482036020860152610e178282610dab565b91505060408301518482036040860152610e318282610dab565b91505060608301518482036060860152610e4b8282610dab565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610e8a81610b8f565b82525050565b5f604083015f830151610ea55f860182610e81565b5060208301518482036020860152610ebd8282610dab565b9150508091505092915050565b5f610ed58383610e90565b905092915050565b5f602082019050919050565b5f610ef382610e58565b610efd8185610e62565b935083602082028501610f0f85610e72565b805f5b85811015610f4a5784840389528151610f2b8582610eca565b9450610f3683610edd565b925060208a01995050600181019050610f12565b50829750879550505050505092915050565b5f6101a083015f830151610f725f860182610cf9565b5060208301518482036020860152610f8a8282610d4a565b9150506040830151610f9f6040860182610d82565b5060608301518482036060860152610fb78282610de3565b9150506080830151610fcc6080860182610cf9565b5060a0830151610fdf60a0860182610cf9565b5060c083015184820360c0860152610ff78282610ee9565b91505060e083015161100c60e0860182610cf9565b50610100830151611021610100860182610cf9565b5061012083015184820361012086015261103b8282610dab565b9150506101408301518482036101408601526110578282610dab565b9150506101608301518482036101608601526110738282610dab565b91505061018083015184820361018086015261108f8282610dab565b9150508091505092915050565b5f6110a78383610f5c565b905092915050565b5f602082019050919050565b5f6110c582610cd0565b6110cf8185610cda565b9350836020820285016110e185610cea565b805f5b8581101561111c57848403895281516110fd858261109c565b9450611108836110af565b925060208a019950506001810190506110e4565b50829750879550505050505092915050565b5f6020820190508181035f83015261114681846110bb565b905092915050565b5f6101a083015f8301516111645f860182610cf9565b506020830151848203602086015261117c8282610d4a565b91505060408301516111916040860182610d82565b50606083015184820360608601526111a98282610de3565b91505060808301516111be6080860182610cf9565b5060a08301516111d160a0860182610cf9565b5060c083015184820360c08601526111e98282610ee9565b91505060e08301516111fe60e0860182610cf9565b50610100830151611213610100860182610cf9565b5061012083015184820361012086015261122d8282610dab565b9150506101408301518482036101408601526112498282610dab565b9150506101608301518482036101608601526112658282610dab565b9150506101808301518482036101808601526112818282610dab565b9150508091505092915050565b5f6020820190508181035f8301526112a6818461114e565b905092915050565b6112b7816107d8565b82525050565b5f82825260208201905092915050565b5f6112d782610d91565b6112e181856112bd565b93506112f1818560208601610d22565b6112fa81610816565b840191505092915050565b5f6060820190506113185f830186610aa7565b61132560208301856112ae565b818103604083015261133781846112cd565b9050949350505050565b61134a816109b6565b8114611354575f80fd5b50565b5f8151905061136581611341565b92915050565b5f602082840312156113805761137f610793565b5b5f61138d84828501611357565b91505092915050565b5f815190506113a4816107ae565b92915050565b5f80604083850312156113c0576113bf610793565b5b5f6113cd85828601611396565b92505060206113de85828601611396565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6114308385611415565b935061143d8385846108ce565b61144683610816565b840190509392505050565b5f6020820190508181035f83015261146a818486611425565b90509392505050565b5f6020828403121561148857611487610793565b5b5f61149584828501611396565b91505092915050565b6114a7816109b6565b82525050565b5f60a083015f8301518482035f8601526114c78282610dab565b91505060208301516114dc6020860182610cf9565b5060408301516114ef6040860182610cf9565b506060830151611502606086018261149e565b506080830151611515608086018261149e565b508091505092915050565b5f6040820190506115335f8301856112ae565b818103602083015261154581846114ad565b90509392505050565b5f67ffffffffffffffff82111561156857611567610826565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff82111561159b5761159a610826565b5b6115a482610816565b9050602081019050919050565b5f6115c36115be84611581565b610884565b9050828152602081018484840111156115df576115de610812565b5b6115ea848285610d22565b509392505050565b5f82601f8301126116065761160561080e565b5b81516116168482602086016115b1565b91505092915050565b5f8151905061162d816107e4565b92915050565b5f6116456116408461089e565b610884565b90508281526020810184848401111561166157611660610812565b5b61166c848285610d22565b509392505050565b5f82601f8301126116885761168761080e565b5b8151611698848260208601611633565b91505092915050565b5f608082840312156116b6576116b5611579565b5b6116c06080610884565b90505f82015167ffffffffffffffff8111156116df576116de61157d565b5b6116eb84828501611674565b5f83015250602082015167ffffffffffffffff81111561170e5761170d61157d565b5b61171a84828501611674565b602083015250604082015167ffffffffffffffff81111561173e5761173d61157d565b5b61174a84828501611674565b604083015250606082015167ffffffffffffffff81111561176e5761176d61157d565b5b61177a84828501611674565b60608301525092915050565b5f67ffffffffffffffff8211156117a05761179f610826565b5b602082029050602081019050919050565b5f815190506117bf81610b98565b92915050565b5f604082840312156117da576117d9611579565b5b6117e46040610884565b90505f6117f3848285016117b1565b5f83015250602082015167ffffffffffffffff8111156118165761181561157d565b5b61182284828501611674565b60208301525092915050565b5f61184061183b84611786565b610884565b9050808382526020820190506020840283018581111561186357611862610ae1565b5b835b818110156118aa57805167ffffffffffffffff8111156118885761188761080e565b5b80860161189589826117c5565b85526020850194505050602081019050611865565b5050509392505050565b5f82601f8301126118c8576118c761080e565b5b81516118d884826020860161182e565b91505092915050565b5f6101a082840312156118f7576118f6611579565b5b6119026101a0610884565b90505f61191184828501611396565b5f83015250602082015167ffffffffffffffff8111156119345761193361157d565b5b611940848285016115f2565b60208301525060406119548482850161161f565b604083015250606082015167ffffffffffffffff8111156119785761197761157d565b5b611984848285016116a1565b606083015250608061199884828501611396565b60808301525060a06119ac84828501611396565b60a08301525060c082015167ffffffffffffffff8111156119d0576119cf61157d565b5b6119dc848285016118b4565b60c08301525060e06119f084828501611396565b60e083015250610100611a0584828501611396565b6101008301525061012082015167ffffffffffffffff811115611a2b57611a2a61157d565b5b611a3784828501611674565b6101208301525061014082015167ffffffffffffffff811115611a5d57611a5c61157d565b5b611a6984828501611674565b6101408301525061016082015167ffffffffffffffff811115611a8f57611a8e61157d565b5b611a9b84828501611674565b6101608301525061018082015167ffffffffffffffff811115611ac157611ac061157d565b5b611acd84828501611674565b6101808301525092915050565b5f611aec611ae78461154e565b610884565b90508083825260208201905060208402830185811115611b0f57611b0e610ae1565b5b835b81811015611b5657805167ffffffffffffffff811115611b3457611b3361080e565b5b808601611b4189826118e1565b85526020850194505050602081019050611b11565b5050509392505050565b5f82601f830112611b7457611b7361080e565b5b8151611b84848260208601611ada565b91505092915050565b5f60408284031215611ba257611ba1611579565b5b611bac6040610884565b90505f82015167ffffffffffffffff811115611bcb57611bca61157d565b5b611bd784828501611674565b5f830152506020611bea84828501611396565b60208301525092915050565b5f8060408385031215611c0c57611c0b610793565b5b5f83015167ffffffffffffffff811115611c2957611c28610797565b5b611c3585828601611b60565b925050602083015167ffffffffffffffff811115611c5657611c55610797565b5b611c6285828601611b8d565b9150509250929050565b5f60208284031215611c8157611c80610793565b5b5f82015167ffffffffffffffff811115611c9e57611c9d610797565b5b611caa848285016118e1565b9150509291505056fea2646970667358221220da8f16972d0cd9d19a50f85d4b99f4471a098bbe3528987ff5e29119a7e43d1064736f6c63430008150033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027213803806200272183398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b60805161254a620001d75f395f610361015261254a5ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b14610121578063773fb15e1461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f9190610947565b6101f3565b6040516100b191906109cd565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a60565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a79565b6102bd565b604051610118929190610ab3565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610afa565b60405180910390f35b61016560048036038101906101609190610bc5565b610383565b6040516101729190610c52565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c6b565b610508565b6040516101ae9190611261565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a79565b6105bd565b6040516101ea91906113c1565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611438565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061149e565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c52565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906114dd565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610823565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106104335761043261151b565b5b60200260200101516020018190525082815f815181106104565761045561151b565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6ff05e7876040518263ffffffff1660e01b81526004016104bd9190611b2a565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611b4a565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611be8565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b09190612457565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c52565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f91906124cd565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f661075f565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b481610798565b81146107be575f80fd5b50565b5f813590506107cf816107ab565b92915050565b5f8160030b9050919050565b6107ea816107d5565b81146107f4575f80fd5b50565b5f81359050610805816107e1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085982610813565b810181811067ffffffffffffffff8211171561087857610877610823565b5b80604052505050565b5f61088a610787565b90506108968282610850565b919050565b5f67ffffffffffffffff8211156108b5576108b4610823565b5b6108be82610813565b9050602081019050919050565b828183375f83830152505050565b5f6108eb6108e68461089b565b610881565b9050828152602081018484840111156109075761090661080f565b5b6109128482856108cb565b509392505050565b5f82601f83011261092e5761092d61080b565b5b813561093e8482602086016108d9565b91505092915050565b5f805f6060848603121561095e5761095d610790565b5b5f61096b868287016107c1565b935050602061097c868287016107f7565b925050604084013567ffffffffffffffff81111561099d5761099c610794565b5b6109a98682870161091a565b9150509250925092565b5f8115159050919050565b6109c7816109b3565b82525050565b5f6020820190506109e05f8301846109be565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a28610a23610a1e846109e6565b610a05565b6109e6565b9050919050565b5f610a3982610a0e565b9050919050565b5f610a4a82610a2f565b9050919050565b610a5a81610a40565b82525050565b5f602082019050610a735f830184610a51565b92915050565b5f60208284031215610a8e57610a8d610790565b5b5f610a9b848285016107c1565b91505092915050565b610aad81610798565b82525050565b5f604082019050610ac65f830185610aa4565b610ad36020830184610aa4565b9392505050565b5f610ae482610a2f565b9050919050565b610af481610ada565b82525050565b5f602082019050610b0d5f830184610aeb565b92915050565b5f80fd5b5f60e08284031215610b2c57610b2b610b13565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b5257610b5161080b565b5b8235905067ffffffffffffffff811115610b6f57610b6e610b35565b5b602083019150836001820283011115610b8b57610b8a610b39565b5b9250929050565b5f819050919050565b610ba481610b92565b8114610bae575f80fd5b50565b5f81359050610bbf81610b9b565b92915050565b5f805f8060608587031215610bdd57610bdc610790565b5b5f85013567ffffffffffffffff811115610bfa57610bf9610794565b5b610c0687828801610b17565b945050602085013567ffffffffffffffff811115610c2757610c26610794565b5b610c3387828801610b3d565b93509350506040610c4687828801610bb1565b91505092959194509250565b5f602082019050610c655f830184610aa4565b92915050565b5f60208284031215610c8057610c7f610790565b5b5f610c8d848285016107f7565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cc881610798565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d2e578082015181840152602081019050610d13565b5f8484015250505050565b5f610d4382610cf7565b610d4d8185610d01565b9350610d5d818560208601610d11565b610d6681610813565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610daf81610d9a565b82525050565b5f610dc08383610da6565b60208301905092915050565b5f602082019050919050565b5f610de282610d71565b610dec8185610d7b565b9350610df783610d8b565b805f5b83811015610e27578151610e0e8882610db5565b9750610e1983610dcc565b925050600181019050610dfa565b5085935050505092915050565b5f604083015f8301518482035f860152610e4e8282610d39565b91505060208301518482036020860152610e688282610dd8565b9150508091505092915050565b5f610e808383610e34565b905092915050565b5f602082019050919050565b5f610e9e82610cce565b610ea88185610cd8565b935083602082028501610eba85610ce8565b805f5b85811015610ef55784840389528151610ed68582610e75565b9450610ee183610e88565b925060208a01995050600181019050610ebd565b50829750879550505050505092915050565b610f10816107d5565b82525050565b5f608083015f8301518482035f860152610f308282610d39565b91505060208301518482036020860152610f4a8282610d39565b91505060408301518482036040860152610f648282610d39565b91505060608301518482036060860152610f7e8282610d39565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fbd81610b92565b82525050565b5f604083015f830151610fd85f860182610fb4565b5060208301518482036020860152610ff08282610d39565b9150508091505092915050565b5f6110088383610fc3565b905092915050565b5f602082019050919050565b5f61102682610f8b565b6110308185610f95565b93508360208202850161104285610fa5565b805f5b8581101561107d578484038952815161105e8582610ffd565b945061106983611010565b925060208a01995050600181019050611045565b50829750879550505050505092915050565b5f6101a083015f8301516110a55f860182610cbf565b50602083015184820360208601526110bd8282610e94565b91505060408301516110d26040860182610f07565b50606083015184820360608601526110ea8282610f16565b91505060808301516110ff6080860182610cbf565b5060a083015161111260a0860182610cbf565b5060c083015184820360c086015261112a828261101c565b91505060e083015161113f60e0860182610cbf565b50610100830151611154610100860182610cbf565b5061012083015184820361012086015261116e8282610d39565b91505061014083015184820361014086015261118a8282610d39565b9150506101608301518482036101608601526111a68282610d39565b9150506101808301518482036101808601526111c28282610d39565b9150508091505092915050565b5f6111da838361108f565b905092915050565b5f602082019050919050565b5f6111f882610c96565b6112028185610ca0565b93508360208202850161121485610cb0565b805f5b8581101561124f578484038952815161123085826111cf565b945061123b836111e2565b925060208a01995050600181019050611217565b50829750879550505050505092915050565b5f6020820190508181035f83015261127981846111ee565b905092915050565b5f6101a083015f8301516112975f860182610cbf565b50602083015184820360208601526112af8282610e94565b91505060408301516112c46040860182610f07565b50606083015184820360608601526112dc8282610f16565b91505060808301516112f16080860182610cbf565b5060a083015161130460a0860182610cbf565b5060c083015184820360c086015261131c828261101c565b91505060e083015161133160e0860182610cbf565b50610100830151611346610100860182610cbf565b506101208301518482036101208601526113608282610d39565b91505061014083015184820361014086015261137c8282610d39565b9150506101608301518482036101608601526113988282610d39565b9150506101808301518482036101808601526113b48282610d39565b9150508091505092915050565b5f6020820190508181035f8301526113d98184611281565b905092915050565b6113ea816107d5565b82525050565b5f82825260208201905092915050565b5f61140a82610cf7565b61141481856113f0565b9350611424818560208601610d11565b61142d81610813565b840191505092915050565b5f60608201905061144b5f830186610aa4565b61145860208301856113e1565b818103604083015261146a8184611400565b9050949350505050565b61147d816109b3565b8114611487575f80fd5b50565b5f8151905061149881611474565b92915050565b5f602082840312156114b3576114b2610790565b5b5f6114c08482850161148a565b91505092915050565b5f815190506114d7816107ab565b92915050565b5f80604083850312156114f3576114f2610790565b5b5f611500858286016114c9565b9250506020611511858286016114c9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126115705761156f611550565b5b83810192508235915060208301925067ffffffffffffffff82111561159857611597611548565b5b6020820236038313156115ae576115ad61154c565b5b509250929050565b5f819050919050565b5f80833560016020038436030381126115db576115da611550565b5b83810192508235915060208301925067ffffffffffffffff82111561160357611602611548565b5b6001820236038313156116195761161861154c565b5b509250929050565b5f61162c8385610d01565b93506116398385846108cb565b61164283610813565b840190509392505050565b5f808335600160200384360303811261166957611668611550565b5b83810192508235915060208301925067ffffffffffffffff82111561169157611690611548565b5b6020820236038313156116a7576116a661154c565b5b509250929050565b5f819050919050565b6116c181610d9a565b81146116cb575f80fd5b50565b5f813590506116dc816116b8565b92915050565b5f6116f060208401846116ce565b905092915050565b5f602082019050919050565b5f61170f8385610d7b565b935061171a826116af565b805f5b858110156117525761172f82846116e2565b6117398882610db5565b9750611744836116f8565b92505060018101905061171d565b5085925050509392505050565b5f604083016117705f8401846115bf565b8583035f870152611782838284611621565b92505050611793602084018461164d565b85830360208701526117a6838284611704565b925050508091505092915050565b5f6117bf838361175f565b905092915050565b5f823560016040038336030381126117e2576117e1611550565b5b82810191505092915050565b5f602082019050919050565b5f6118058385610cd8565b935083602084028501611817846115b6565b805f5b8781101561185a57848403895261183182846117c7565b61183b85826117b4565b9450611846836117ee565b925060208a0199505060018101905061181a565b50829750879450505050509392505050565b5f808335600160200384360303811261188857611887611550565b5b83810192508235915060208301925067ffffffffffffffff8211156118b0576118af611548565b5b6020820236038313156118c6576118c561154c565b5b509250929050565b5f819050919050565b5f6118e56020840184610bb1565b905092915050565b5f604083016118fe5f8401846118d7565b61190a5f860182610fb4565b5061191860208401846115bf565b858303602087015261192b838284611621565b925050508091505092915050565b5f61194483836118ed565b905092915050565b5f8235600160400383360303811261196757611966611550565b5b82810191505092915050565b5f602082019050919050565b5f61198a8385610f95565b93508360208402850161199c846118ce565b805f5b878110156119df5784840389526119b6828461194c565b6119c08582611939565b94506119cb83611973565b925060208a0199505060018101905061199f565b50829750879450505050509392505050565b5f813590506119ff81611474565b92915050565b5f611a1360208401846119f1565b905092915050565b611a24816109b3565b82525050565b5f60e08301611a3b5f840184611554565b8583035f870152611a4d8382846117fa565b92505050611a5e602084018461186c565b8583036020870152611a7183828461197f565b92505050611a8260408401846115bf565b8583036040870152611a95838284611621565b92505050611aa660608401846115bf565b8583036060870152611ab9838284611621565b92505050611aca60808401846115bf565b8583036080870152611add838284611621565b92505050611aee60a08401846115bf565b85830360a0870152611b01838284611621565b92505050611b1260c0840184611a05565b611b1f60c0860182611a1b565b508091505092915050565b5f6020820190508181035f830152611b428184611a2a565b905092915050565b5f60208284031215611b5f57611b5e610790565b5b5f611b6c848285016114c9565b91505092915050565b5f60a083015f8301518482035f860152611b8f8282610d39565b9150506020830151611ba46020860182610cbf565b506040830151611bb76040860182610cbf565b506060830151611bca6060860182611a1b565b506080830151611bdd6080860182611a1b565b508091505092915050565b5f604082019050611bfb5f8301856113e1565b8181036020830152611c0d8184611b75565b90509392505050565b5f67ffffffffffffffff821115611c3057611c2f610823565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611c6357611c62610823565b5b602082029050602081019050919050565b5f611c86611c818461089b565b610881565b905082815260208101848484011115611ca257611ca161080f565b5b611cad848285610d11565b509392505050565b5f82601f830112611cc957611cc861080b565b5b8151611cd9848260208601611c74565b91505092915050565b5f67ffffffffffffffff821115611cfc57611cfb610823565b5b602082029050602081019050919050565b5f81519050611d1b816116b8565b92915050565b5f611d33611d2e84611ce2565b610881565b90508083825260208201905060208402830185811115611d5657611d55610b39565b5b835b81811015611d7f5780611d6b8882611d0d565b845260208401935050602081019050611d58565b5050509392505050565b5f82601f830112611d9d57611d9c61080b565b5b8151611dad848260208601611d21565b91505092915050565b5f60408284031215611dcb57611dca611c41565b5b611dd56040610881565b90505f82015167ffffffffffffffff811115611df457611df3611c45565b5b611e0084828501611cb5565b5f83015250602082015167ffffffffffffffff811115611e2357611e22611c45565b5b611e2f84828501611d89565b60208301525092915050565b5f611e4d611e4884611c49565b610881565b90508083825260208201905060208402830185811115611e7057611e6f610b39565b5b835b81811015611eb757805167ffffffffffffffff811115611e9557611e9461080b565b5b808601611ea28982611db6565b85526020850194505050602081019050611e72565b5050509392505050565b5f82601f830112611ed557611ed461080b565b5b8151611ee5848260208601611e3b565b91505092915050565b5f81519050611efc816107e1565b92915050565b5f60808284031215611f1757611f16611c41565b5b611f216080610881565b90505f82015167ffffffffffffffff811115611f4057611f3f611c45565b5b611f4c84828501611cb5565b5f83015250602082015167ffffffffffffffff811115611f6f57611f6e611c45565b5b611f7b84828501611cb5565b602083015250604082015167ffffffffffffffff811115611f9f57611f9e611c45565b5b611fab84828501611cb5565b604083015250606082015167ffffffffffffffff811115611fcf57611fce611c45565b5b611fdb84828501611cb5565b60608301525092915050565b5f67ffffffffffffffff82111561200157612000610823565b5b602082029050602081019050919050565b5f8151905061202081610b9b565b92915050565b5f6040828403121561203b5761203a611c41565b5b6120456040610881565b90505f61205484828501612012565b5f83015250602082015167ffffffffffffffff81111561207757612076611c45565b5b61208384828501611cb5565b60208301525092915050565b5f6120a161209c84611fe7565b610881565b905080838252602082019050602084028301858111156120c4576120c3610b39565b5b835b8181101561210b57805167ffffffffffffffff8111156120e9576120e861080b565b5b8086016120f68982612026565b855260208501945050506020810190506120c6565b5050509392505050565b5f82601f8301126121295761212861080b565b5b815161213984826020860161208f565b91505092915050565b5f6101a0828403121561215857612157611c41565b5b6121636101a0610881565b90505f612172848285016114c9565b5f83015250602082015167ffffffffffffffff81111561219557612194611c45565b5b6121a184828501611ec1565b60208301525060406121b584828501611eee565b604083015250606082015167ffffffffffffffff8111156121d9576121d8611c45565b5b6121e584828501611f02565b60608301525060806121f9848285016114c9565b60808301525060a061220d848285016114c9565b60a08301525060c082015167ffffffffffffffff81111561223157612230611c45565b5b61223d84828501612115565b60c08301525060e0612251848285016114c9565b60e083015250610100612266848285016114c9565b6101008301525061012082015167ffffffffffffffff81111561228c5761228b611c45565b5b61229884828501611cb5565b6101208301525061014082015167ffffffffffffffff8111156122be576122bd611c45565b5b6122ca84828501611cb5565b6101408301525061016082015167ffffffffffffffff8111156122f0576122ef611c45565b5b6122fc84828501611cb5565b6101608301525061018082015167ffffffffffffffff81111561232257612321611c45565b5b61232e84828501611cb5565b6101808301525092915050565b5f61234d61234884611c16565b610881565b905080838252602082019050602084028301858111156123705761236f610b39565b5b835b818110156123b757805167ffffffffffffffff8111156123955761239461080b565b5b8086016123a28982612142565b85526020850194505050602081019050612372565b5050509392505050565b5f82601f8301126123d5576123d461080b565b5b81516123e584826020860161233b565b91505092915050565b5f6040828403121561240357612402611c41565b5b61240d6040610881565b90505f82015167ffffffffffffffff81111561242c5761242b611c45565b5b61243884828501611cb5565b5f83015250602061244b848285016114c9565b60208301525092915050565b5f806040838503121561246d5761246c610790565b5b5f83015167ffffffffffffffff81111561248a57612489610794565b5b612496858286016123c1565b925050602083015167ffffffffffffffff8111156124b7576124b6610794565b5b6124c3858286016123ee565b9150509250929050565b5f602082840312156124e2576124e1610790565b5b5f82015167ffffffffffffffff8111156124ff576124fe610794565b5b61250b84828501612142565b9150509291505056fea264697066735822122060e7fa4f1ecbfce40bec94de51b2058f0dd2bd8559093bbc62026b5ecc9d4fa664736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. @@ -266,7 +283,7 @@ func (_GovernanceWrapper *GovernanceWrapperCallerSession) Bank() (common.Address // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposal(opts *bind.CallOpts, proposalId uint64) (IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceWrapper.contract.Call(opts, &out, "getProposal", proposalId) @@ -283,21 +300,21 @@ func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposal(opts *bind.CallOp // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) func (_GovernanceWrapper *GovernanceWrapperSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposal(&_GovernanceWrapper.CallOpts, proposalId) } // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) func (_GovernanceWrapper *GovernanceWrapperCallerSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposal(&_GovernanceWrapper.CallOpts, proposalId) } // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposals(opts *bind.CallOpts, proposalStatus int32) ([]IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceWrapper.contract.Call(opts, &out, "getProposals", proposalStatus) @@ -314,14 +331,14 @@ func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposals(opts *bind.CallO // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) func (_GovernanceWrapper *GovernanceWrapperSession) GetProposals(proposalStatus int32) ([]IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposals(&_GovernanceWrapper.CallOpts, proposalStatus) } // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,bytes,int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) func (_GovernanceWrapper *GovernanceWrapperCallerSession) GetProposals(proposalStatus int32) ([]IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposals(&_GovernanceWrapper.CallOpts, proposalStatus) } @@ -378,24 +395,24 @@ func (_GovernanceWrapper *GovernanceWrapperTransactorSession) CancelProposal(pro return _GovernanceWrapper.Contract.CancelProposal(&_GovernanceWrapper.TransactOpts, proposalId) } -// Submit is a paid mutator transaction binding the contract method 0x566fbd00. +// Submit is a paid mutator transaction binding the contract method 0x773fb15e. // -// Solidity: function submit(bytes proposal, string denom, uint256 amount) payable returns(uint64) -func (_GovernanceWrapper *GovernanceWrapperTransactor) Submit(opts *bind.TransactOpts, proposal []byte, denom string, amount *big.Int) (*types.Transaction, error) { +// Solidity: function submit(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +func (_GovernanceWrapper *GovernanceWrapperTransactor) Submit(opts *bind.TransactOpts, proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.contract.Transact(opts, "submit", proposal, denom, amount) } -// Submit is a paid mutator transaction binding the contract method 0x566fbd00. +// Submit is a paid mutator transaction binding the contract method 0x773fb15e. // -// Solidity: function submit(bytes proposal, string denom, uint256 amount) payable returns(uint64) -func (_GovernanceWrapper *GovernanceWrapperSession) Submit(proposal []byte, denom string, amount *big.Int) (*types.Transaction, error) { +// Solidity: function submit(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +func (_GovernanceWrapper *GovernanceWrapperSession) Submit(proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.Contract.Submit(&_GovernanceWrapper.TransactOpts, proposal, denom, amount) } -// Submit is a paid mutator transaction binding the contract method 0x566fbd00. +// Submit is a paid mutator transaction binding the contract method 0x773fb15e. // -// Solidity: function submit(bytes proposal, string denom, uint256 amount) payable returns(uint64) -func (_GovernanceWrapper *GovernanceWrapperTransactorSession) Submit(proposal []byte, denom string, amount *big.Int) (*types.Transaction, error) { +// Solidity: function submit(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +func (_GovernanceWrapper *GovernanceWrapperTransactorSession) Submit(proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.Contract.Submit(&_GovernanceWrapper.TransactOpts, proposal, denom, amount) } diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 112320da86..1a1e8022c2 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220ffe51574d39382285f7847c507828f1e710505bc2a0cd23abe20e32e5e6a937964736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220b3c088cebf6842e38899ca96d3f41f74654e1b2cfd2290c7797c825e1e8f738f64736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index 4448815142..132b168ce3 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220ba7c46fa5a278f44112a075b73098f4738cd207fd10d95a41d3df083fc5b6c2b64736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea26469706673582212201b565383e699fe131096bda744e6d73506422567b7f5d85ad9e96861940d3a9c64736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index ee50028de0..10953f09ae 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212202e51cf7fd61df0464d3a27dd6535d12e463c0bf3246e7a15387d926c38d7288764736f6c63430008150033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/src/cosmos/CosmosTypes.sol b/contracts/src/cosmos/CosmosTypes.sol index ba32ccbb8b..81e2dba39d 100644 --- a/contracts/src/cosmos/CosmosTypes.sol +++ b/contracts/src/cosmos/CosmosTypes.sol @@ -49,6 +49,15 @@ library Cosmos { string nextKey; uint64 total; } + + /** + * @dev Represents a Cosmos SDK `codectypes.Any`. + * @notice value is of type uint8[] instead of bytes, functionally used as []byte in Cosmos. + */ + struct CodecAny { + string typeURL; + uint8[] value; + } } /** @@ -58,4 +67,5 @@ contract CosmosTypes { function coin(Cosmos.Coin calldata) public pure {} function pageRequest(Cosmos.PageRequest calldata) public pure {} function pageResponse(Cosmos.PageResponse calldata) public pure {} + function codecAny(Cosmos.CodecAny calldata) public pure {} } diff --git a/contracts/src/cosmos/precompile/Governance.sol b/contracts/src/cosmos/precompile/Governance.sol index 13e6ccde28..84f2757701 100644 --- a/contracts/src/cosmos/precompile/Governance.sol +++ b/contracts/src/cosmos/precompile/Governance.sol @@ -34,11 +34,11 @@ interface IGovernanceModule { ////////////////////////////////////////// Write Methods ///////////////////////////////////////////// /** * @dev Submit a proposal to the governance module. - * @param proposalMsg The proposal to submit (as marshaled bytes). NOTE: use the codec to - * marshal the proposal message. + * @notice Use the codec to marshal the proposal messages. + * @param proposal The proposal to submit. * @return The id of the proposal. */ - function submitProposal(bytes calldata proposalMsg) external returns (uint64); + function submitProposal(MsgSubmitProposal calldata proposal) external returns (uint64); /** * @dev Cancel a proposal. @@ -162,12 +162,25 @@ interface IGovernanceModule { string metadata; } + /** + * @dev Represents a governance module `MsgSubmitProposal`. + */ + struct MsgSubmitProposal { + Cosmos.CodecAny[] messages; + Cosmos.Coin[] initialDeposit; + string proposer; + string metadata; + string title; + string summary; + bool expedited; + } + /** * @dev Represents a governance module `Proposal`. */ struct Proposal { uint64 id; - bytes message; + Cosmos.CodecAny[] messages; int32 status; TallyResult finalTallyResult; uint64 submitTime; diff --git a/contracts/src/cosmos/precompile/testing/GovernanceWrapper.sol b/contracts/src/cosmos/precompile/testing/GovernanceWrapper.sol index bee8065139..3ec7e73fad 100644 --- a/contracts/src/cosmos/precompile/testing/GovernanceWrapper.sol +++ b/contracts/src/cosmos/precompile/testing/GovernanceWrapper.sol @@ -52,7 +52,11 @@ contract GovernanceWrapper { * @dev Submit a proposal. * @param proposal The proposal. */ - function submit(bytes calldata proposal, string calldata denom, uint256 amount) external payable returns (uint64) { + function submit(IGovernanceModule.MsgSubmitProposal calldata proposal, string calldata denom, uint256 amount) + external + payable + returns (uint64) + { // Send the deposit amount to the contract. Cosmos.Coin[] memory coins = new Cosmos.Coin[](1); coins[0].denom = denom; diff --git a/cosmos/lib/conversions.go b/cosmos/lib/conversions.go index de6a9d6f6b..144e4db7db 100644 --- a/cosmos/lib/conversions.go +++ b/cosmos/lib/conversions.go @@ -22,10 +22,12 @@ package lib import ( "math/big" + "reflect" "cosmossdk.io/core/address" sdkmath "cosmossdk.io/math" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" @@ -216,23 +218,26 @@ func SdkValidatorsToStakingValidators( // SdkProposalToGovProposal is a helper function to transform a `v1.Proposal` to an // `IGovernanceModule.Proposal`. func SdkProposalToGovProposal(proposal v1.Proposal) governance.IGovernanceModuleProposal { - message := make([]byte, 0) - for _, msg := range proposal.Messages { - message = append(message, msg.Value...) + messages := make([]governance.CosmosCodecAny, len(proposal.Messages)) + for i, msg := range proposal.Messages { + messages[i] = governance.CosmosCodecAny{ + Value: msg.Value, + TypeURL: msg.TypeUrl, + } } - totalDeposit := make([]governance.CosmosCoin, 0) - for _, coin := range proposal.TotalDeposit { - totalDeposit = append(totalDeposit, governance.CosmosCoin{ + totalDeposit := make([]governance.CosmosCoin, len(proposal.TotalDeposit)) + for i, coin := range proposal.TotalDeposit { + totalDeposit[i] = governance.CosmosCoin{ Denom: coin.Denom, Amount: coin.Amount.BigInt(), - }) + } } return governance.IGovernanceModuleProposal{ - Id: proposal.Id, - Message: message, - Status: int32(proposal.Status), // Status is an alias for int32. + Id: proposal.Id, + Messages: messages, + Status: int32(proposal.Status), // Status is an alias for int32. FinalTallyResult: governance.IGovernanceModuleTallyResult{ YesCount: proposal.FinalTallyResult.YesCount, AbstainCount: proposal.FinalTallyResult.AbstainCount, @@ -250,3 +255,127 @@ func SdkProposalToGovProposal(proposal v1.Proposal) governance.IGovernanceModule Proposer: proposal.Proposer, } } + +// ConvertMsgSubmitProposalToSdk is a helper function to convert a `MsgSubmitProposal` to the gov +// `v1.MsgSubmitProposal`. +func ConvertMsgSubmitProposalToSdk( + prop any, ir codectypes.InterfaceRegistry, +) (*v1.MsgSubmitProposal, error) { + // Convert the prop object to the desired unnamed struct using reflection. + propValue := reflect.ValueOf(prop) + + // Build the proposal messages. + proposalMsgs, err := decodeProposalMessages(propValue.FieldByName("Messages").Interface()) + if err != nil { + return nil, err + } + messages := make([]*codectypes.Any, len(proposalMsgs)) + for i, genCodecAny := range proposalMsgs { + messages[i] = &codectypes.Any{ + Value: genCodecAny.Value, + TypeUrl: genCodecAny.TypeURL, + } + var msg sdk.Msg + if err = ir.UnpackAny(messages[i], &msg); err != nil { + return nil, err + } + } + + // Build the initial deposit. + initDeposit, err := decodeInitialDeposit(propValue.FieldByName("InitialDeposit").Interface()) + if err != nil { + return nil, err + } + initialDeposit := make(sdk.Coins, len(initDeposit)) + for i, coin := range initDeposit { + initialDeposit[i] = sdk.Coin{ + Denom: coin.Denom, + Amount: sdkmath.NewIntFromBigInt(coin.Amount), + } + } + + // Return the v1.MsgSubmitProposal with all string fields attached. + return &v1.MsgSubmitProposal{ + Messages: messages, + InitialDeposit: initialDeposit, + Proposer: propValue.FieldByName("Proposer").Interface().(string), + Metadata: propValue.FieldByName("Metadata").Interface().(string), + Title: propValue.FieldByName("Title").Interface().(string), + Summary: propValue.FieldByName("Summary").Interface().(string), + Expedited: propValue.FieldByName("Expedited").Interface().(bool), + }, nil +} + +// decodeProposalMessages is a helper function to convert the unnamed type of Messages into a +// usable Messages slice. +func decodeProposalMessages(propMsgs any) ([]struct { + TypeURL string `json:"typeURL"` + Value []uint8 `json:"value"` +}, error) { + var proposalMsgs []struct { + TypeURL string `json:"typeURL"` + Value []uint8 `json:"value"` + } + + switch reflect.TypeOf(propMsgs) { + case reflect.TypeOf([]governance.CosmosCodecAny{}): + for _, propMsg := range utils.MustGetAs[[]governance.CosmosCodecAny](propMsgs) { + proposalMsgs = append(proposalMsgs, struct { + TypeURL string `json:"typeURL"` + Value []uint8 `json:"value"` + }{ + TypeURL: propMsg.TypeURL, + Value: propMsg.Value, + }) + } + case reflect.TypeOf([]struct { + TypeURL string `json:"typeURL"` + Value []uint8 `json:"value"` + }{}): + proposalMsgs = utils.MustGetAs[[]struct { + TypeURL string `json:"typeURL"` + Value []uint8 `json:"value"` + }](propMsgs) + default: + return nil, precompile.ErrInvalidSubmitProposal + } + + return proposalMsgs, nil +} + +// decodeInitialDeposit is a helper function to convert the unnamed type of InitialDeposit into a +// usable coins slice. +func decodeInitialDeposit(initDep any) ([]struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` +}, error) { + var initDeposit []struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` + } + + switch reflect.TypeOf(initDep) { + case reflect.TypeOf([]governance.CosmosCoin{}): + for _, coin := range utils.MustGetAs[[]governance.CosmosCoin](initDep) { + initDeposit = append(initDeposit, struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` + }{ + Amount: coin.Amount, + Denom: coin.Denom, + }) + } + case reflect.TypeOf([]struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` + }{}): + initDeposit = utils.MustGetAs[[]struct { + Amount *big.Int `json:"amount"` + Denom string `json:"denom"` + }](initDep) + default: + return nil, precompile.ErrInvalidSubmitProposal + } + + return initDeposit, nil +} diff --git a/cosmos/precompile/errors.go b/cosmos/precompile/errors.go index e8467b7287..893ec3ffb3 100644 --- a/cosmos/precompile/errors.go +++ b/cosmos/precompile/errors.go @@ -23,17 +23,18 @@ package precompile import "errors" var ( - ErrInvalidBech32Address = errors.New("invalid bech32 address") - ErrInvalidHexAddress = errors.New("invalid hex address") - ErrInvalidString = errors.New("invalid string") - ErrInvalidBigInt = errors.New("invalid big int") - ErrInvalidUint64 = errors.New("invalid uint64") - ErrInvalidInt64 = errors.New("invalid int64") - ErrInvalidAny = errors.New("invalid any") - ErrInvalidCoin = errors.New("invalid coin") - ErrInvalidBool = errors.New("invalid bool") - ErrInvalidInt32 = errors.New("invalid int32") - ErrInvalidOptions = errors.New("invalid options") - ErrInvalidBytes = errors.New("invalid bytes") - ErrInvalidGrantType = errors.New("invalid grant type") + ErrInvalidBech32Address = errors.New("invalid bech32 address") + ErrInvalidHexAddress = errors.New("invalid hex address") + ErrInvalidString = errors.New("invalid string") + ErrInvalidBigInt = errors.New("invalid big int") + ErrInvalidUint64 = errors.New("invalid uint64") + ErrInvalidInt64 = errors.New("invalid int64") + ErrInvalidAny = errors.New("invalid any") + ErrInvalidCoin = errors.New("invalid coin") + ErrInvalidBool = errors.New("invalid bool") + ErrInvalidInt32 = errors.New("invalid int32") + ErrInvalidOptions = errors.New("invalid options") + ErrInvalidBytes = errors.New("invalid bytes") + ErrInvalidGrantType = errors.New("invalid grant type") + ErrInvalidSubmitProposal = errors.New("invalid submit proposal message") ) diff --git a/cosmos/precompile/governance/governance.go b/cosmos/precompile/governance/governance.go index e7b9dc0d57..7be47c6528 100644 --- a/cosmos/precompile/governance/governance.go +++ b/cosmos/precompile/governance/governance.go @@ -27,6 +27,7 @@ import ( "cosmossdk.io/core/address" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -55,10 +56,13 @@ type Contract struct { addressCodec address.Codec msgServer v1.MsgServer querier v1.QueryServer + ir codectypes.InterfaceRegistry } // NewPrecompileContract creates a new precompile contract for the governance module. -func NewPrecompileContract(ak cosmlib.CodecProvider, m v1.MsgServer, q v1.QueryServer) *Contract { +func NewPrecompileContract( + ak cosmlib.CodecProvider, m v1.MsgServer, q v1.QueryServer, + ir codectypes.InterfaceRegistry) *Contract { return &Contract{ BaseContract: ethprecompile.NewBaseContract( generated.GovernanceModuleMetaData.ABI, @@ -68,6 +72,7 @@ func NewPrecompileContract(ak cosmlib.CodecProvider, m v1.MsgServer, q v1.QueryS addressCodec: ak.AddressCodec(), msgServer: m, querier: q, + ir: ir, } } @@ -83,21 +88,21 @@ func (c *Contract) CustomValueDecoders() ethprecompile.ValueDecoders { // governance precompile contract. func (c *Contract) SubmitProposal( ctx context.Context, - proposalMsg []byte, + proposal any, ) (uint64, error) { - // Decode the proposal bytes into v1.Proposal. - var p v1.MsgSubmitProposal - if err := p.Unmarshal(proposalMsg); err != nil { + // Convert the submit proposal msg into v1.MsgSubmitProposal. + msgSubmitProposal, err := cosmlib.ConvertMsgSubmitProposalToSdk(proposal, c.ir) + if err != nil { return 0, err } - // Create the proposal. - res, err := c.msgServer.SubmitProposal(ctx, &p) + // Send it to the governance module. + res, err := c.msgServer.SubmitProposal(ctx, msgSubmitProposal) if err != nil { return 0, err } - // emit an event at the end of this successful proposal submission + // Emit an event at the end of this successful proposal submission. polarCtx := vm.UnwrapPolarContext(ctx) sdk.UnwrapSDKContext(polarCtx.Context()).EventManager().EmitEvent( sdk.NewEvent( diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 3c322641c4..62a5f3200a 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -26,6 +26,7 @@ import ( "testing" "time" + "github.com/cosmos/gogoproto/proto" "github.com/golang/mock/gomock" sdkmath "cosmossdk.io/math" @@ -33,6 +34,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" governancekeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" @@ -68,6 +70,7 @@ var _ = Describe("Governance Precompile", func() { contract *Contract sf *ethprecompile.StatefulFactory ctx context.Context + ir = codectypes.NewInterfaceRegistry() ) BeforeEach(func() { @@ -76,10 +79,13 @@ var _ = Describe("Governance Precompile", func() { types.SetupCosmosConfig() caller = testutils.Alice.Bytes() sdkCtx, ak, bk, gk = setupGovTest(mockCtrl, caller) + sdk.RegisterInterfaces(ir) + ir.RegisterImplementations((*sdk.Msg)(nil), &banktypes.MsgUpdateParams{}) contract = utils.MustGetAs[*Contract](NewPrecompileContract( ak, governancekeeper.NewMsgServerImpl(gk), governancekeeper.NewQueryServer(gk), + ir, )) types.SetupCosmosConfig() sf = ethprecompile.NewStatefulFactory() @@ -126,10 +132,10 @@ var _ = Describe("Governance Precompile", func() { }) When("submitting proposal handler", func() { - It("should fail if the proposal cant be unmarshalled", func() { + It("should fail if the proposal is empty", func() { _, err := contract.SubmitProposal( vm.NewPolarContext(sdk.Context{}, nil, common.Address{}, nil), - []byte("invalid"), + generated.IGovernanceModuleMsgSubmitProposal{}, ) Expect(err).To(HaveOccurred()) }) @@ -137,7 +143,6 @@ var _ = Describe("Governance Precompile", func() { When("Submitting a proposal", func() { It("should succeed", func() { - initDeposit := sdk.NewCoins(sdk.NewInt64Coin("abera", 100)) govAcct := gk.GetGovernanceAccount(ctx).GetAddress() err := testutils.MintCoinsToAddress( sdk.UnwrapSDKContext(vm.UnwrapPolarContext(ctx).Context()), @@ -149,21 +154,36 @@ var _ = Describe("Governance Precompile", func() { ) Expect(err).ToNot(HaveOccurred()) - // Create and marshal the proposal. - proposal := v1.MsgSubmitProposal{ - InitialDeposit: initDeposit, - Proposer: caller.String(), - Metadata: "metadata", - Title: "title", - Summary: "summary", - Expedited: false, + msg := &banktypes.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(governancetypes.ModuleName).String(), + Params: banktypes.Params{ + DefaultSendEnabled: true, + }, } - proposalBz, err := proposal.Marshal() + msgBz, err := proto.Marshal(msg) Expect(err).ToNot(HaveOccurred()) + + // Create and marshal the proposal. + proposal := generated.IGovernanceModuleMsgSubmitProposal{ + Messages: []generated.CosmosCodecAny{{ + Value: msgBz, + TypeURL: "/cosmos.bank.v1beta1.MsgUpdateParams", + }}, + InitialDeposit: []generated.CosmosCoin{{ + Denom: "abera", + Amount: big.NewInt(100), + }}, + Proposer: caller.String(), + Metadata: "metadata", + Title: "title", + Summary: "summary", + Expedited: false, + } + // Submit the proposal. res, err := contract.SubmitProposal( ctx, - proposalBz, + proposal, ) Expect(err).ToNot(HaveOccurred()) Expect(res).ToNot(BeNil()) diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index 9d48e04a90..c6153fb0c7 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/handler.go b/cosmos/txpool/mocks/handler.go index 353c80bf9b..9bc76e06a5 100644 --- a/cosmos/txpool/mocks/handler.go +++ b/cosmos/txpool/mocks/handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index 0217249b3a..eb48140b47 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index 4c3339a85e..d2111ff99b 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index 2db0b28d27..9fac710ee9 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index e42759b1d0..10cb2cfca1 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 754701928c..5c1426a912 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index 39c900e378..5ff7f478be 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/e2e/precompile/contracts/gov/governance_test.go b/e2e/precompile/contracts/gov/governance_test.go index 279597a09c..fcc50d7cda 100644 --- a/e2e/precompile/contracts/gov/governance_test.go +++ b/e2e/precompile/contracts/gov/governance_test.go @@ -29,13 +29,11 @@ import ( "math/big" "testing" - "cosmossdk.io/core/address" - sdkmath "cosmossdk.io/math" + "github.com/cosmos/gogoproto/proto" addresscodec "github.com/cosmos/cosmos-sdk/codec/address" - sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" bbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" bindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" @@ -94,9 +92,8 @@ var _ = Describe("Call the Precompile Directly", func() { ExpectSuccessReceipt(tf.EthClient(), tx) // Alice Submits a proposal. - amt := sdkmath.NewInt(100000000) - prop, _ := propAndMsgBz( - accCodec, cosmlib.MustStringFromEthAddress(accCodec, tf.Address("alice")), amt) + amt := big.NewInt(100000000) + prop := getProposal(cosmlib.MustStringFromEthAddress(accCodec, tf.Address("alice")), amt) txr := tf.GenerateTransactOpts("alice") tx, err = precompile.SubmitProposal(txr, prop) Expect(err).ToNot(HaveOccurred()) @@ -106,7 +103,7 @@ var _ = Describe("Call the Precompile Directly", func() { coins := []bbindings.CosmosCoin{ { Denom: "abgt", - Amount: big.NewInt(amt.Int64()), + Amount: amt, }, } txr = tf.GenerateTransactOpts("alice") @@ -115,9 +112,9 @@ var _ = Describe("Call the Precompile Directly", func() { ExpectSuccessReceipt(tf.EthClient(), tx) // Wrapper submits a proposal. - prop, _ = propAndMsgBz(accCodec, cosmlib.MustStringFromEthAddress(accCodec, wrapperAddr), amt) + prop = getProposal(cosmlib.MustStringFromEthAddress(accCodec, wrapperAddr), amt) txr = tf.GenerateTransactOpts("alice") - tx, err = wrapper.Submit(txr, prop, "abgt", big.NewInt(amt.Int64())) + tx, err = wrapper.Submit(txr, getTestProposal(prop), "abgt", amt) Expect(err).ToNot(HaveOccurred()) ExpectSuccessReceipt(tf.EthClient(), tx) @@ -205,29 +202,60 @@ var _ = Describe("Call the Precompile Directly", func() { }) }) -func propAndMsgBz(accCodec address.Codec, proposer string, amount sdkmath.Int) ([]byte, []byte) { +// Returns a proposal that updates the bank module params. +func getProposal(proposer string, amount *big.Int) bindings.IGovernanceModuleMsgSubmitProposal { // Prepare the message. - govAcc := common.HexToAddress("0x7b5Fe22B5446f7C62Ea27B8BD71CeF94e03f3dF2") - initDeposit := sdk.NewCoins(sdk.NewCoin("abgt", amount)) - message := &banktypes.MsgSend{ - FromAddress: cosmlib.MustStringFromEthAddress(accCodec, govAcc), - ToAddress: cosmlib.MustStringFromEthAddress(accCodec, tf.Address("alice")), - Amount: initDeposit, + msg := &banktypes.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress("gov").String(), + Params: banktypes.Params{ + DefaultSendEnabled: false, + }, } - messageBz, err := message.Marshal() + msgBz, err := proto.Marshal(msg) Expect(err).ToNot(HaveOccurred()) // Prepare the Proposal. - proposal := v1.MsgSubmitProposal{ - InitialDeposit: initDeposit, - Proposer: proposer, - Metadata: "metadata", - Title: "title", - Summary: "summary", - Expedited: true, + return bindings.IGovernanceModuleMsgSubmitProposal{ + Messages: []bindings.CosmosCodecAny{ + { + Value: msgBz, + TypeURL: "/cosmos.bank.v1beta1.MsgUpdateParams", + }, + }, + InitialDeposit: []bindings.CosmosCoin{ + { + Denom: "abgt", + Amount: amount, + }, + }, + Proposer: proposer, + Metadata: "metadata", + Title: "title", + Summary: "summary", + Expedited: true, } - proposalBz, err := proposal.Marshal() - Expect(err).ToNot(HaveOccurred()) +} - return proposalBz, messageBz +func getTestProposal( + proposal bindings.IGovernanceModuleMsgSubmitProposal, +) tbindings.IGovernanceModuleMsgSubmitProposal { + return tbindings.IGovernanceModuleMsgSubmitProposal{ + Messages: []tbindings.CosmosCodecAny{ + { + Value: proposal.Messages[0].Value, + TypeURL: proposal.Messages[0].TypeURL, + }, + }, + InitialDeposit: []tbindings.CosmosCoin{ + { + Denom: proposal.InitialDeposit[0].Denom, + Amount: proposal.InitialDeposit[0].Amount, + }, + }, + Proposer: proposal.Proposer, + Metadata: proposal.Metadata, + Title: proposal.Title, + Summary: proposal.Summary, + Expedited: proposal.Expedited, + } } diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 97ba324bc9..cf743ccb9a 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -10,9 +10,8 @@ replace ( ) require ( - cosmossdk.io/core v0.11.0 - cosmossdk.io/math v1.1.3-rc.1 github.com/cosmos/cosmos-sdk v0.50.0-rc.1 + github.com/cosmos/gogoproto v1.4.11 github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a @@ -24,9 +23,11 @@ require ( require ( cosmossdk.io/api v0.7.1 // indirect cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.0 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 // indirect + cosmossdk.io/math v1.1.3-rc.1 // indirect cosmossdk.io/store v1.0.0-rc.0 // indirect cosmossdk.io/x/tx v0.10.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect @@ -59,7 +60,6 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/gogoproto v1.4.11 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect diff --git a/e2e/testapp/helpers.go b/e2e/testapp/helpers.go index 53a2e6f5f3..7bcfa0deb9 100644 --- a/e2e/testapp/helpers.go +++ b/e2e/testapp/helpers.go @@ -58,6 +58,7 @@ func PrecompilesToInject( app.AccountKeeper, govkeeper.NewMsgServerImpl(app.GovKeeper), govkeeper.NewQueryServer(app.GovKeeper), + app.InterfaceRegistry(), ), stakingprecompile.NewPrecompileContract(app.AccountKeeper, app.StakingKeeper), }...) diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index a5080dfcf7..43967653e9 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index cee241caee..f596883e0c 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index 35a0836ff1..179da47ce8 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 80e4d30588..e3fece5d83 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index 26be3abffc..785fbb765a 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index 709fd42916..e1dbc5580b 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index bc61c17f98..72aeb5e5e6 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index 9cc84b0faa..fa1ed6eb9a 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.34.2. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package mocks diff --git a/eth/core/types/transaction.rlpgen.go b/eth/core/types/transaction.rlpgen.go index 5006261ca3..c335ec137e 100644 --- a/eth/core/types/transaction.rlpgen.go +++ b/eth/core/types/transaction.rlpgen.go @@ -1,5 +1,8 @@ // Code generated by rlpgen. DO NOT EDIT. +//go:build !norlpgen +// +build !norlpgen + package types import "github.com/ethereum/go-ethereum/common" From 08a86a48f803e4477051ff40ff550bb2ca33ca90 Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Thu, 5 Oct 2023 14:00:09 -0400 Subject: [PATCH 062/122] chore(gov): Update the SubmitProposal message to accept a proposer address (#1186) --- .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../governance/i_governance_module.abigen.go | 30 ++++++++--------- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 32 +++++++++---------- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../src/cosmos/precompile/Governance.sol | 4 +-- cosmos/lib/conversions.go | 24 +++++++++++--- cosmos/precompile/governance/governance.go | 17 ++++++---- .../precompile/governance/governance_test.go | 2 +- cosmos/txpool/mocks/geth_tx_pool.go | 2 +- cosmos/txpool/mocks/lifecycle.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_broadcaster.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- .../contracts/gov/governance_test.go | 12 +++---- e2e/precompile/go.mod | 2 +- e2e/testapp/go.mod | 4 +-- e2e/testapp/go.sum | 10 ++++-- eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- 29 files changed, 98 insertions(+), 77 deletions(-) diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index f88039d90f..376297b70d 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -59,7 +59,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063050cea7c1461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220e8504d14e7bbabd8bc841629fc086fa043bd1f8eb114531756938515e3580a4a64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063050cea7c1461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220880f5489e49453362eeb55c21b28be9c028d9623e18b1acd73c94dc970ebbda164736f6c63430008150033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go b/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go index 41c7df2e10..15b595ed6f 100644 --- a/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go +++ b/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go @@ -66,7 +66,7 @@ type IGovernanceModuleDepositParams struct { type IGovernanceModuleMsgSubmitProposal struct { Messages []CosmosCodecAny InitialDeposit []CosmosCoin - Proposer string + Proposer common.Address Metadata string Title string Summary string @@ -106,7 +106,7 @@ type IGovernanceModuleProposal struct { Metadata string Title string Summary string - Proposer string + Proposer common.Address } // IGovernanceModuleTallyParams is an auto generated low-level Go binding around an user-defined struct. @@ -145,7 +145,7 @@ type IGovernanceModuleWeightedVoteOption struct { // GovernanceModuleMetaData contains all meta data concerning the GovernanceModule contract. var GovernanceModuleMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CancelProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"ProposalDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposalSender\",\"type\":\"address\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"proposalVote\",\"type\":\"tuple\"}],\"name\":\"ProposalVoted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConstitution\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.DepositParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"minInitialDepositRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelDest\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"expeditedVotingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"expeditedThreshold\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"expeditedMinDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"burnVoteQuorum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnProposalDepositPrevote\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnVoteVeto\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.Params\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"getProposalDepositsByDepositor\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalTallyResult\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposalVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"getProposalVotesByVoter\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTallyParams\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.VotingParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"submitProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"voteWeighted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CancelProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"ProposalDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposalSender\",\"type\":\"address\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"proposalVote\",\"type\":\"tuple\"}],\"name\":\"ProposalVoted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConstitution\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.DepositParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"minInitialDepositRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelDest\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"expeditedVotingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"expeditedThreshold\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"expeditedMinDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"burnVoteQuorum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnProposalDepositPrevote\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnVoteVeto\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.Params\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"getProposalDepositsByDepositor\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalTallyResult\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposalVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"getProposalVotesByVoter\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTallyParams\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.VotingParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"submitProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"voteWeighted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // GovernanceModuleABI is the input ABI used to generate the binding from. @@ -389,7 +389,7 @@ func (_GovernanceModule *GovernanceModuleCallerSession) GetParams() (IGovernance // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceModule *GovernanceModuleCaller) GetProposal(opts *bind.CallOpts, proposalId uint64) (IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceModule.contract.Call(opts, &out, "getProposal", proposalId) @@ -406,14 +406,14 @@ func (_GovernanceModule *GovernanceModuleCaller) GetProposal(opts *bind.CallOpts // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceModule *GovernanceModuleSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceModule.Contract.GetProposal(&_GovernanceModule.CallOpts, proposalId) } // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceModule *GovernanceModuleCallerSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceModule.Contract.GetProposal(&_GovernanceModule.CallOpts, proposalId) } @@ -576,7 +576,7 @@ func (_GovernanceModule *GovernanceModuleCallerSession) GetProposalVotesByVoter( // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleCaller) GetProposals(opts *bind.CallOpts, proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { var out []interface{} err := _GovernanceModule.contract.Call(opts, &out, "getProposals", proposalStatus, pagination) @@ -594,14 +594,14 @@ func (_GovernanceModule *GovernanceModuleCaller) GetProposals(opts *bind.CallOpt // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleSession) GetProposals(proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { return _GovernanceModule.Contract.GetProposals(&_GovernanceModule.CallOpts, proposalStatus, pagination) } // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleCallerSession) GetProposals(proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { return _GovernanceModule.Contract.GetProposals(&_GovernanceModule.CallOpts, proposalStatus, pagination) } @@ -689,23 +689,23 @@ func (_GovernanceModule *GovernanceModuleTransactorSession) CancelProposal(propo return _GovernanceModule.Contract.CancelProposal(&_GovernanceModule.TransactOpts, proposalId) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xd6ff05e7. +// SubmitProposal is a paid mutator transaction binding the contract method 0xe4112572. // -// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal) returns(uint64) +// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) func (_GovernanceModule *GovernanceModuleTransactor) SubmitProposal(opts *bind.TransactOpts, proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { return _GovernanceModule.contract.Transact(opts, "submitProposal", proposal) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xd6ff05e7. +// SubmitProposal is a paid mutator transaction binding the contract method 0xe4112572. // -// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal) returns(uint64) +// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) func (_GovernanceModule *GovernanceModuleSession) SubmitProposal(proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposal) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xd6ff05e7. +// SubmitProposal is a paid mutator transaction binding the contract method 0xe4112572. // -// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal) returns(uint64) +// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) func (_GovernanceModule *GovernanceModuleTransactorSession) SubmitProposal(proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposal) } diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index a459f059a6..0876afbd46 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212202d601bc628a360b6c897b2ee881c654315bd1cde1c07c561e4097872ac2c899f64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212202e1468a72b27fde3d83a5309aa68fcf25206f0279af0dc51103f58e3bb5d376464736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index eeb6495f17..f6f2a2fd4f 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -45,7 +45,7 @@ type CosmosCoin struct { type IGovernanceModuleMsgSubmitProposal struct { Messages []CosmosCodecAny InitialDeposit []CosmosCoin - Proposer string + Proposer common.Address Metadata string Title string Summary string @@ -66,7 +66,7 @@ type IGovernanceModuleProposal struct { Metadata string Title string Summary string - Proposer string + Proposer common.Address } // IGovernanceModuleTallyResult is an auto generated low-level Go binding around an user-defined struct. @@ -79,8 +79,8 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"proposer\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027213803806200272183398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b60805161254a620001d75f395f610361015261254a5ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b14610121578063773fb15e1461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f9190610947565b6101f3565b6040516100b191906109cd565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a60565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a79565b6102bd565b604051610118929190610ab3565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610afa565b60405180910390f35b61016560048036038101906101609190610bc5565b610383565b6040516101729190610c52565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c6b565b610508565b6040516101ae9190611261565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a79565b6105bd565b6040516101ea91906113c1565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b815260040161025193929190611438565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610291919061149e565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c52565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035691906114dd565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610823565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106104335761043261151b565b5b60200260200101516020018190525082815f815181106104565761045561151b565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6ff05e7876040518263ffffffff1660e01b81526004016104bd9190611b2a565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611b4a565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611be8565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b09190612457565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c52565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f91906124cd565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f661075f565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107b481610798565b81146107be575f80fd5b50565b5f813590506107cf816107ab565b92915050565b5f8160030b9050919050565b6107ea816107d5565b81146107f4575f80fd5b50565b5f81359050610805816107e1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61085982610813565b810181811067ffffffffffffffff8211171561087857610877610823565b5b80604052505050565b5f61088a610787565b90506108968282610850565b919050565b5f67ffffffffffffffff8211156108b5576108b4610823565b5b6108be82610813565b9050602081019050919050565b828183375f83830152505050565b5f6108eb6108e68461089b565b610881565b9050828152602081018484840111156109075761090661080f565b5b6109128482856108cb565b509392505050565b5f82601f83011261092e5761092d61080b565b5b813561093e8482602086016108d9565b91505092915050565b5f805f6060848603121561095e5761095d610790565b5b5f61096b868287016107c1565b935050602061097c868287016107f7565b925050604084013567ffffffffffffffff81111561099d5761099c610794565b5b6109a98682870161091a565b9150509250925092565b5f8115159050919050565b6109c7816109b3565b82525050565b5f6020820190506109e05f8301846109be565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a28610a23610a1e846109e6565b610a05565b6109e6565b9050919050565b5f610a3982610a0e565b9050919050565b5f610a4a82610a2f565b9050919050565b610a5a81610a40565b82525050565b5f602082019050610a735f830184610a51565b92915050565b5f60208284031215610a8e57610a8d610790565b5b5f610a9b848285016107c1565b91505092915050565b610aad81610798565b82525050565b5f604082019050610ac65f830185610aa4565b610ad36020830184610aa4565b9392505050565b5f610ae482610a2f565b9050919050565b610af481610ada565b82525050565b5f602082019050610b0d5f830184610aeb565b92915050565b5f80fd5b5f60e08284031215610b2c57610b2b610b13565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b5257610b5161080b565b5b8235905067ffffffffffffffff811115610b6f57610b6e610b35565b5b602083019150836001820283011115610b8b57610b8a610b39565b5b9250929050565b5f819050919050565b610ba481610b92565b8114610bae575f80fd5b50565b5f81359050610bbf81610b9b565b92915050565b5f805f8060608587031215610bdd57610bdc610790565b5b5f85013567ffffffffffffffff811115610bfa57610bf9610794565b5b610c0687828801610b17565b945050602085013567ffffffffffffffff811115610c2757610c26610794565b5b610c3387828801610b3d565b93509350506040610c4687828801610bb1565b91505092959194509250565b5f602082019050610c655f830184610aa4565b92915050565b5f60208284031215610c8057610c7f610790565b5b5f610c8d848285016107f7565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cc881610798565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d2e578082015181840152602081019050610d13565b5f8484015250505050565b5f610d4382610cf7565b610d4d8185610d01565b9350610d5d818560208601610d11565b610d6681610813565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610daf81610d9a565b82525050565b5f610dc08383610da6565b60208301905092915050565b5f602082019050919050565b5f610de282610d71565b610dec8185610d7b565b9350610df783610d8b565b805f5b83811015610e27578151610e0e8882610db5565b9750610e1983610dcc565b925050600181019050610dfa565b5085935050505092915050565b5f604083015f8301518482035f860152610e4e8282610d39565b91505060208301518482036020860152610e688282610dd8565b9150508091505092915050565b5f610e808383610e34565b905092915050565b5f602082019050919050565b5f610e9e82610cce565b610ea88185610cd8565b935083602082028501610eba85610ce8565b805f5b85811015610ef55784840389528151610ed68582610e75565b9450610ee183610e88565b925060208a01995050600181019050610ebd565b50829750879550505050505092915050565b610f10816107d5565b82525050565b5f608083015f8301518482035f860152610f308282610d39565b91505060208301518482036020860152610f4a8282610d39565b91505060408301518482036040860152610f648282610d39565b91505060608301518482036060860152610f7e8282610d39565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fbd81610b92565b82525050565b5f604083015f830151610fd85f860182610fb4565b5060208301518482036020860152610ff08282610d39565b9150508091505092915050565b5f6110088383610fc3565b905092915050565b5f602082019050919050565b5f61102682610f8b565b6110308185610f95565b93508360208202850161104285610fa5565b805f5b8581101561107d578484038952815161105e8582610ffd565b945061106983611010565b925060208a01995050600181019050611045565b50829750879550505050505092915050565b5f6101a083015f8301516110a55f860182610cbf565b50602083015184820360208601526110bd8282610e94565b91505060408301516110d26040860182610f07565b50606083015184820360608601526110ea8282610f16565b91505060808301516110ff6080860182610cbf565b5060a083015161111260a0860182610cbf565b5060c083015184820360c086015261112a828261101c565b91505060e083015161113f60e0860182610cbf565b50610100830151611154610100860182610cbf565b5061012083015184820361012086015261116e8282610d39565b91505061014083015184820361014086015261118a8282610d39565b9150506101608301518482036101608601526111a68282610d39565b9150506101808301518482036101808601526111c28282610d39565b9150508091505092915050565b5f6111da838361108f565b905092915050565b5f602082019050919050565b5f6111f882610c96565b6112028185610ca0565b93508360208202850161121485610cb0565b805f5b8581101561124f578484038952815161123085826111cf565b945061123b836111e2565b925060208a01995050600181019050611217565b50829750879550505050505092915050565b5f6020820190508181035f83015261127981846111ee565b905092915050565b5f6101a083015f8301516112975f860182610cbf565b50602083015184820360208601526112af8282610e94565b91505060408301516112c46040860182610f07565b50606083015184820360608601526112dc8282610f16565b91505060808301516112f16080860182610cbf565b5060a083015161130460a0860182610cbf565b5060c083015184820360c086015261131c828261101c565b91505060e083015161133160e0860182610cbf565b50610100830151611346610100860182610cbf565b506101208301518482036101208601526113608282610d39565b91505061014083015184820361014086015261137c8282610d39565b9150506101608301518482036101608601526113988282610d39565b9150506101808301518482036101808601526113b48282610d39565b9150508091505092915050565b5f6020820190508181035f8301526113d98184611281565b905092915050565b6113ea816107d5565b82525050565b5f82825260208201905092915050565b5f61140a82610cf7565b61141481856113f0565b9350611424818560208601610d11565b61142d81610813565b840191505092915050565b5f60608201905061144b5f830186610aa4565b61145860208301856113e1565b818103604083015261146a8184611400565b9050949350505050565b61147d816109b3565b8114611487575f80fd5b50565b5f8151905061149881611474565b92915050565b5f602082840312156114b3576114b2610790565b5b5f6114c08482850161148a565b91505092915050565b5f815190506114d7816107ab565b92915050565b5f80604083850312156114f3576114f2610790565b5b5f611500858286016114c9565b9250506020611511858286016114c9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126115705761156f611550565b5b83810192508235915060208301925067ffffffffffffffff82111561159857611597611548565b5b6020820236038313156115ae576115ad61154c565b5b509250929050565b5f819050919050565b5f80833560016020038436030381126115db576115da611550565b5b83810192508235915060208301925067ffffffffffffffff82111561160357611602611548565b5b6001820236038313156116195761161861154c565b5b509250929050565b5f61162c8385610d01565b93506116398385846108cb565b61164283610813565b840190509392505050565b5f808335600160200384360303811261166957611668611550565b5b83810192508235915060208301925067ffffffffffffffff82111561169157611690611548565b5b6020820236038313156116a7576116a661154c565b5b509250929050565b5f819050919050565b6116c181610d9a565b81146116cb575f80fd5b50565b5f813590506116dc816116b8565b92915050565b5f6116f060208401846116ce565b905092915050565b5f602082019050919050565b5f61170f8385610d7b565b935061171a826116af565b805f5b858110156117525761172f82846116e2565b6117398882610db5565b9750611744836116f8565b92505060018101905061171d565b5085925050509392505050565b5f604083016117705f8401846115bf565b8583035f870152611782838284611621565b92505050611793602084018461164d565b85830360208701526117a6838284611704565b925050508091505092915050565b5f6117bf838361175f565b905092915050565b5f823560016040038336030381126117e2576117e1611550565b5b82810191505092915050565b5f602082019050919050565b5f6118058385610cd8565b935083602084028501611817846115b6565b805f5b8781101561185a57848403895261183182846117c7565b61183b85826117b4565b9450611846836117ee565b925060208a0199505060018101905061181a565b50829750879450505050509392505050565b5f808335600160200384360303811261188857611887611550565b5b83810192508235915060208301925067ffffffffffffffff8211156118b0576118af611548565b5b6020820236038313156118c6576118c561154c565b5b509250929050565b5f819050919050565b5f6118e56020840184610bb1565b905092915050565b5f604083016118fe5f8401846118d7565b61190a5f860182610fb4565b5061191860208401846115bf565b858303602087015261192b838284611621565b925050508091505092915050565b5f61194483836118ed565b905092915050565b5f8235600160400383360303811261196757611966611550565b5b82810191505092915050565b5f602082019050919050565b5f61198a8385610f95565b93508360208402850161199c846118ce565b805f5b878110156119df5784840389526119b6828461194c565b6119c08582611939565b94506119cb83611973565b925060208a0199505060018101905061199f565b50829750879450505050509392505050565b5f813590506119ff81611474565b92915050565b5f611a1360208401846119f1565b905092915050565b611a24816109b3565b82525050565b5f60e08301611a3b5f840184611554565b8583035f870152611a4d8382846117fa565b92505050611a5e602084018461186c565b8583036020870152611a7183828461197f565b92505050611a8260408401846115bf565b8583036040870152611a95838284611621565b92505050611aa660608401846115bf565b8583036060870152611ab9838284611621565b92505050611aca60808401846115bf565b8583036080870152611add838284611621565b92505050611aee60a08401846115bf565b85830360a0870152611b01838284611621565b92505050611b1260c0840184611a05565b611b1f60c0860182611a1b565b508091505092915050565b5f6020820190508181035f830152611b428184611a2a565b905092915050565b5f60208284031215611b5f57611b5e610790565b5b5f611b6c848285016114c9565b91505092915050565b5f60a083015f8301518482035f860152611b8f8282610d39565b9150506020830151611ba46020860182610cbf565b506040830151611bb76040860182610cbf565b506060830151611bca6060860182611a1b565b506080830151611bdd6080860182611a1b565b508091505092915050565b5f604082019050611bfb5f8301856113e1565b8181036020830152611c0d8184611b75565b90509392505050565b5f67ffffffffffffffff821115611c3057611c2f610823565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611c6357611c62610823565b5b602082029050602081019050919050565b5f611c86611c818461089b565b610881565b905082815260208101848484011115611ca257611ca161080f565b5b611cad848285610d11565b509392505050565b5f82601f830112611cc957611cc861080b565b5b8151611cd9848260208601611c74565b91505092915050565b5f67ffffffffffffffff821115611cfc57611cfb610823565b5b602082029050602081019050919050565b5f81519050611d1b816116b8565b92915050565b5f611d33611d2e84611ce2565b610881565b90508083825260208201905060208402830185811115611d5657611d55610b39565b5b835b81811015611d7f5780611d6b8882611d0d565b845260208401935050602081019050611d58565b5050509392505050565b5f82601f830112611d9d57611d9c61080b565b5b8151611dad848260208601611d21565b91505092915050565b5f60408284031215611dcb57611dca611c41565b5b611dd56040610881565b90505f82015167ffffffffffffffff811115611df457611df3611c45565b5b611e0084828501611cb5565b5f83015250602082015167ffffffffffffffff811115611e2357611e22611c45565b5b611e2f84828501611d89565b60208301525092915050565b5f611e4d611e4884611c49565b610881565b90508083825260208201905060208402830185811115611e7057611e6f610b39565b5b835b81811015611eb757805167ffffffffffffffff811115611e9557611e9461080b565b5b808601611ea28982611db6565b85526020850194505050602081019050611e72565b5050509392505050565b5f82601f830112611ed557611ed461080b565b5b8151611ee5848260208601611e3b565b91505092915050565b5f81519050611efc816107e1565b92915050565b5f60808284031215611f1757611f16611c41565b5b611f216080610881565b90505f82015167ffffffffffffffff811115611f4057611f3f611c45565b5b611f4c84828501611cb5565b5f83015250602082015167ffffffffffffffff811115611f6f57611f6e611c45565b5b611f7b84828501611cb5565b602083015250604082015167ffffffffffffffff811115611f9f57611f9e611c45565b5b611fab84828501611cb5565b604083015250606082015167ffffffffffffffff811115611fcf57611fce611c45565b5b611fdb84828501611cb5565b60608301525092915050565b5f67ffffffffffffffff82111561200157612000610823565b5b602082029050602081019050919050565b5f8151905061202081610b9b565b92915050565b5f6040828403121561203b5761203a611c41565b5b6120456040610881565b90505f61205484828501612012565b5f83015250602082015167ffffffffffffffff81111561207757612076611c45565b5b61208384828501611cb5565b60208301525092915050565b5f6120a161209c84611fe7565b610881565b905080838252602082019050602084028301858111156120c4576120c3610b39565b5b835b8181101561210b57805167ffffffffffffffff8111156120e9576120e861080b565b5b8086016120f68982612026565b855260208501945050506020810190506120c6565b5050509392505050565b5f82601f8301126121295761212861080b565b5b815161213984826020860161208f565b91505092915050565b5f6101a0828403121561215857612157611c41565b5b6121636101a0610881565b90505f612172848285016114c9565b5f83015250602082015167ffffffffffffffff81111561219557612194611c45565b5b6121a184828501611ec1565b60208301525060406121b584828501611eee565b604083015250606082015167ffffffffffffffff8111156121d9576121d8611c45565b5b6121e584828501611f02565b60608301525060806121f9848285016114c9565b60808301525060a061220d848285016114c9565b60a08301525060c082015167ffffffffffffffff81111561223157612230611c45565b5b61223d84828501612115565b60c08301525060e0612251848285016114c9565b60e083015250610100612266848285016114c9565b6101008301525061012082015167ffffffffffffffff81111561228c5761228b611c45565b5b61229884828501611cb5565b6101208301525061014082015167ffffffffffffffff8111156122be576122bd611c45565b5b6122ca84828501611cb5565b6101408301525061016082015167ffffffffffffffff8111156122f0576122ef611c45565b5b6122fc84828501611cb5565b6101608301525061018082015167ffffffffffffffff81111561232257612321611c45565b5b61232e84828501611cb5565b6101808301525092915050565b5f61234d61234884611c16565b610881565b905080838252602082019050602084028301858111156123705761236f610b39565b5b835b818110156123b757805167ffffffffffffffff8111156123955761239461080b565b5b8086016123a28982612142565b85526020850194505050602081019050612372565b5050509392505050565b5f82601f8301126123d5576123d461080b565b5b81516123e584826020860161233b565b91505092915050565b5f6040828403121561240357612402611c41565b5b61240d6040610881565b90505f82015167ffffffffffffffff81111561242c5761242b611c45565b5b61243884828501611cb5565b5f83015250602061244b848285016114c9565b60208301525092915050565b5f806040838503121561246d5761246c610790565b5b5f83015167ffffffffffffffff81111561248a57612489610794565b5b612496858286016123c1565b925050602083015167ffffffffffffffff8111156124b7576124b6610794565b5b6124c3858286016123ee565b9150509250929050565b5f602082840312156124e2576124e1610790565b5b5f82015167ffffffffffffffff8111156124ff576124fe610794565b5b61250b84828501612142565b9150509291505056fea264697066735822122060e7fa4f1ecbfce40bec94de51b2058f0dd2bd8559093bbc62026b5ecc9d4fa664736f6c63430008150033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea26469706673582212203c7ce1b3f709dc4c2e7e6f7800d71758030d260c1778831901b5344c3f8e3cb964736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. @@ -283,7 +283,7 @@ func (_GovernanceWrapper *GovernanceWrapperCallerSession) Bank() (common.Address // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposal(opts *bind.CallOpts, proposalId uint64) (IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceWrapper.contract.Call(opts, &out, "getProposal", proposalId) @@ -300,21 +300,21 @@ func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposal(opts *bind.CallOp // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceWrapper *GovernanceWrapperSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposal(&_GovernanceWrapper.CallOpts, proposalId) } // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceWrapper *GovernanceWrapperCallerSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposal(&_GovernanceWrapper.CallOpts, proposalId) } // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposals(opts *bind.CallOpts, proposalStatus int32) ([]IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceWrapper.contract.Call(opts, &out, "getProposals", proposalStatus) @@ -331,14 +331,14 @@ func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposals(opts *bind.CallO // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) func (_GovernanceWrapper *GovernanceWrapperSession) GetProposals(proposalStatus int32) ([]IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposals(&_GovernanceWrapper.CallOpts, proposalStatus) } // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,string)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) func (_GovernanceWrapper *GovernanceWrapperCallerSession) GetProposals(proposalStatus int32) ([]IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposals(&_GovernanceWrapper.CallOpts, proposalStatus) } @@ -395,23 +395,23 @@ func (_GovernanceWrapper *GovernanceWrapperTransactorSession) CancelProposal(pro return _GovernanceWrapper.Contract.CancelProposal(&_GovernanceWrapper.TransactOpts, proposalId) } -// Submit is a paid mutator transaction binding the contract method 0x773fb15e. +// Submit is a paid mutator transaction binding the contract method 0x7752e8e4. // -// Solidity: function submit(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +// Solidity: function submit(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) func (_GovernanceWrapper *GovernanceWrapperTransactor) Submit(opts *bind.TransactOpts, proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.contract.Transact(opts, "submit", proposal, denom, amount) } -// Submit is a paid mutator transaction binding the contract method 0x773fb15e. +// Submit is a paid mutator transaction binding the contract method 0x7752e8e4. // -// Solidity: function submit(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +// Solidity: function submit(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) func (_GovernanceWrapper *GovernanceWrapperSession) Submit(proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.Contract.Submit(&_GovernanceWrapper.TransactOpts, proposal, denom, amount) } -// Submit is a paid mutator transaction binding the contract method 0x773fb15e. +// Submit is a paid mutator transaction binding the contract method 0x7752e8e4. // -// Solidity: function submit(((string,uint8[])[],(uint256,string)[],string,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +// Solidity: function submit(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) func (_GovernanceWrapper *GovernanceWrapperTransactorSession) Submit(proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.Contract.Submit(&_GovernanceWrapper.TransactOpts, proposal, denom, amount) } diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 1a1e8022c2..84b67f7400 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220b3c088cebf6842e38899ca96d3f41f74654e1b2cfd2290c7797c825e1e8f738f64736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220a6f566912966ed2968e320c805107684b738a4f13f93fe7f2f4fcd6e5dcab93664736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index 132b168ce3..7af11dac26 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea26469706673582212201b565383e699fe131096bda744e6d73506422567b7f5d85ad9e96861940d3a9c64736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220081db97a7a754fb8487d8a3532e79ee0ebf63b3ea4349133dc6951386f7e6d6064736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/src/cosmos/precompile/Governance.sol b/contracts/src/cosmos/precompile/Governance.sol index 84f2757701..009872a5b9 100644 --- a/contracts/src/cosmos/precompile/Governance.sol +++ b/contracts/src/cosmos/precompile/Governance.sol @@ -168,7 +168,7 @@ interface IGovernanceModule { struct MsgSubmitProposal { Cosmos.CodecAny[] messages; Cosmos.Coin[] initialDeposit; - string proposer; + address proposer; string metadata; string title; string summary; @@ -191,7 +191,7 @@ interface IGovernanceModule { string metadata; string title; string summary; - string proposer; + address proposer; } /** diff --git a/cosmos/lib/conversions.go b/cosmos/lib/conversions.go index 144e4db7db..876ea95ccc 100644 --- a/cosmos/lib/conversions.go +++ b/cosmos/lib/conversions.go @@ -37,6 +37,7 @@ import ( "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/staking" "pkg.berachain.dev/polaris/cosmos/precompile" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/lib/utils" ) @@ -217,7 +218,9 @@ func SdkValidatorsToStakingValidators( // SdkProposalToGovProposal is a helper function to transform a `v1.Proposal` to an // `IGovernanceModule.Proposal`. -func SdkProposalToGovProposal(proposal v1.Proposal) governance.IGovernanceModuleProposal { +func SdkProposalToGovProposal( + proposal *v1.Proposal, addressCodec address.Codec, +) (governance.IGovernanceModuleProposal, error) { messages := make([]governance.CosmosCodecAny, len(proposal.Messages)) for i, msg := range proposal.Messages { messages[i] = governance.CosmosCodecAny{ @@ -234,6 +237,11 @@ func SdkProposalToGovProposal(proposal v1.Proposal) governance.IGovernanceModule } } + proposerAddr, err := EthAddressFromString(addressCodec, proposal.Proposer) + if err != nil { + return governance.IGovernanceModuleProposal{}, err + } + return governance.IGovernanceModuleProposal{ Id: proposal.Id, Messages: messages, @@ -252,14 +260,14 @@ func SdkProposalToGovProposal(proposal v1.Proposal) governance.IGovernanceModule Metadata: proposal.Metadata, Title: proposal.Title, Summary: proposal.Summary, - Proposer: proposal.Proposer, - } + Proposer: proposerAddr, + }, nil } // ConvertMsgSubmitProposalToSdk is a helper function to convert a `MsgSubmitProposal` to the gov // `v1.MsgSubmitProposal`. func ConvertMsgSubmitProposalToSdk( - prop any, ir codectypes.InterfaceRegistry, + prop any, ir codectypes.InterfaceRegistry, addressCodec address.Codec, ) (*v1.MsgSubmitProposal, error) { // Convert the prop object to the desired unnamed struct using reflection. propValue := reflect.ValueOf(prop) @@ -295,10 +303,16 @@ func ConvertMsgSubmitProposalToSdk( } // Return the v1.MsgSubmitProposal with all string fields attached. + proposer, err := StringFromEthAddress( + addressCodec, propValue.FieldByName("Proposer").Interface().(common.Address), + ) + if err != nil { + return nil, err + } return &v1.MsgSubmitProposal{ Messages: messages, InitialDeposit: initialDeposit, - Proposer: propValue.FieldByName("Proposer").Interface().(string), + Proposer: proposer, Metadata: propValue.FieldByName("Metadata").Interface().(string), Title: propValue.FieldByName("Title").Interface().(string), Summary: propValue.FieldByName("Summary").Interface().(string), diff --git a/cosmos/precompile/governance/governance.go b/cosmos/precompile/governance/governance.go index 7be47c6528..953f00952e 100644 --- a/cosmos/precompile/governance/governance.go +++ b/cosmos/precompile/governance/governance.go @@ -91,7 +91,7 @@ func (c *Contract) SubmitProposal( proposal any, ) (uint64, error) { // Convert the submit proposal msg into v1.MsgSubmitProposal. - msgSubmitProposal, err := cosmlib.ConvertMsgSubmitProposalToSdk(proposal, c.ir) + msgSubmitProposal, err := cosmlib.ConvertMsgSubmitProposalToSdk(proposal, c.ir, c.addressCodec) if err != nil { return 0, err } @@ -255,7 +255,8 @@ func (c *Contract) GetProposal( if err != nil { return generated.IGovernanceModuleProposal{}, err } - return cosmlib.SdkProposalToGovProposal(*res.Proposal), nil + + return cosmlib.SdkProposalToGovProposal(res.Proposal, c.addressCodec) } // GetProposals is the method for the `getProposal` @@ -274,12 +275,16 @@ func (c *Contract) GetProposals( return nil, cbindings.CosmosPageResponse{}, err } - proposals := make([]generated.IGovernanceModuleProposal, 0) - for _, proposal := range res.Proposals { - proposals = append(proposals, cosmlib.SdkProposalToGovProposal(*proposal)) + govProposals := make([]generated.IGovernanceModuleProposal, len(res.Proposals)) + for i, sdkProposal := range res.Proposals { + var govProposal generated.IGovernanceModuleProposal + if govProposal, err = cosmlib.SdkProposalToGovProposal(sdkProposal, c.addressCodec); err != nil { + return nil, cbindings.CosmosPageResponse{}, err + } + govProposals[i] = govProposal } - return proposals, cosmlib.SdkPageResponseToEvmPageResponse(res.Pagination), nil + return govProposals, cosmlib.SdkPageResponseToEvmPageResponse(res.Pagination), nil } // GetProposalDeposits is the method for the `getProposalDeposits` diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 62a5f3200a..abe947a19c 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -173,7 +173,7 @@ var _ = Describe("Governance Precompile", func() { Denom: "abera", Amount: big.NewInt(100), }}, - Proposer: caller.String(), + Proposer: common.BytesToAddress(caller.Bytes()), Metadata: "metadata", Title: "title", Summary: "summary", diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index c6153fb0c7..5bd365e04a 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index eb48140b47..406f3c5ffc 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index d2111ff99b..87d77fbee7 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index 9fac710ee9..134e480af0 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index 10cb2cfca1..f6798fa323 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 5c1426a912..6a8449633a 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index 5ff7f478be..ec684dd312 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/e2e/precompile/contracts/gov/governance_test.go b/e2e/precompile/contracts/gov/governance_test.go index fcc50d7cda..d29d55e743 100644 --- a/e2e/precompile/contracts/gov/governance_test.go +++ b/e2e/precompile/contracts/gov/governance_test.go @@ -31,15 +31,12 @@ import ( "github.com/cosmos/gogoproto/proto" - addresscodec "github.com/cosmos/cosmos-sdk/codec/address" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" bbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" bindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" tbindings "pkg.berachain.dev/polaris/contracts/bindings/testing/governance" - cosmlib "pkg.berachain.dev/polaris/cosmos/lib" - cosmtypes "pkg.berachain.dev/polaris/cosmos/types" network "pkg.berachain.dev/polaris/e2e/localnet/network" utils "pkg.berachain.dev/polaris/e2e/precompile" "pkg.berachain.dev/polaris/eth/common" @@ -63,7 +60,6 @@ var _ = Describe("Call the Precompile Directly", func() { wrapper *tbindings.GovernanceWrapper bankPrecompile *bbindings.BankModule wrapperAddr common.Address - accCodec = addresscodec.NewBech32Codec(cosmtypes.Bech32PrefixAccAddr) ) BeforeEach(func() { @@ -93,7 +89,7 @@ var _ = Describe("Call the Precompile Directly", func() { // Alice Submits a proposal. amt := big.NewInt(100000000) - prop := getProposal(cosmlib.MustStringFromEthAddress(accCodec, tf.Address("alice")), amt) + prop := getProposal(tf.Address("alice"), amt) txr := tf.GenerateTransactOpts("alice") tx, err = precompile.SubmitProposal(txr, prop) Expect(err).ToNot(HaveOccurred()) @@ -112,7 +108,7 @@ var _ = Describe("Call the Precompile Directly", func() { ExpectSuccessReceipt(tf.EthClient(), tx) // Wrapper submits a proposal. - prop = getProposal(cosmlib.MustStringFromEthAddress(accCodec, wrapperAddr), amt) + prop = getProposal(wrapperAddr, amt) txr = tf.GenerateTransactOpts("alice") tx, err = wrapper.Submit(txr, getTestProposal(prop), "abgt", amt) Expect(err).ToNot(HaveOccurred()) @@ -203,7 +199,9 @@ var _ = Describe("Call the Precompile Directly", func() { }) // Returns a proposal that updates the bank module params. -func getProposal(proposer string, amount *big.Int) bindings.IGovernanceModuleMsgSubmitProposal { +func getProposal( + proposer common.Address, amount *big.Int, +) bindings.IGovernanceModuleMsgSubmitProposal { // Prepare the message. msg := &banktypes.MsgUpdateParams{ Authority: authtypes.NewModuleAddress("gov").String(), diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index cf743ccb9a..8d758a8310 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -15,7 +15,6 @@ require ( github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a ) @@ -203,6 +202,7 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect + pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a // indirect pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index d20016dc9a..356221287a 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,7 +15,7 @@ require ( cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/stretchr/testify v1.8.4 - pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 ) @@ -272,7 +272,7 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 // indirect pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 94e7d27655..13b6ced358 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -277,6 +277,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= +github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -1884,11 +1885,14 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6 h1:U5wpPv/ZitKJCZkHWVsWOzAfX3orlnHHhn5rYGJ1DPA= -pkg.berachain.dev/polaris/contracts v0.0.0-20230925142347-326426fa61f6/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354 h1:J/d2QQVxlFufmVNrK07uvnMbCFoIX8T0D7YRxvu0ntg= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd h1:TZSUZb9hGRwhYLFGuU5+vxyPzuNnjLWWST7Gv03Se84= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 43967653e9..257ab722b4 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index f596883e0c..ae16a6e5e0 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index 179da47ce8..a1799e851f 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index e3fece5d83..5633c28620 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index 785fbb765a..4f657c938f 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index e1dbc5580b..40f35c8cbb 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index 72aeb5e5e6..0b295c7f7b 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index fa1ed6eb9a..5d98088b42 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.35.2. DO NOT EDIT. package mocks From 8c461b47c95b0715c9e14cced8404c0ee8555e3f Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 5 Oct 2023 16:37:39 -0400 Subject: [PATCH 063/122] refactor(config): Cleanup config (#1185) --- .mockery.yaml | 10 +- codecov.yml | 2 +- cosmos/config/config.go | 518 +++++++++++++---------- cosmos/config/flags.go | 61 ++- cosmos/config/mocks/app_options.go | 76 ++++ cosmos/config/parser.go | 190 +++++++++ cosmos/config/parser_test.go | 146 +++++++ cosmos/config/template.go | 27 +- e2e/hive/clients/polard/config/app.toml | 53 ++- e2e/precompile/polard/config/app.toml | 53 ++- e2e/testapp/docker/local/config/app.toml | 53 ++- eth/common/hexutil/imported.go | 5 +- eth/core/types/transaction.rlpgen.go | 3 - eth/polar/config.go | 5 + 14 files changed, 896 insertions(+), 306 deletions(-) create mode 100644 cosmos/config/mocks/app_options.go create mode 100644 cosmos/config/parser.go create mode 100644 cosmos/config/parser_test.go diff --git a/.mockery.yaml b/.mockery.yaml index 5f455e0c3b..cb836e05d7 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -3,15 +3,19 @@ mockname: "{{.InterfaceNameCamel}}" filename: "{{.InterfaceNameSnake}}.go" outpkg: "mocks" packages: - pkg.berachain.dev/polaris/cosmos/txpool: + pkg.berachain.dev/polaris/cosmos/config: config: + recursive: True + with-expecter: true all: True + pkg.berachain.dev/polaris/cosmos/txpool: + config: recursive: True with-expecter: true + all: True pkg.berachain.dev/polaris/eth/core/state: config: - all: True recursive: True with-expecter: true - + all: True \ No newline at end of file diff --git a/codecov.yml b/codecov.yml index ae65c1e9fe..9a619e026f 100644 --- a/codecov.yml +++ b/codecov.yml @@ -22,7 +22,7 @@ coverage: status: project: default: - target: 50% + target: 45% patch: off comment: diff --git a/cosmos/config/config.go b/cosmos/config/config.go index 7bf471377b..7f672f7c66 100644 --- a/cosmos/config/config.go +++ b/cosmos/config/config.go @@ -21,18 +21,13 @@ package config import ( - "fmt" "math/big" - "time" - - "github.com/spf13/cast" "github.com/cosmos/cosmos-sdk/client/flags" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/ethereum/go-ethereum/node" - "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/polar" ) @@ -60,352 +55,411 @@ func MustReadConfigFromAppOpts(opts servertypes.AppOptions) *Config { return cfg } -//nolint:funlen,gocognit,gocyclo,cyclop // TODO break up later. func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { + return readConfigFromAppOptsParser(AppOptionsParser{AppOptions: opts}) +} + +//nolint:funlen,gocognit,gocyclo,cyclop // TODO break up later. +func readConfigFromAppOptsParser(parser AppOptionsParser) (*Config, error) { var err error var val int64 conf := &Config{} - // Define little error handler. - var handleError = func(err error, flag string) error { - if err != nil { - return fmt.Errorf("error while reading configuration: %w flag: %s", err, flag) - } - return nil + // Polar settings + if conf.Polar.RPCGasCap, err = + parser.GetUint64(flagRPCGasCap); err != nil { + return nil, err } - - // Wrapping casting functions to return both value and error - getCommonAddressList := func(key string) []common.Address { - addresses := make([]common.Address, 0) - addressStrs := cast.ToStringSlice(opts.Get(key)) - for _, addressStr := range addressStrs { - address := common.HexToAddress(addressStr) - addresses = append(addresses, address) - } - return addresses - } - getString := func(key string) (string, error) { return cast.ToStringE(opts.Get(key)) } - getInt := func(key string) (int, error) { return cast.ToIntE(opts.Get(key)) } - getInt64 := func(key string) (int64, error) { return cast.ToInt64E(opts.Get(key)) } - getUint64 := func(key string) (uint64, error) { return cast.ToUint64E(opts.Get(key)) } - getUint64Ptr := func(key string) (*uint64, error) { - if num, _ := cast.ToStringE((opts.Get(key))); num == "" || num == "null" { - return nil, nil //nolint:nilnil // intentional. - } - - num, _err := cast.ToUint64E((opts.Get(key))) - if _err != nil { - return nil, _err - } - return &num, nil + if conf.Polar.RPCEVMTimeout, err = + parser.GetTimeDuration(flagRPCEvmTimeout); err != nil { + return nil, err } - getBigInt := func(key string) (*big.Int, error) { - str, _err := cast.ToStringE(opts.Get(key)) - if str == "" || str == "null" { - return nil, nil //nolint:nilnil // intentional. - } - if _err != nil { - return nil, _err - } - num, ok := new(big.Int).SetString(str, 10) //nolint:gomnd // base 10. - if !ok { - return nil, fmt.Errorf("invalid big.Int string: %s", str) - } - return num, nil + if conf.Polar.RPCTxFeeCap, err = + parser.GetFloat64(flagRPCTxFeeCap); err != nil { + return nil, err } - getFloat64 := func(key string) (float64, error) { - return cast.ToFloat64E(opts.Get(key)) + + // Polar Miner settings + if conf.Polar.Miner.Etherbase, err = + parser.GetCommonAddress(flagMinerEtherbase); err != nil { + return nil, err } - getBool := func(key string) (bool, error) { - return cast.ToBoolE(opts.Get(key)) + if conf.Polar.Miner.ExtraData, err = + parser.GetHexutilBytes(flagMinerExtraData); err != nil { + return nil, err } - getStringSlice := func(key string) ([]string, error) { - return cast.ToStringSliceE(opts.Get(key)) + if conf.Polar.Miner.GasFloor, err = + parser.GetUint64(flagMinerGasFloor); err != nil { + return nil, err } - getTimeDuration := func(key string) (time.Duration, error) { - return cast.ToDurationE(opts.Get(key)) + if conf.Polar.Miner.GasCeil, err = + parser.GetUint64(flagMinerGasCeil); err != nil { + return nil, err } - - // Polar settings - if conf.Polar.RPCGasCap, err = getUint64(flagRPCGasCap); err != nil { - return nil, handleError(err, flagRPCGasCap) + if conf.Polar.Miner.GasPrice, err = + parser.GetBigInt(flagMinerGasPrice); err != nil { + return nil, err } - if conf.Polar.RPCEVMTimeout, err = getTimeDuration(flagRPCEvmTimeout); err != nil { - return nil, handleError(err, flagRPCEvmTimeout) + if conf.Polar.Miner.Recommit, err = + parser.GetTimeDuration(flagMinerRecommit); err != nil { + return nil, err } - if conf.Polar.RPCTxFeeCap, err = getFloat64(flagRPCTxFeeCap); err != nil { - return nil, handleError(err, flagRPCTxFeeCap) + + if conf.Polar.Miner.NewPayloadTimeout, err = + parser.GetTimeDuration(flagMinerNewPayloadTimeout); err != nil { + return nil, err } // Polar Chain settings - if conf.Polar.Chain.ChainID, err = getBigInt(flagChainID); err != nil { - return nil, handleError(err, flagChainID) + if conf.Polar.Chain.ChainID, err = + parser.GetBigInt(flagChainID); err != nil { + return nil, err } - if conf.Polar.Chain.HomesteadBlock, err = getBigInt(flagHomesteadBlock); err != nil { - return nil, handleError(err, flagHomesteadBlock) + if conf.Polar.Chain.HomesteadBlock, err = + parser.GetBigInt(flagHomesteadBlock); err != nil { + return nil, err } - if conf.Polar.Chain.DAOForkBlock, err = getBigInt(flagDAOForkBlock); err != nil { - return nil, handleError(err, flagDAOForkBlock) + if conf.Polar.Chain.DAOForkBlock, err = + parser.GetBigInt(flagDAOForkBlock); err != nil { + return nil, err } - if conf.Polar.Chain.DAOForkSupport, err = getBool(flagDAOForkSupport); err != nil { - return nil, handleError(err, flagDAOForkSupport) + if conf.Polar.Chain.DAOForkSupport, err = + parser.GetBool(flagDAOForkSupport); err != nil { + return nil, err } - if conf.Polar.Chain.EIP150Block, err = getBigInt(flagEIP150Block); err != nil { - return nil, handleError(err, flagEIP150Block) + if conf.Polar.Chain.EIP150Block, err = + parser.GetBigInt(flagEIP150Block); err != nil { + return nil, err } - if conf.Polar.Chain.EIP155Block, err = getBigInt(flagEIP155Block); err != nil { - return nil, handleError(err, flagEIP155Block) + if conf.Polar.Chain.EIP155Block, err = + parser.GetBigInt(flagEIP155Block); err != nil { + return nil, err } - if conf.Polar.Chain.EIP158Block, err = getBigInt(flagEIP158Block); err != nil { - return nil, handleError(err, flagEIP158Block) + if conf.Polar.Chain.EIP158Block, err = + parser.GetBigInt(flagEIP158Block); err != nil { + return nil, err } - if conf.Polar.Chain.ByzantiumBlock, err = getBigInt(flagByzantiumBlock); err != nil { - return nil, handleError(err, flagByzantiumBlock) + if conf.Polar.Chain.ByzantiumBlock, err = + parser.GetBigInt(flagByzantiumBlock); err != nil { + return nil, err } - if conf.Polar.Chain.ConstantinopleBlock, err = getBigInt(flagConstantinopleBlock); err != nil { - return nil, handleError(err, flagConstantinopleBlock) + if conf.Polar.Chain.ConstantinopleBlock, err = + parser.GetBigInt(flagConstantinopleBlock); err != nil { + return nil, err } - if conf.Polar.Chain.PetersburgBlock, err = getBigInt(flagPetersburgBlock); err != nil { - return nil, handleError(err, flagPetersburgBlock) + if conf.Polar.Chain.PetersburgBlock, err = + parser.GetBigInt(flagPetersburgBlock); err != nil { + return nil, err } - if conf.Polar.Chain.IstanbulBlock, err = getBigInt(flagIstanbulBlock); err != nil { - return nil, handleError(err, flagIstanbulBlock) + if conf.Polar.Chain.IstanbulBlock, err = + parser.GetBigInt(flagIstanbulBlock); err != nil { + return nil, err } - if conf.Polar.Chain.MuirGlacierBlock, err = getBigInt(flagMuirGlacierBlock); err != nil { - return nil, handleError(err, flagMuirGlacierBlock) + if conf.Polar.Chain.MuirGlacierBlock, err = + parser.GetBigInt(flagMuirGlacierBlock); err != nil { + return nil, err } - if conf.Polar.Chain.BerlinBlock, err = getBigInt(flagBerlinBlock); err != nil { - return nil, handleError(err, flagBerlinBlock) + if conf.Polar.Chain.BerlinBlock, err = + parser.GetBigInt(flagBerlinBlock); err != nil { + return nil, err } - if conf.Polar.Chain.LondonBlock, err = getBigInt(flagLondonBlock); err != nil { - return nil, handleError(err, flagLondonBlock) + if conf.Polar.Chain.LondonBlock, err = + parser.GetBigInt(flagLondonBlock); err != nil { + return nil, err } - if conf.Polar.Chain.ArrowGlacierBlock, err = getBigInt(flagArrowGlacierBlock); err != nil { - return nil, handleError(err, flagArrowGlacierBlock) + if conf.Polar.Chain.ArrowGlacierBlock, err = + parser.GetBigInt(flagArrowGlacierBlock); err != nil { + return nil, err } - if conf.Polar.Chain.GrayGlacierBlock, err = getBigInt(flagGrayGlacierBlock); err != nil { - return nil, handleError(err, flagGrayGlacierBlock) + if conf.Polar.Chain.GrayGlacierBlock, err = + parser.GetBigInt(flagGrayGlacierBlock); err != nil { + return nil, err } - if conf.Polar.Chain.MergeNetsplitBlock, err = getBigInt(flagMergeNetsplitBlock); err != nil { - return nil, handleError(err, flagMergeNetsplitBlock) + if conf.Polar.Chain.MergeNetsplitBlock, err = + parser.GetBigInt(flagMergeNetsplitBlock); err != nil { + return nil, err } - if conf.Polar.Chain.ShanghaiTime, err = getUint64Ptr(flagShanghaiTime); err != nil { - return nil, handleError(err, flagShanghaiTime) + if conf.Polar.Chain.ShanghaiTime, err = + parser.GetUint64Ptr(flagShanghaiTime); err != nil { + return nil, err } - if conf.Polar.Chain.CancunTime, err = getUint64Ptr(flagCancunTime); err != nil { - return nil, handleError(err, flagCancunTime) + if conf.Polar.Chain.CancunTime, err = + parser.GetUint64Ptr(flagCancunTime); err != nil { + return nil, err } - if conf.Polar.Chain.PragueTime, err = getUint64Ptr(flagPragueTime); err != nil { - return nil, handleError(err, flagPragueTime) + if conf.Polar.Chain.PragueTime, err = + parser.GetUint64Ptr(flagPragueTime); err != nil { + return nil, err } - if conf.Polar.Chain.VerkleTime, err = getUint64Ptr(flagVerkleTime); err != nil { - return nil, handleError(err, flagVerkleTime) + if conf.Polar.Chain.VerkleTime, err = + parser.GetUint64Ptr(flagVerkleTime); err != nil { + return nil, err } - if conf.Polar.Chain.TerminalTotalDifficulty, err = getBigInt( - flagTerminalTotalDifficulty); err != nil { - return nil, handleError(err, flagTerminalTotalDifficulty) + if conf.Polar.Chain.TerminalTotalDifficulty, err = + parser.GetBigInt( + flagTerminalTotalDifficulty); err != nil { + return nil, err } - if conf.Polar.Chain.TerminalTotalDifficultyPassed, err = getBool( - flagTerminalTotalDifficultyPassed); err != nil { - return nil, handleError(err, flagTerminalTotalDifficultyPassed) + if conf.Polar.Chain.TerminalTotalDifficultyPassed, err = + parser.GetBool( + flagTerminalTotalDifficultyPassed); err != nil { + return nil, err } - if conf.Polar.Chain.IsDevMode, err = getBool(flagIsDevMode); err != nil { - return nil, handleError(err, flagIsDevMode) + if conf.Polar.Chain.IsDevMode, err = + parser.GetBool(flagIsDevMode); err != nil { + return nil, err } // Polar.GPO settings - if conf.Polar.GPO.Blocks, err = getInt(flagBlocks); err != nil { - return nil, handleError(err, flagBlocks) + if conf.Polar.GPO.Blocks, err = + parser.GetInt(flagBlocks); err != nil { + return nil, err } - if conf.Polar.GPO.Percentile, err = getInt(flagPercentile); err != nil { - return nil, handleError(err, flagPercentile) + if conf.Polar.GPO.Percentile, err = + parser.GetInt(flagPercentile); err != nil { + return nil, err } - if conf.Polar.GPO.MaxHeaderHistory, err = getUint64(flagMaxHeaderHistory); err != nil { - return nil, handleError(err, flagMaxHeaderHistory) + if conf.Polar.GPO.MaxHeaderHistory, err = + parser.GetUint64(flagMaxHeaderHistory); err != nil { + return nil, err } - if conf.Polar.GPO.MaxBlockHistory, err = getUint64(flagMaxBlockHistory); err != nil { - return nil, handleError(err, flagMaxBlockHistory) + if conf.Polar.GPO.MaxBlockHistory, err = + parser.GetUint64(flagMaxBlockHistory); err != nil { + return nil, err } - if val, err = getInt64(flagDefault); err != nil { - return nil, handleError(err, flagDefault) + if val, err = + parser.GetInt64(flagDefault); err != nil { + return nil, err } conf.Polar.GPO.Default = big.NewInt(val) - if val, err = getInt64(flagMaxPrice); err != nil { - return nil, handleError(err, flagMaxPrice) + if val, err = + parser.GetInt64(flagMaxPrice); err != nil { + return nil, err } conf.Polar.GPO.MaxPrice = big.NewInt(val) - if val, err = getInt64(flagIgnorePrice); err != nil { - return nil, handleError(err, flagIgnorePrice) + if val, err = + parser.GetInt64(flagIgnorePrice); err != nil { + return nil, err } conf.Polar.GPO.IgnorePrice = big.NewInt(val) // LegacyPool - conf.Polar.LegacyTxPool.Locals = getCommonAddressList(flagDefault) - - if conf.Polar.LegacyTxPool.NoLocals, err = getBool(flagNoLocals); err != nil { - return nil, handleError(err, flagNoLocals) + if conf.Polar.LegacyTxPool.Locals, err = + parser.GetCommonAddressList(flagLocals); err != nil { + return nil, err + } + if conf.Polar.LegacyTxPool.NoLocals, err = + parser.GetBool(flagNoLocals); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.Journal, err = getString(flagJournal); err != nil { - return nil, handleError(err, flagJournal) + if conf.Polar.LegacyTxPool.Journal, err = + parser.GetString(flagJournal); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.Rejournal, err = getTimeDuration(flagReJournal); err != nil { - return nil, handleError(err, flagReJournal) + if conf.Polar.LegacyTxPool.Rejournal, err = + parser.GetTimeDuration(flagReJournal); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.PriceLimit, err = getUint64(flagPriceLimit); err != nil { - return nil, handleError(err, flagPriceLimit) + if conf.Polar.LegacyTxPool.PriceLimit, err = + parser.GetUint64(flagPriceLimit); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.PriceBump, err = getUint64(flagPriceBump); err != nil { - return nil, handleError(err, flagPriceBump) + if conf.Polar.LegacyTxPool.PriceBump, err = + parser.GetUint64(flagPriceBump); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.AccountSlots, err = getUint64(flagAccountSlots); err != nil { - return nil, handleError(err, flagAccountSlots) + if conf.Polar.LegacyTxPool.AccountSlots, err = + parser.GetUint64(flagAccountSlots); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.GlobalSlots, err = getUint64(flagGlobalSlots); err != nil { - return nil, handleError(err, flagGlobalSlots) + if conf.Polar.LegacyTxPool.GlobalSlots, err = + parser.GetUint64(flagGlobalSlots); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.AccountQueue, err = getUint64(flagAccountQueue); err != nil { - return nil, handleError(err, flagAccountQueue) + if conf.Polar.LegacyTxPool.AccountQueue, err = + parser.GetUint64(flagAccountQueue); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.GlobalQueue, err = getUint64(flagGlobalQueue); err != nil { - return nil, handleError(err, flagGlobalQueue) + if conf.Polar.LegacyTxPool.GlobalQueue, err = + parser.GetUint64(flagGlobalQueue); err != nil { + return nil, err } - if conf.Polar.LegacyTxPool.Lifetime, err = getTimeDuration(flagLifetime); err != nil { - return nil, handleError(err, flagLifetime) + if conf.Polar.LegacyTxPool.Lifetime, err = + parser.GetTimeDuration(flagLifetime); err != nil { + return nil, err } // Node settings - if conf.Node.Name, err = getString(flagName); err != nil { - return nil, handleError(err, flagName) + if conf.Node.Name, err = + parser.GetString(flagName); err != nil { + return nil, err } - if conf.Node.UserIdent, err = getString(flagUserIdent); err != nil { - return nil, handleError(err, flagUserIdent) + if conf.Node.UserIdent, err = + parser.GetString(flagUserIdent); err != nil { + return nil, err } - if conf.Node.Version, err = getString(flagVersion); err != nil { - return nil, handleError(err, flagVersion) + if conf.Node.Version, err = + parser.GetString(flagVersion); err != nil { + return nil, err } - if conf.Node.DataDir, err = getString(flagDataDir); err != nil { - return nil, handleError(err, flagDataDir) + if conf.Node.DataDir, err = + parser.GetString(flagDataDir); err != nil { + return nil, err } if conf.Node.DataDir == "" { - conf.Node.DataDir, err = getString(flags.FlagHome) + conf.Node.DataDir, err = + parser.GetString(flags.FlagHome) if err != nil { - return nil, handleError(err, flags.FlagHome) + return nil, err } } - if conf.Node.KeyStoreDir, err = getString(flagKeyStoreDir); err != nil { - return nil, handleError(err, flagKeyStoreDir) + if conf.Node.KeyStoreDir, err = + parser.GetString(flagKeyStoreDir); err != nil { + return nil, err } - if conf.Node.ExternalSigner, err = getString(flagExternalSigner); err != nil { - return nil, handleError(err, flagExternalSigner) + if conf.Node.ExternalSigner, err = + parser.GetString(flagExternalSigner); err != nil { + return nil, err } - if conf.Node.UseLightweightKDF, err = getBool(flagUseLightweightKdf); err != nil { - return nil, handleError(err, flagUseLightweightKdf) + if conf.Node.UseLightweightKDF, err = + parser.GetBool(flagUseLightweightKdf); err != nil { + return nil, err } - if conf.Node.InsecureUnlockAllowed, err = getBool(flagInsecureUnlockAllowed); err != nil { - return nil, handleError(err, flagInsecureUnlockAllowed) + if conf.Node.InsecureUnlockAllowed, err = + parser.GetBool(flagInsecureUnlockAllowed); err != nil { + return nil, err } - if conf.Node.USB, err = getBool(flagUsb); err != nil { - return nil, handleError(err, flagUsb) + if conf.Node.USB, err = + parser.GetBool(flagUsb); err != nil { + return nil, err } - if conf.Node.SmartCardDaemonPath, err = getString(flagSmartCardDaemonPath); err != nil { - return nil, handleError(err, flagSmartCardDaemonPath) + if conf.Node.SmartCardDaemonPath, err = + parser.GetString(flagSmartCardDaemonPath); err != nil { + return nil, err } - if conf.Node.IPCPath, err = getString(flagIpcPath); err != nil { - return nil, handleError(err, flagIpcPath) + if conf.Node.IPCPath, err = + parser.GetString(flagIpcPath); err != nil { + return nil, err } - if conf.Node.HTTPHost, err = getString(flagHTTPHost); err != nil { - return nil, handleError(err, flagHTTPHost) + if conf.Node.HTTPHost, err = + parser.GetString(flagHTTPHost); err != nil { + return nil, err } - if conf.Node.HTTPPort, err = getInt(flagHTTPPort); err != nil { - return nil, handleError(err, flagHTTPPort) + if conf.Node.HTTPPort, err = + parser.GetInt(flagHTTPPort); err != nil { + return nil, err } - if conf.Node.HTTPCors, err = getStringSlice(flagHTTPCors); err != nil { - return nil, handleError(err, flagHTTPCors) + if conf.Node.HTTPCors, err = + parser.GetStringSlice(flagHTTPCors); err != nil { + return nil, err } - if conf.Node.HTTPVirtualHosts, err = getStringSlice(flagHTTPVirtualHosts); err != nil { - return nil, handleError(err, flagHTTPVirtualHosts) + if conf.Node.HTTPVirtualHosts, err = + parser.GetStringSlice(flagHTTPVirtualHosts); err != nil { + return nil, err } - if conf.Node.HTTPModules, err = getStringSlice(flagHTTPModules); err != nil { - return nil, handleError(err, flagHTTPModules) + if conf.Node.HTTPModules, err = + parser.GetStringSlice(flagHTTPModules); err != nil { + return nil, err } - if conf.Node.HTTPPathPrefix, err = getString(flagHTTPPathPrefix); err != nil { - return nil, handleError(err, flagHTTPPathPrefix) + if conf.Node.HTTPPathPrefix, err = + parser.GetString(flagHTTPPathPrefix); err != nil { + return nil, err } - if conf.Node.AuthAddr, err = getString(flagAuthAddr); err != nil { - return nil, handleError(err, flagAuthAddr) + if conf.Node.AuthAddr, err = + parser.GetString(flagAuthAddr); err != nil { + return nil, err } - if conf.Node.AuthPort, err = getInt(flagAuthPort); err != nil { - return nil, handleError(err, flagAuthPort) + if conf.Node.AuthPort, err = + parser.GetInt(flagAuthPort); err != nil { + return nil, err } - if conf.Node.AuthVirtualHosts, err = getStringSlice(flagAuthVirtualHosts); err != nil { - return nil, handleError(err, flagAuthVirtualHosts) + if conf.Node.AuthVirtualHosts, err = + parser.GetStringSlice(flagAuthVirtualHosts); err != nil { + return nil, err } - if conf.Node.WSHost, err = getString(flagWsHost); err != nil { - return nil, handleError(err, flagWsHost) + if conf.Node.WSHost, err = + parser.GetString(flagWsHost); err != nil { + return nil, err } - if conf.Node.WSPort, err = getInt(flagWsPort); err != nil { - return nil, handleError(err, flagWsPort) + if conf.Node.WSPort, err = + parser.GetInt(flagWsPort); err != nil { + return nil, err } - if conf.Node.WSPathPrefix, err = getString(flagWsPathPrefix); err != nil { - return nil, handleError(err, flagWsPathPrefix) + if conf.Node.WSPathPrefix, err = + parser.GetString(flagWsPathPrefix); err != nil { + return nil, err } - if conf.Node.WSOrigins, err = getStringSlice(flagWsOrigins); err != nil { - return nil, handleError(err, flagWsOrigins) + if conf.Node.WSOrigins, err = + parser.GetStringSlice(flagWsOrigins); err != nil { + return nil, err } - if conf.Node.WSModules, err = getStringSlice(flagWsModules); err != nil { - return nil, handleError(err, flagWsModules) + if conf.Node.WSModules, err = + parser.GetStringSlice(flagWsModules); err != nil { + return nil, err } - if conf.Node.WSExposeAll, err = getBool(flagWsExposeAll); err != nil { - return nil, handleError(err, flagWsExposeAll) + if conf.Node.WSExposeAll, err = + parser.GetBool(flagWsExposeAll); err != nil { + return nil, err } - if conf.Node.GraphQLCors, err = getStringSlice(flagGraphqlCors); err != nil { - return nil, handleError(err, flagGraphqlCors) + if conf.Node.GraphQLCors, err = + parser.GetStringSlice(flagGraphqlCors); err != nil { + return nil, err } - if conf.Node.GraphQLVirtualHosts, err = getStringSlice(flagGraphqlVirtualHosts); err != nil { - return nil, handleError(err, flagGraphqlVirtualHosts) + if conf.Node.GraphQLVirtualHosts, err = + parser.GetStringSlice(flagGraphqlVirtualHosts); err != nil { + return nil, err } - if conf.Node.AllowUnprotectedTxs, err = getBool(flagAllowUnprotectedTxs); err != nil { - return nil, handleError(err, flagAllowUnprotectedTxs) + if conf.Node.AllowUnprotectedTxs, err = + parser.GetBool(flagAllowUnprotectedTxs); err != nil { + return nil, err } - if conf.Node.BatchRequestLimit, err = getInt(flagBatchRequestLimit); err != nil { - return nil, handleError(err, flagBatchRequestLimit) + if conf.Node.BatchRequestLimit, err = + parser.GetInt(flagBatchRequestLimit); err != nil { + return nil, err } - if conf.Node.BatchResponseMaxSize, err = getInt(flagBatchResponseMaxSize); err != nil { - return nil, handleError(err, flagBatchResponseMaxSize) + if conf.Node.BatchResponseMaxSize, err = + parser.GetInt(flagBatchResponseMaxSize); err != nil { + return nil, err } - if conf.Node.JWTSecret, err = getString(flagJwtSecret); err != nil { - return nil, handleError(err, flagJwtSecret) + if conf.Node.JWTSecret, err = + parser.GetString(flagJwtSecret); err != nil { + return nil, err } - if conf.Node.DBEngine, err = getString(flagDBEngine); err != nil { - return nil, handleError(err, flagDBEngine) + if conf.Node.DBEngine, err = + parser.GetString(flagDBEngine); err != nil { + return nil, err } // Node.HTTPTimeouts settings - if conf.Node.HTTPTimeouts.ReadTimeout, err = getTimeDuration(flagReadTimeout); err != nil { - return nil, handleError(err, flagReadTimeout) - } - if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = getTimeDuration( - flagReadHeaderTimeout); err != nil { - return nil, handleError(err, flagReadHeaderTimeout) - } - if conf.Node.HTTPTimeouts.WriteTimeout, err = getTimeDuration(flagWriteTimeout); err != nil { - return nil, handleError(err, flagWriteTimeout) - } - if conf.Node.HTTPTimeouts.IdleTimeout, err = getTimeDuration(flagIdleTimeout); err != nil { - return nil, handleError(err, flagIdleTimeout) + if conf.Node.HTTPTimeouts.ReadTimeout, err = + parser.GetTimeDuration(flagReadTimeout); err != nil { + return nil, err + } + if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = + parser.GetTimeDuration( + flagReadHeaderTimeout); err != nil { + return nil, err + } + if conf.Node.HTTPTimeouts.WriteTimeout, err = + parser.GetTimeDuration(flagWriteTimeout); err != nil { + return nil, err + } + if conf.Node.HTTPTimeouts.IdleTimeout, err = + parser.GetTimeDuration(flagIdleTimeout); err != nil { + return nil, err } return conf, nil diff --git a/cosmos/config/flags.go b/cosmos/config/flags.go index 4e6ee616a0..7c7ded0aa4 100644 --- a/cosmos/config/flags.go +++ b/cosmos/config/flags.go @@ -21,11 +21,29 @@ package config const ( - flagGraphqlVirtualHosts = "polaris.node.graphql-virtual-hosts" - flagIpcPath = "polaris.node.ipc-path" - //#nosec: G101 // not a secret. - flagJwtSecret = "polaris.node.jwt-secret" + // Polar Root. + flagRPCEvmTimeout = "polaris.polar.rpc-evm-timeout" + flagRPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" + flagRPCGasCap = "polaris.polar.rpc-gas-cap" + + // Miner. + flagMinerEtherbase = "polaris.polar.miner.etherbase" + flagMinerExtraData = "polaris.polar.miner.extra-data" + flagMinerGasFloor = "polaris.polar.miner.gas-floor" + flagMinerGasCeil = "polaris.polar.miner.gas-ceil" + flagMinerGasPrice = "polaris.polar.miner.gas-price" + flagMinerRecommit = "polaris.polar.miner.recommit" + flagMinerNewPayloadTimeout = "polaris.polar.miner.new-payload-timeout" + + // GPO. + flagBlocks = "polaris.polar.gpo.blocks" + flagMaxBlockHistory = "polaris.polar.gpo.max-block-history" + flagPercentile = "polaris.polar.gpo.percentile" + flagMaxHeaderHistory = "polaris.polar.gpo.max-header-history" + + // Node. + flagJwtSecret = "polaris.node.jwt-secret" //#nosec: G101 // not a secret. flagWsPort = "polaris.node.ws-port" flagBatchRequestLimit = "polaris.node.batch-request-limit" flagKeyStoreDir = "polaris.node.key-store-dir" @@ -33,7 +51,6 @@ const ( flagReadTimeout = "polaris.node.http-timeouts.read-timeout" flagDataDir = "polaris.node.data-dir" flagUserIdent = "polaris.node.user-ident" - flagBlocks = "polaris.polar.gpo.blocks" flagGraphqlCors = "polaris.node.graphql-cors" flagSmartCardDaemonPath = "polaris.node.smart-card-daemon-path" flagWsModules = "polaris.node.ws-modules" @@ -44,15 +61,10 @@ const ( flagHTTPHost = "polaris.node.http-host" flagUseLightweightKdf = "polaris.node.use-lightweight-kdf" flagWsExposeAll = "polaris.node.ws-expose-all" - flagMaxBlockHistory = "polaris.polar.gpo.max-block-history" - flagPercentile = "polaris.polar.gpo.percentile" flagInsecureUnlockAllowed = "polaris.node.insecure-unlock-allowed" flagWsPathPrefix = "polaris.node.ws-path-prefix" flagWsHost = "polaris.node.ws-host" flagName = "polaris.node.name" - flagRPCEvmTimeout = "polaris.polar.rpc-evm-timeout" - flagRPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" - flagRPCGasCap = "polaris.polar.rpc-gas-cap" flagAuthVirtualHosts = "polaris.node.auth-virtual-hosts" flagAuthPort = "polaris.node.auth-port" flagUsb = "polaris.node.usb" @@ -60,7 +72,6 @@ const ( flagBatchResponseMaxSize = "polaris.node.batch-response-max-size" flagVersion = "polaris.node.version" flagHTTPVirtualHosts = "polaris.node.http-virtual-hosts" - flagMaxHeaderHistory = "polaris.polar.gpo.max-header-history" flagExternalSigner = "polaris.node.external-signer" flagHTTPPathPrefix = "polaris.node.http-path-prefix" flagWriteTimeout = "polaris.node.http-timeouts.write-timeout" @@ -70,19 +81,23 @@ const ( flagDefault = "polaris.node.http-timeouts.default" flagMaxPrice = "polaris.node.http-timeouts.max-price" flagIgnorePrice = "polaris.node.http-timeouts.ignore-price" - flagLocals = "polaris.polar.legacy-tx-pool.locals" - flagNoLocals = "polaris.polar.legacy-tx-pool.no-locals" - flagJournal = "polaris.polar.legacy-tx-pool.journal" - flagReJournal = "polaris.polar.legacy-tx-pool.rejournal" - flagPriceLimit = "polaris.polar.legacy-tx-pool.price-limit" - flagPriceBump = "polaris.polar.legacy-tx-pool.price-bump" - flagAccountSlots = "polaris.polar.legacy-tx-pool.account-slots" - flagGlobalSlots = "polaris.polar.legacy-tx-pool.global-slots" - flagAccountQueue = "polaris.polar.legacy-tx-pool.account-queue" - flagGlobalQueue = "polaris.polar.legacy-tx-pool.global-queue" - flagLifetime = "polaris.polar.legacy-tx-pool.lifetime" + flagGraphqlVirtualHosts = "polaris.node.graphql-virtual-hosts" + flagIpcPath = "polaris.node.ipc-path" + + // Legacy TxPool. + flagLocals = "polaris.polar.legacy-tx-pool.locals" + flagNoLocals = "polaris.polar.legacy-tx-pool.no-locals" + flagJournal = "polaris.polar.legacy-tx-pool.journal" + flagReJournal = "polaris.polar.legacy-tx-pool.rejournal" + flagPriceLimit = "polaris.polar.legacy-tx-pool.price-limit" + flagPriceBump = "polaris.polar.legacy-tx-pool.price-bump" + flagAccountSlots = "polaris.polar.legacy-tx-pool.account-slots" + flagGlobalSlots = "polaris.polar.legacy-tx-pool.global-slots" + flagAccountQueue = "polaris.polar.legacy-tx-pool.account-queue" + flagGlobalQueue = "polaris.polar.legacy-tx-pool.global-queue" + flagLifetime = "polaris.polar.legacy-tx-pool.lifetime" - // ethereum. + // Chain Config. flagChainID = "polaris.polar.chain.chain-id" flagHomesteadBlock = "polaris.polar.chain.homestead-block" flagDAOForkBlock = "polaris.polar.chain.dao-fork-block" diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go new file mode 100644 index 0000000000..4a23fb8ab4 --- /dev/null +++ b/cosmos/config/mocks/app_options.go @@ -0,0 +1,76 @@ +// Code generated by mockery v2.35.2. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// AppOptions is an autogenerated mock type for the AppOptions type +type AppOptions struct { + mock.Mock +} + +type AppOptions_Expecter struct { + mock *mock.Mock +} + +func (_m *AppOptions) EXPECT() *AppOptions_Expecter { + return &AppOptions_Expecter{mock: &_m.Mock} +} + +// Get provides a mock function with given fields: _a0 +func (_m *AppOptions) Get(_a0 string) interface{} { + ret := _m.Called(_a0) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(string) interface{}); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + return r0 +} + +// AppOptions_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' +type AppOptions_Get_Call struct { + *mock.Call +} + +// Get is a helper method to define mock.On call +// - _a0 string +func (_e *AppOptions_Expecter) Get(_a0 interface{}) *AppOptions_Get_Call { + return &AppOptions_Get_Call{Call: _e.mock.On("Get", _a0)} +} + +func (_c *AppOptions_Get_Call) Run(run func(_a0 string)) *AppOptions_Get_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *AppOptions_Get_Call) Return(_a0 interface{}) *AppOptions_Get_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *AppOptions_Get_Call) RunAndReturn(run func(string) interface{}) *AppOptions_Get_Call { + _c.Call.Return(run) + return _c +} + +// NewAppOptions creates a new instance of AppOptions. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAppOptions(t interface { + mock.TestingT + Cleanup(func()) +}) *AppOptions { + mock := &AppOptions{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cosmos/config/parser.go b/cosmos/config/parser.go new file mode 100644 index 0000000000..274f46d973 --- /dev/null +++ b/cosmos/config/parser.go @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. +package config + +import ( + "fmt" + "math/big" + "time" + + "github.com/spf13/cast" + + servertypes "github.com/cosmos/cosmos-sdk/server/types" + + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/common/hexutil" +) + +// baseTen is for the big.Int string conversation. +const baseTen = 10 + +// AppOptions is for generating a mock. +type AppOptions interface { + servertypes.AppOptions +} + +// AppOptionsParser is a struct that holds the application options for parsing. +type AppOptionsParser struct { + servertypes.AppOptions +} + +// NewAppOptionsParser creates a new instance of AppOptionsParser with the provided +// AppOptions. +func NewAppOptionsParser(opts servertypes.AppOptions) *AppOptionsParser { + return &AppOptionsParser{opts} +} + +// GetCommonAddress returns the common.Address for the provided key. +func (c *AppOptionsParser) GetCommonAddress(key string) (common.Address, error) { + addressStr, err := c.GetString(key) + if err != nil { + return common.Address{}, err + } + if !common.IsHexAddress(addressStr) { + return common.Address{}, fmt.Errorf("invalid address: %s", addressStr) + } + return common.HexToAddress(addressStr), nil +} + +// GetCommonAddressList retrieves a list of common.Address from a configuration key. +func (c *AppOptionsParser) GetCommonAddressList(key string) ([]common.Address, error) { + addresses := make([]common.Address, 0) + addressStrs := cast.ToStringSlice(c.Get(key)) + for _, addressStr := range addressStrs { + address := common.HexToAddress(addressStr) + if !common.IsHexAddress(addressStr) { + return nil, fmt.Errorf("invalid address: %s", addressStr) + } + addresses = append(addresses, address) + } + return addresses, nil +} + +// GetHexutilBytes returns a hexutil.Bytes from a configuration key. +func (c *AppOptionsParser) GetHexutilBytes(key string) (hexutil.Bytes, error) { + bytesStr, err := c.GetString(key) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Decode(bytesStr) +} + +// GetString retrieves a string value from a configuration key. +func (c *AppOptionsParser) GetString(key string) (string, error) { + return handleError(c, cast.ToStringE, key) +} + +// GetInt retrieves an integer value from a configuration key. +func (c *AppOptionsParser) GetInt(key string) (int, error) { + return handleError(c, cast.ToIntE, key) +} + +// GetInt64 retrieves a int64 value from a configuration key. +func (c *AppOptionsParser) GetInt64(key string) (int64, error) { + return handleError(c, cast.ToInt64E, key) +} + +// GetUint64 retrieves a uint64 value from a configuration key. +func (c *AppOptionsParser) GetUint64(key string) (uint64, error) { + return handleError(c, cast.ToUint64E, key) +} + +// GetUint64Ptr retrieves a pointer to a uint64 value fro m a configuration key. +func (c *AppOptionsParser) GetUint64Ptr(key string) (*uint64, error) { + return handleErrorPtr(c, cast.ToUint64E, key) +} + +// GetBigInt retrieves a big.Int value from a configuration key. +func (c *AppOptionsParser) GetBigInt(key string) (*big.Int, error) { + return handleErrorPtr(c, handleBigInt, key) +} + +// GetFloat64 retrieves a float64 value from a configuration key. +func (c *AppOptionsParser) GetFloat64(key string) (float64, error) { + return handleError(c, cast.ToFloat64E, key) +} + +// GetBool retrieves a boolean value from a configuration key. +func (c *AppOptionsParser) GetBool(key string) (bool, error) { + return handleError(c, cast.ToBoolE, key) +} + +// GetStringSlice retrieves a slice of strings from a configuration key. +func (c *AppOptionsParser) GetStringSlice(key string) ([]string, error) { + return handleError(c, cast.ToStringSliceE, key) +} + +// GetTimeDuration retrieves a time.Duration value from a configuration key. +func (c *AppOptionsParser) GetTimeDuration(key string) (time.Duration, error) { + return handleError(c, cast.ToDurationE, key) +} + +// isNilRepresentation returns true if the provided value is "", "null" or "". +// it is used to determine when we need to initialize a nil ptr for a value to +// prevent the sdk from panicking on startup due to weird value. +func (c *AppOptionsParser) isNilRepresentation(value string) bool { + return value == "" || value == "null" || value == "" +} + +// handleError handles an error for a given flag in the AppOptionsParser. +// It attempts to cast the flag's value using the provided castFn and returns the result. +// If the cast fails, it returns an error. +func handleError[T any]( + c *AppOptionsParser, castFn func(interface{}) (T, error), flag string) (T, error) { + var val T + var err error + if val, err = castFn(c.Get(flag)); err != nil { + var t T + return t, fmt.Errorf( + "error while reading configuration: %w flag: %s", err, flag) + } + return val, nil +} + +// handleErrorPtr handles an error for a given flag in the AppOptionsParser. +// It attempts to cast the flag's value using the provided castFn and returns a pointer to +// the result. If the cast fails, it returns an error. If the flag's value is empty, +// it returns a nil pointer. +func handleErrorPtr[T any]( + c *AppOptionsParser, castFn func(interface{}) (T, error), flag string) (*T, error) { + var num string + var err error + if num, err = cast.ToStringE((c.Get(flag))); err != nil { + return nil, fmt.Errorf("error while reading string: %w flag: %s", err, flag) + } else if c.isNilRepresentation(num) { + return (*T)(nil), nil + } + var val T + if val, err = castFn(num); err != nil { + return nil, fmt.Errorf("error while converting to value: %w flag: %s", err, flag) + } + return &val, nil +} + +// handleBigInt handles a big.Int value from the given numStr interface. +// It attempts to parse the numStr as a big.Int and returns the result. +// If parsing fails, it returns an error. +func handleBigInt(numStr interface{}) (big.Int, error) { + num, ok := new(big.Int).SetString(numStr.(string), baseTen) + if !ok { + return big.Int{}, fmt.Errorf("invalid big.Int string: %s", numStr.(string)) + } + return *num, nil +} diff --git a/cosmos/config/parser_test.go b/cosmos/config/parser_test.go new file mode 100644 index 0000000000..120ea8dc83 --- /dev/null +++ b/cosmos/config/parser_test.go @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. +package config + +import ( + "math/big" + "testing" + "time" + + "pkg.berachain.dev/polaris/cosmos/config/mocks" + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/common/hexutil" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/config") +} + +var _ = Describe("Parser", func() { + var parser *AppOptionsParser + var appOpts *mocks.AppOptions + + BeforeEach(func() { + appOpts = new(mocks.AppOptions) + parser = NewAppOptionsParser(appOpts) + }) + + It("should set and retrieve a string option", func() { + value := "testValue" + runTest(appOpts, parser.GetString, value) + }) + + It("should set and retrieve an integer option", func() { + value := int(42) + runTest(appOpts, parser.GetInt, value) + }) + + It("should handle an int64 option", func() { + value := int64(42) + runTest(appOpts, parser.GetInt64, value) + }) + + It("should set and retrieve a uint64 option", func() { + value := uint64(42) + runTest(appOpts, parser.GetUint64, value) + }) + + It("should set and retrieve a pointer to a uint64 option", func() { + value := uint64(42) + runTestWithOutput(appOpts, parser.GetUint64Ptr, "42", &value) + }) + + It("should set and retrieve a big.Int option", func() { + value := new(big.Int).SetInt64(42) + runTestWithOutput(appOpts, parser.GetBigInt, "42", value) + }) + + It("should set and retrieve a float64 option", func() { + value := 3.14159 + runTest(appOpts, parser.GetFloat64, value) + }) + + It("should set and retrieve a boolean option", func() { + value := true + runTest(appOpts, parser.GetBool, value) + }) + + It("should set and retrieve a string slice option", func() { + value := []string{"apple", "banana", "cherry"} + runTest(appOpts, parser.GetStringSlice, value) + }) + + It("should set and retrieve a time.Duration option", func() { + value := time.Second * 10 + runTest(appOpts, parser.GetTimeDuration, value) + }) + + It("should set and retrieve a common.Address option", func() { + addressStr := "0x18df82c7e422a42d47345ed86b0e935e9718ebda" + runTestWithOutput( + appOpts, parser.GetCommonAddress, addressStr, common.HexToAddress(addressStr)) + }) + + It("should set and retrieve a list of common.Address options", func() { + addressStrs := []string{ + "0x20f33ce90a13a4b5e7697e3544c3083b8f8a51d4", + "0x18df82c7e422a42d47345ed86b0e935e9718ebda", + } + expectedAddresses := []common.Address{ + common.HexToAddress(addressStrs[0]), + common.HexToAddress(addressStrs[1]), + } + + // Run the test using the runTest function + runTestWithOutput( + appOpts, parser.GetCommonAddressList, addressStrs, expectedAddresses) + }) + + It("should set and retrieve a hexutil.Bytes option", func() { + bytesStr := "0x1234567890abcdef" + expectedBytes := hexutil.MustDecode(bytesStr) + + // Run the test using the runTest function + runTest(appOpts, parser.GetHexutilBytes, expectedBytes) + }) +}) + +// runTest handles testing of various types. +func runTest[A any]( + appOpts *mocks.AppOptions, parser func(string) (A, error), value A) { + runTestWithOutput(appOpts, parser, value, value) +} + +// runTest handles testing of various types. +func runTestWithOutput[A, B any]( + appOpts *mocks.AppOptions, parser func(string) (B, error), value A, output B) { + // Set the value. + appOpts.On("Get", "myTestKey").Return(value).Once() + + // Retrieve the option + retrievedValue, err := parser("myTestKey") + + Expect(err).ToNot(HaveOccurred()) + Expect(retrievedValue).To(Equal(output)) +} diff --git a/cosmos/config/template.go b/cosmos/config/template.go index 0c3bccd133..138faf761e 100644 --- a/cosmos/config/template.go +++ b/cosmos/config/template.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -//nolint:lll,cyclop // template file. +//nolint:lll // template file. package config const ( @@ -40,6 +40,7 @@ rpc-evm-timeout = "{{ .Polaris.Polar.RPCEVMTimeout }}" rpc-tx-fee-cap = "{{ .Polaris.Polar.RPCTxFeeCap }}" +# Chain config [polaris.polar.chain] chain-id = "{{ .Polaris.Polar.Chain.ChainID }}" @@ -113,6 +114,30 @@ terminal-total-difficulty-passed = "{{ .Polaris.Polar.Chain.TerminalTotalDifficu is-dev-mode = {{ .Polaris.Polar.Chain.IsDevMode }} +# Miner config +[polaris.polar.miner] +# The address to which mining rewards will be sent +etherbase = "{{.Polaris.Polar.Miner.Etherbase }}" + +# Extra data included in mined blocks +extra-data = "{{.Polaris.Polar.Miner.ExtraData }}" + +# Gas price for transactions included in blocks +gas-price = "{{.Polaris.Polar.Miner.GasPrice }}" + +# Minimum gas limit for transactions included in blocks +gas-floor = "{{.Polaris.Polar.Miner.GasFloor }}" + +# Maximum gas limit for transactions included in blocks +gas-ceil = "{{.Polaris.Polar.Miner.GasCeil }}" + +# Whether to enable recommit feature +recommit = "{{.Polaris.Polar.Miner.Recommit }}" + +# Timeout for creating a new payload +new-payload-timeout = "{{.Polaris.Polar.Miner.NewPayloadTimeout }}" + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices diff --git a/e2e/hive/clients/polard/config/app.toml b/e2e/hive/clients/polard/config/app.toml index a7615f28d7..cc91de3f25 100644 --- a/e2e/hive/clients/polard/config/app.toml +++ b/e2e/hive/clients/polard/config/app.toml @@ -240,6 +240,7 @@ rpc-evm-timeout = "5s" rpc-tx-fee-cap = "1" +# Chain config [polaris.polar.chain] chain-id = "2061" @@ -295,37 +296,61 @@ merge-netsplit-block = "0" shanghai-time = "0" # Cancun switch time (nil == no fork, 0 = already on cancun) -cancun-time = "null" +cancun-time = "" # Prague switch time (nil == no fork, 0 = already on prague) -prague-time = "null" +prague-time = "" # Verkle switch time (nil == no fork, 0 = already on verkle) -verkle-time = "null" +verkle-time = "" # Terminal total difficulty terminal-total-difficulty = "0" # Whether terminal total difficulty has passed -terminal-total-difficulty-passed = true +terminal-total-difficulty-passed = "true" # DevMode enabled is-dev-mode = false +# Miner config +[polaris.polar.miner] +# The address to which mining rewards will be sent +etherbase = "0x0000000000000000000000000000000000000000" + +# Extra data included in mined blocks +extra-data = "0x" + +# Gas price for transactions included in blocks +gas-price = "1000000000" + +# Minimum gas limit for transactions included in blocks +gas-floor = "0" + +# Maximum gas limit for transactions included in blocks +gas-ceil = "30000000" + +# Whether to enable recommit feature +recommit = "2s" + +# Timeout for creating a new payload +new-payload-timeout = "2s" + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices -blocks = 20 +blocks = "20" # Percentile of gas price to use -percentile = 60 +percentile = "60" # Maximum header history for gas price determination -max-header-history = 1024 +max-header-history = "1024" # Maximum block history for gas price determination -max-block-history = 1024 +max-block-history = "1024" # Default gas price value default = "1000000000" @@ -352,22 +377,22 @@ journal = "transactions.rlp" rejournal = "1h0m0s" # Minimum gas price to enforce for acceptance into the pool -price-limit = 1 +price-limit = "1" # Minimum price bump percentage to replace an already existing transaction (nonce) -price-bump = 10 +price-bump = "10" # Number of executable transaction slots guaranteed per account -account-slots = 16 +account-slots = "16" # Maximum number of executable transaction slots for all accounts -account-queue = 64 +account-queue = "64" # Maximum number of non-executable transaction slots permitted per account -global-slots = 5120 +global-slots = "5120" # Maximum number of non-executable transaction slots for all accounts -global-queue = 1024 +global-queue = "1024" # Maximum amount of time non-executable transaction are queued lifetime = "3h0m0s" diff --git a/e2e/precompile/polard/config/app.toml b/e2e/precompile/polard/config/app.toml index a7615f28d7..cc91de3f25 100644 --- a/e2e/precompile/polard/config/app.toml +++ b/e2e/precompile/polard/config/app.toml @@ -240,6 +240,7 @@ rpc-evm-timeout = "5s" rpc-tx-fee-cap = "1" +# Chain config [polaris.polar.chain] chain-id = "2061" @@ -295,37 +296,61 @@ merge-netsplit-block = "0" shanghai-time = "0" # Cancun switch time (nil == no fork, 0 = already on cancun) -cancun-time = "null" +cancun-time = "" # Prague switch time (nil == no fork, 0 = already on prague) -prague-time = "null" +prague-time = "" # Verkle switch time (nil == no fork, 0 = already on verkle) -verkle-time = "null" +verkle-time = "" # Terminal total difficulty terminal-total-difficulty = "0" # Whether terminal total difficulty has passed -terminal-total-difficulty-passed = true +terminal-total-difficulty-passed = "true" # DevMode enabled is-dev-mode = false +# Miner config +[polaris.polar.miner] +# The address to which mining rewards will be sent +etherbase = "0x0000000000000000000000000000000000000000" + +# Extra data included in mined blocks +extra-data = "0x" + +# Gas price for transactions included in blocks +gas-price = "1000000000" + +# Minimum gas limit for transactions included in blocks +gas-floor = "0" + +# Maximum gas limit for transactions included in blocks +gas-ceil = "30000000" + +# Whether to enable recommit feature +recommit = "2s" + +# Timeout for creating a new payload +new-payload-timeout = "2s" + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices -blocks = 20 +blocks = "20" # Percentile of gas price to use -percentile = 60 +percentile = "60" # Maximum header history for gas price determination -max-header-history = 1024 +max-header-history = "1024" # Maximum block history for gas price determination -max-block-history = 1024 +max-block-history = "1024" # Default gas price value default = "1000000000" @@ -352,22 +377,22 @@ journal = "transactions.rlp" rejournal = "1h0m0s" # Minimum gas price to enforce for acceptance into the pool -price-limit = 1 +price-limit = "1" # Minimum price bump percentage to replace an already existing transaction (nonce) -price-bump = 10 +price-bump = "10" # Number of executable transaction slots guaranteed per account -account-slots = 16 +account-slots = "16" # Maximum number of executable transaction slots for all accounts -account-queue = 64 +account-queue = "64" # Maximum number of non-executable transaction slots permitted per account -global-slots = 5120 +global-slots = "5120" # Maximum number of non-executable transaction slots for all accounts -global-queue = 1024 +global-queue = "1024" # Maximum amount of time non-executable transaction are queued lifetime = "3h0m0s" diff --git a/e2e/testapp/docker/local/config/app.toml b/e2e/testapp/docker/local/config/app.toml index a7615f28d7..cc91de3f25 100644 --- a/e2e/testapp/docker/local/config/app.toml +++ b/e2e/testapp/docker/local/config/app.toml @@ -240,6 +240,7 @@ rpc-evm-timeout = "5s" rpc-tx-fee-cap = "1" +# Chain config [polaris.polar.chain] chain-id = "2061" @@ -295,37 +296,61 @@ merge-netsplit-block = "0" shanghai-time = "0" # Cancun switch time (nil == no fork, 0 = already on cancun) -cancun-time = "null" +cancun-time = "" # Prague switch time (nil == no fork, 0 = already on prague) -prague-time = "null" +prague-time = "" # Verkle switch time (nil == no fork, 0 = already on verkle) -verkle-time = "null" +verkle-time = "" # Terminal total difficulty terminal-total-difficulty = "0" # Whether terminal total difficulty has passed -terminal-total-difficulty-passed = true +terminal-total-difficulty-passed = "true" # DevMode enabled is-dev-mode = false +# Miner config +[polaris.polar.miner] +# The address to which mining rewards will be sent +etherbase = "0x0000000000000000000000000000000000000000" + +# Extra data included in mined blocks +extra-data = "0x" + +# Gas price for transactions included in blocks +gas-price = "1000000000" + +# Minimum gas limit for transactions included in blocks +gas-floor = "0" + +# Maximum gas limit for transactions included in blocks +gas-ceil = "30000000" + +# Whether to enable recommit feature +recommit = "2s" + +# Timeout for creating a new payload +new-payload-timeout = "2s" + + # Gas price oracle settings for Polaris [polaris.polar.gpo] # Number of blocks to check for gas prices -blocks = 20 +blocks = "20" # Percentile of gas price to use -percentile = 60 +percentile = "60" # Maximum header history for gas price determination -max-header-history = 1024 +max-header-history = "1024" # Maximum block history for gas price determination -max-block-history = 1024 +max-block-history = "1024" # Default gas price value default = "1000000000" @@ -352,22 +377,22 @@ journal = "transactions.rlp" rejournal = "1h0m0s" # Minimum gas price to enforce for acceptance into the pool -price-limit = 1 +price-limit = "1" # Minimum price bump percentage to replace an already existing transaction (nonce) -price-bump = 10 +price-bump = "10" # Number of executable transaction slots guaranteed per account -account-slots = 16 +account-slots = "16" # Maximum number of executable transaction slots for all accounts -account-queue = 64 +account-queue = "64" # Maximum number of non-executable transaction slots permitted per account -global-slots = 5120 +global-slots = "5120" # Maximum number of non-executable transaction slots for all accounts -global-queue = 1024 +global-queue = "1024" # Maximum amount of time non-executable transaction are queued lifetime = "3h0m0s" diff --git a/eth/common/hexutil/imported.go b/eth/common/hexutil/imported.go index 29b7421120..86a99a4d80 100644 --- a/eth/common/hexutil/imported.go +++ b/eth/common/hexutil/imported.go @@ -29,4 +29,7 @@ type ( Uint = hexutil.Uint ) -var MustDecode = hexutil.MustDecode +var ( + MustDecode = hexutil.MustDecode + Decode = hexutil.Decode +) diff --git a/eth/core/types/transaction.rlpgen.go b/eth/core/types/transaction.rlpgen.go index c335ec137e..5006261ca3 100644 --- a/eth/core/types/transaction.rlpgen.go +++ b/eth/core/types/transaction.rlpgen.go @@ -1,8 +1,5 @@ // Code generated by rlpgen. DO NOT EDIT. -//go:build !norlpgen -// +build !norlpgen - package types import "github.com/ethereum/go-ethereum/common" diff --git a/eth/polar/config.go b/eth/polar/config.go index 66145cd7a8..e1b943f535 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/core/txpool/legacypool" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/miner" "pkg.berachain.dev/polaris/eth/params" ) @@ -45,6 +46,7 @@ func DefaultConfig() *Config { gpoConfig.Default = big.NewInt(gpoDefault) return &Config{ Chain: *params.DefaultChainConfig, + Miner: miner.DefaultConfig, GPO: gpoConfig, LegacyTxPool: legacypool.DefaultConfig, RPCGasCap: ethconfig.Defaults.RPCGasCap, @@ -58,6 +60,9 @@ type Config struct { // The chain configuration to use. Chain params.ChainConfig + // Mining options + Miner miner.Config + // Gas Price Oracle config. GPO gasprice.Config From 727f00485a2c255ded2ec01062a39edf3d9a1f6c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 5 Oct 2023 19:54:47 -0400 Subject: [PATCH 064/122] fix(statedb): `logs` index was lowkey wrong (#1183) ### Summary by CodeRabbit - New Feature: Added `IntermediateRoot` function to the `stateDB` struct for pre-Byzantium versions. - Refactor: Updated `Commit` function in `stateDB` to initialize a new log and check for errors before returning. - Refactor: Modified `Prepare` function in `stateDB` to reset `TransientStorage` for each new transaction. - Bug Fix: Updated `Copy` function in `stateDB` to handle cloning failure without panicking. - Refactor: Adjusted `AddLog` and `Finalize` methods in `logs` struct to manage log indexing using a new `logSize` field. - Refactor: Removed initialization of `m.statedb` and `m.processor` from `New` function in `miner.go` and moved it to `Prepare` function to clear out journals and other data per block. - Chore: Added a TODO comment about preparing a historical plugin in `chain_writer.go`. --- eth/core/chain_writer.go | 7 +++++++ eth/core/processor.go | 9 +++------ eth/core/state/journal/logs.go | 9 ++++++++- eth/core/state/statedb.go | 36 +++++++++++++++------------------- eth/miner/miner.go | 19 ++++++------------ 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index b26fc58b44..9abc2a311e 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -37,6 +37,13 @@ func (bc *blockchain) InsertBlock( ) error { var err error + if _, err = bc.statedb.Commit( + block.NumberU64(), + bc.cp.ChainConfig().IsEIP158(block.Header().Number), + ); err != nil { + return err + } + // TODO: prepare historical plugin here? // TBH still think we should deprecate it and run in another routine as indexer. diff --git a/eth/core/processor.go b/eth/core/processor.go index 32e0e8893b..20384f4c6f 100644 --- a/eth/core/processor.go +++ b/eth/core/processor.go @@ -159,10 +159,9 @@ func (sp *StateProcessor) Finalize( var ( // "FinalizeAndAssemble" the block with the txs and receipts (sets the TxHash, ReceiptHash, // and Bloom). - block = types.NewBlock(sp.header, sp.txs, nil, sp.receipts, trie.NewStackTrie(nil)) - hash = block.Hash() - logs []*types.Log - logIndex uint + block = types.NewBlock(sp.header, sp.txs, nil, sp.receipts, trie.NewStackTrie(nil)) + hash = block.Hash() + logs []*types.Log ) // Update the block hash in all logs since it is now available and not when the receipt/log of @@ -171,8 +170,6 @@ func (sp *StateProcessor) Finalize( receipt.BlockHash = hash for _, log := range receipt.Logs { log.BlockHash = hash - log.Index = logIndex - logIndex++ } logs = append(logs, receipt.Logs...) } diff --git a/eth/core/state/journal/logs.go b/eth/core/state/journal/logs.go index 8157bdff4a..68ccf94df8 100644 --- a/eth/core/state/journal/logs.go +++ b/eth/core/state/journal/logs.go @@ -49,6 +49,7 @@ type logs struct { baseJournal[*coretypes.Log] txHash common.Hash txIndex int + logSize int } // NewLogs returns a new `logs` journal. @@ -80,6 +81,7 @@ func (l *logs) TxIndex() int { func (l *logs) AddLog(log *coretypes.Log) { log.TxHash = l.txHash log.TxIndex = uint(l.txIndex) + log.Index = uint(l.logSize) + uint(l.Size()) l.Push(log) } @@ -108,7 +110,11 @@ func (l *logs) GetLogs(_ common.Hash, blockNumber uint64, blockHash common.Hash) // Finalize clears the journal of the tx logs. // // Finalize implements `libtypes.Controllable`. -func (l *logs) Finalize() {} +func (l *logs) Finalize() { + // increase in finalize based on the final size of the + // logs + l.logSize += l.Size() +} // Clone implements `libtypes.Cloneable`. func (l *logs) Clone() Log { @@ -116,6 +122,7 @@ func (l *logs) Clone() Log { baseJournal: newBaseJournal[*coretypes.Log](l.Capacity()), txHash: l.txHash, txIndex: l.txIndex, + logSize: l.logSize, } // copy every individual log from the journal diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index 4275d78908..823092de88 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -21,8 +21,6 @@ package state import ( - "fmt" - "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state/journal" coretypes "pkg.berachain.dev/polaris/eth/core/types" @@ -129,10 +127,18 @@ func (sdb *stateDB) Finalise(bool) { sdb.ctrl.Finalize() } +// Intermediate root is called in lieu of Finalise pre-Byzantium. They are +// equivalent at the moment in Polaris as we do not leverage the state root. +func (sdb *stateDB) IntermediateRoot(bool) common.Hash { + sdb.Finalise(true) + return common.Hash{} +} + // Commit implements vm.PolarisStateDB. -// TODO: determine sideaffects of this function. -func (sdb *stateDB) Commit(_ uint64, deleteEmptyObjects bool) (common.Hash, error) { - sdb.Finalise(deleteEmptyObjects) +func (sdb *stateDB) Commit(_ uint64, _ bool) (common.Hash, error) { + if err := sdb.Error(); err != nil { + return common.Hash{}, err + } return common.Hash{}, nil } @@ -167,6 +173,8 @@ func (sdb *stateDB) Prepare(rules params.Rules, sender, coinbase common.Address, sdb.AddAddressToAccessList(coinbase) } } + // Reset TransientStorage for the new transaction + sdb.TransientStorage = journal.NewTransientStorage() } // ============================================================================= @@ -209,18 +217,10 @@ func (sdb *stateDB) GetCodeSize(addr common.Address) int { // Copy returns a new statedb with cloned plugin and journals. func (sdb *stateDB) Copy() StateDBI { - logs := sdb.Log.Clone() - if logs == nil { - panic("failed to clone logs") - } - statedb, ok := newStateDBWithJournals( - sdb.Plugin.Clone(), sdb.pp, logs, sdb.Refund.Clone(), + return newStateDBWithJournals( + sdb.Plugin.Clone(), sdb.pp, sdb.Log.Clone(), sdb.Refund.Clone(), sdb.Accesslist.Clone(), sdb.SelfDestructs.Clone(), sdb.TransientStorage.Clone(), - ).(StateDBI) - if !ok { - panic(fmt.Sprintf("failed to clone stateDB: %T", sdb.Plugin)) - } - return statedb + ) } func (sdb *stateDB) DumpToCollector(_ DumpCollector, _ *DumpConfig) []byte { @@ -247,10 +247,6 @@ func (sdb *stateDB) StartPrefetcher(_ string) {} func (sdb *stateDB) StopPrefetcher() {} -func (sdb *stateDB) IntermediateRoot(_ bool) common.Hash { - return common.Hash{} -} - func (sdb *stateDB) StorageTrie(_ common.Address) (Trie, error) { return nil, nil } diff --git a/eth/miner/miner.go b/eth/miner/miner.go index d02925a218..58bc799b4b 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -109,10 +109,6 @@ func New(backend Backend) Miner { if m.pp == nil { m.pp = precompile.NewDefaultPlugin() } - m.statedb = state.NewStateDB(m.sp, m.pp) - m.processor = core.NewStateProcessor( - m.cp, m.pp, m.statedb, &m.vmConfig, - ) return m } @@ -172,11 +168,6 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { m.pendingHeader.MixDigest = common.Hash{} } - // TODO: we need to have header verification setup somewhere. - // if err := misc.VerifyEip1559Header(chainCfg, parent, header); err != nil { - // panic(err) - // } - // Apply EIP-1559. // TODO: Move to PrepareProposal. if chainConfig.IsLondon(m.pendingHeader.Number) { @@ -207,6 +198,12 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { m.logger.Info("preparing evm block", "seal_hash", m.pendingHeader.Hash()) + // Create new statedb and processor every block to clear out journals and stuff. + // DEPRECATED VIA 1 Block 1 Txn anyways, but works for now. + m.statedb = state.NewStateDB(m.sp, m.pp) + m.processor = core.NewStateProcessor( + m.cp, m.pp, m.statedb, &m.vmConfig, + ) var ( // TODO: we are hardcoding author to coinbase, this may be incorrect. // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. @@ -216,10 +213,6 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { ) ) - // Prepare the State Processor, StateDB and the EVM for the block. - // TODO: miner should not have a processor. Copy what dydx does in which validators and full nodes - // have different prepare and process proposals. - // Heuristic: Validators get miners. Full nodes get processors. m.processor.Prepare( vmenv, m.pendingHeader, From b363e1367899559fdb50df85ec9e912291755d8c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 5 Oct 2023 22:54:52 -0400 Subject: [PATCH 065/122] refactor(evm): Modify Precompile Manager Interface (#1188) ### Summary by CodeRabbit - Refactor: Updated the `NewHost` and `SetupPrecompiles` functions in `cosmos/x/evm/keeper/host.go` for better modularity. - New Feature: Introduced a new `Get` function in `cosmos/x/evm/plugins/precompile/plugin.go` to enhance precompile plugin functionality. - Bug Fix: Fixed error handling in `cosmos/x/evm/plugins/state/plugin.go` by renaming `savedErr` field to `dbErr`. - Refactor: Changed `statedb` field type in `eth/core/chain.go` from `vm.PolarisStateDB` to `state.StateDBI` for improved abstraction. - Refactor: Removed `ApplyTransactionWithEVM` variable in `eth/core/imported.go` and replaced it with `ApplyTransaction` for simplified transaction application. - Refactor: Updated `StateProcessor` struct in `eth/core/processor.go`, removing `evm` field and modifying `Prepare` and `ProcessTransaction` methods for enhanced performance. - Test: Modified tests in `eth/core/processor_test.go` to accommodate changes in `StateProcessor` struct. - Chore: Updated ABI and Bin fields of `CosmosTypesMetaData` variable in `contracts/bindings/cosmos/lib/cosmos_types.abigen.go`. - Refactor: Updated function signatures in various contract bindings to include additional error parameters for improved error handling. --- cosmos/config/mocks/app_options.go | 6 +- cosmos/go.mod | 3 +- cosmos/go.sum | 4 +- cosmos/txpool/mocks/geth_tx_pool.go | 16 +- cosmos/txpool/mocks/handler.go | 14 +- cosmos/txpool/mocks/lifecycle.go | 14 +- cosmos/txpool/mocks/sdk_tx.go | 14 +- cosmos/txpool/mocks/subscription.go | 14 +- cosmos/txpool/mocks/tx_broadcaster.go | 6 +- cosmos/txpool/mocks/tx_serializer.go | 10 +- cosmos/txpool/mocks/tx_sub_provider.go | 6 +- cosmos/x/evm/genesis_test.go | 3 +- cosmos/x/evm/keeper/host.go | 11 +- cosmos/x/evm/keeper/keeper.go | 11 +- cosmos/x/evm/keeper/processor_test.go | 3 +- cosmos/x/evm/plugins/precompile/plugin.go | 79 +- .../x/evm/plugins/precompile/plugin_test.go | 6 +- cosmos/x/evm/plugins/state/plugin.go | 18 +- e2e/localnet/go.mod | 3 - e2e/localnet/go.sum | 4 +- e2e/precompile/go.mod | 8 +- e2e/precompile/go.sum | 4 +- e2e/testapp/app.go | 4 +- e2e/testapp/go.mod | 3 +- e2e/testapp/go.sum | 4 +- eth/core/chain.go | 2 +- eth/core/chain_resources.go | 8 +- eth/core/chain_writer.go | 1 - eth/core/imported.go | 12 +- eth/core/mock/precompile_plugin.go | 10 - eth/core/mock/precompile_plugin.mock.go | 125 +- eth/core/precompile/default_plugin.go | 36 +- eth/core/precompile/default_plugin_test.go | 57 - eth/core/precompile/interfaces.go | 4 - eth/core/processor.go | 74 +- eth/core/processor_test.go | 68 +- eth/core/state/imported.go | 34 - eth/core/state/journal/mocks/accesslist.go | 46 +- eth/core/state/journal/mocks/log.go | 54 +- eth/core/state/journal/mocks/refund.go | 44 +- .../mocks/self_destruct_state_plugin.go | 14 +- .../state/journal/mocks/self_destructs.go | 48 +- .../state/journal/mocks/transient_storage.go | 38 +- eth/core/state/journal/selfdestructs.go | 4 +- eth/core/state/mocks/plugin.go | 122 +- eth/core/state/mocks/precompile_plugin.go | 270 +- eth/core/state/mocks/state_db.go | 2221 +++++++++++++++++ eth/core/state/statedb.go | 85 +- eth/core/state/statedb_test.go | 9 +- eth/core/types/imported.go | 19 - eth/core/vm/errors.go | 30 - eth/core/vm/imported.go | 22 +- eth/core/vm/interfaces.go | 7 +- eth/core/vm/mock/evm.go | 2 +- eth/core/vm/mock/logger.go | 65 - eth/core/vm/mock/logger.mock.go | 554 ---- eth/core/vm/mock/statedb.go | 12 +- eth/core/vm/mock/statedb.mock.go | 485 ++-- eth/go.mod | 2 +- eth/go.sum | 4 +- eth/miner/miner.go | 13 +- eth/polar/backend.go | 12 +- go.work.sum | 787 +++++- 63 files changed, 4018 insertions(+), 1650 deletions(-) delete mode 100644 eth/core/precompile/default_plugin_test.go delete mode 100644 eth/core/state/imported.go create mode 100644 eth/core/state/mocks/state_db.go delete mode 100644 eth/core/vm/errors.go delete mode 100644 eth/core/vm/mock/logger.go delete mode 100644 eth/core/vm/mock/logger.mock.go diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go index 4a23fb8ab4..330ea20b3a 100644 --- a/cosmos/config/mocks/app_options.go +++ b/cosmos/config/mocks/app_options.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// AppOptions is an autogenerated mock type for the AppOptions type +// AppOptions is an autogenerated mock type for the AppOptions type. type AppOptions struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *AppOptions) EXPECT() *AppOptions_Expecter { return &AppOptions_Expecter{mock: &_m.Mock} } -// Get provides a mock function with given fields: _a0 +// Get provides a mock function with given fields: _a0. func (_m *AppOptions) Get(_a0 string) interface{} { ret := _m.Called(_a0) @@ -33,7 +33,7 @@ func (_m *AppOptions) Get(_a0 string) interface{} { return r0 } -// AppOptions_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' +// AppOptions_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get'. type AppOptions_Get_Call struct { *mock.Call } diff --git a/cosmos/go.mod b/cosmos/go.mod index e0956f27e1..b733b27bd9 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,8 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 + // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/cosmos/go.sum b/cosmos/go.sum index a80560cd4c..27c4eaf465 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -113,8 +113,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index 5bd365e04a..e08484b46f 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -11,7 +11,7 @@ import ( types "github.com/ethereum/go-ethereum/core/types" ) -// GethTxPool is an autogenerated mock type for the GethTxPool type +// GethTxPool is an autogenerated mock type for the GethTxPool type. type GethTxPool struct { mock.Mock } @@ -24,7 +24,7 @@ func (_m *GethTxPool) EXPECT() *GethTxPool_Expecter { return &GethTxPool_Expecter{mock: &_m.Mock} } -// Add provides a mock function with given fields: _a0, _a1, _a2 +// Add provides a mock function with given fields: _a0, _a1, _a2. func (_m *GethTxPool) Add(_a0 []*types.Transaction, _a1 bool, _a2 bool) []error { ret := _m.Called(_a0, _a1, _a2) @@ -40,7 +40,7 @@ func (_m *GethTxPool) Add(_a0 []*types.Transaction, _a1 bool, _a2 bool) []error return r0 } -// GethTxPool_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' +// GethTxPool_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add'. type GethTxPool_Add_Call struct { *mock.Call } @@ -70,7 +70,7 @@ func (_c *GethTxPool_Add_Call) RunAndReturn(run func([]*types.Transaction, bool, return _c } -// Stats provides a mock function with given fields: +// Stats provides a mock function with given fields:. func (_m *GethTxPool) Stats() (int, int) { ret := _m.Called() @@ -94,12 +94,12 @@ func (_m *GethTxPool) Stats() (int, int) { return r0, r1 } -// GethTxPool_Stats_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stats' +// GethTxPool_Stats_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stats'. type GethTxPool_Stats_Call struct { *mock.Call } -// Stats is a helper method to define mock.On call +// Stats is a helper method to define mock.On call. func (_e *GethTxPool_Expecter) Stats() *GethTxPool_Stats_Call { return &GethTxPool_Stats_Call{Call: _e.mock.On("Stats")} } @@ -121,7 +121,7 @@ func (_c *GethTxPool_Stats_Call) RunAndReturn(run func() (int, int)) *GethTxPool return _c } -// SubscribeNewTxsEvent provides a mock function with given fields: _a0 +// SubscribeNewTxsEvent provides a mock function with given fields: _a0. func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Subscription { ret := _m.Called(_a0) @@ -137,7 +137,7 @@ func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Su return r0 } -// GethTxPool_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent' +// GethTxPool_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent'. type GethTxPool_SubscribeNewTxsEvent_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/handler.go b/cosmos/txpool/mocks/handler.go index 9bc76e06a5..3293b8f743 100644 --- a/cosmos/txpool/mocks/handler.go +++ b/cosmos/txpool/mocks/handler.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// Handler is an autogenerated mock type for the Handler type +// Handler is an autogenerated mock type for the Handler type. type Handler struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *Handler) EXPECT() *Handler_Expecter { return &Handler_Expecter{mock: &_m.Mock} } -// Start provides a mock function with given fields: +// Start provides a mock function with given fields:. func (_m *Handler) Start() error { ret := _m.Called() @@ -31,12 +31,12 @@ func (_m *Handler) Start() error { return r0 } -// Handler_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +// Handler_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'. type Handler_Start_Call struct { *mock.Call } -// Start is a helper method to define mock.On call +// Start is a helper method to define mock.On call. func (_e *Handler_Expecter) Start() *Handler_Start_Call { return &Handler_Start_Call{Call: _e.mock.On("Start")} } @@ -58,7 +58,7 @@ func (_c *Handler_Start_Call) RunAndReturn(run func() error) *Handler_Start_Call return _c } -// Stop provides a mock function with given fields: +// Stop provides a mock function with given fields:. func (_m *Handler) Stop() error { ret := _m.Called() @@ -72,12 +72,12 @@ func (_m *Handler) Stop() error { return r0 } -// Handler_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +// Handler_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop'. type Handler_Stop_Call struct { *mock.Call } -// Stop is a helper method to define mock.On call +// Stop is a helper method to define mock.On call. func (_e *Handler_Expecter) Stop() *Handler_Stop_Call { return &Handler_Stop_Call{Call: _e.mock.On("Stop")} } diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index 406f3c5ffc..070e1cd017 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// Lifecycle is an autogenerated mock type for the Lifecycle type +// Lifecycle is an autogenerated mock type for the Lifecycle type. type Lifecycle struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *Lifecycle) EXPECT() *Lifecycle_Expecter { return &Lifecycle_Expecter{mock: &_m.Mock} } -// Start provides a mock function with given fields: +// Start provides a mock function with given fields:. func (_m *Lifecycle) Start() error { ret := _m.Called() @@ -31,12 +31,12 @@ func (_m *Lifecycle) Start() error { return r0 } -// Lifecycle_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +// Lifecycle_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'. type Lifecycle_Start_Call struct { *mock.Call } -// Start is a helper method to define mock.On call +// Start is a helper method to define mock.On call. func (_e *Lifecycle_Expecter) Start() *Lifecycle_Start_Call { return &Lifecycle_Start_Call{Call: _e.mock.On("Start")} } @@ -58,7 +58,7 @@ func (_c *Lifecycle_Start_Call) RunAndReturn(run func() error) *Lifecycle_Start_ return _c } -// Stop provides a mock function with given fields: +// Stop provides a mock function with given fields:. func (_m *Lifecycle) Stop() error { ret := _m.Called() @@ -72,12 +72,12 @@ func (_m *Lifecycle) Stop() error { return r0 } -// Lifecycle_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +// Lifecycle_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop'. type Lifecycle_Stop_Call struct { *mock.Call } -// Stop is a helper method to define mock.On call +// Stop is a helper method to define mock.On call. func (_e *Lifecycle_Expecter) Stop() *Lifecycle_Stop_Call { return &Lifecycle_Stop_Call{Call: _e.mock.On("Stop")} } diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index 87d77fbee7..e30574591e 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -9,7 +9,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" ) -// SdkTx is an autogenerated mock type for the SdkTx type +// SdkTx is an autogenerated mock type for the SdkTx type. type SdkTx struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *SdkTx) EXPECT() *SdkTx_Expecter { return &SdkTx_Expecter{mock: &_m.Mock} } -// GetMsgs provides a mock function with given fields: +// GetMsgs provides a mock function with given fields:. func (_m *SdkTx) GetMsgs() []proto.Message { ret := _m.Called() @@ -38,12 +38,12 @@ func (_m *SdkTx) GetMsgs() []proto.Message { return r0 } -// SdkTx_GetMsgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgs' +// SdkTx_GetMsgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgs'. type SdkTx_GetMsgs_Call struct { *mock.Call } -// GetMsgs is a helper method to define mock.On call +// GetMsgs is a helper method to define mock.On call. func (_e *SdkTx_Expecter) GetMsgs() *SdkTx_GetMsgs_Call { return &SdkTx_GetMsgs_Call{Call: _e.mock.On("GetMsgs")} } @@ -65,7 +65,7 @@ func (_c *SdkTx_GetMsgs_Call) RunAndReturn(run func() []proto.Message) *SdkTx_Ge return _c } -// GetMsgsV2 provides a mock function with given fields: +// GetMsgsV2 provides a mock function with given fields:. func (_m *SdkTx) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { ret := _m.Called() @@ -91,12 +91,12 @@ func (_m *SdkTx) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { return r0, r1 } -// SdkTx_GetMsgsV2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgsV2' +// SdkTx_GetMsgsV2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgsV2'. type SdkTx_GetMsgsV2_Call struct { *mock.Call } -// GetMsgsV2 is a helper method to define mock.On call +// GetMsgsV2 is a helper method to define mock.On call. func (_e *SdkTx_Expecter) GetMsgsV2() *SdkTx_GetMsgsV2_Call { return &SdkTx_GetMsgsV2_Call{Call: _e.mock.On("GetMsgsV2")} } diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index 134e480af0..ded31dd88d 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// Subscription is an autogenerated mock type for the Subscription type +// Subscription is an autogenerated mock type for the Subscription type. type Subscription struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *Subscription) EXPECT() *Subscription_Expecter { return &Subscription_Expecter{mock: &_m.Mock} } -// Err provides a mock function with given fields: +// Err provides a mock function with given fields:. func (_m *Subscription) Err() <-chan error { ret := _m.Called() @@ -33,12 +33,12 @@ func (_m *Subscription) Err() <-chan error { return r0 } -// Subscription_Err_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Err' +// Subscription_Err_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Err'. type Subscription_Err_Call struct { *mock.Call } -// Err is a helper method to define mock.On call +// Err is a helper method to define mock.On call. func (_e *Subscription_Expecter) Err() *Subscription_Err_Call { return &Subscription_Err_Call{Call: _e.mock.On("Err")} } @@ -60,17 +60,17 @@ func (_c *Subscription_Err_Call) RunAndReturn(run func() <-chan error) *Subscrip return _c } -// Unsubscribe provides a mock function with given fields: +// Unsubscribe provides a mock function with given fields:. func (_m *Subscription) Unsubscribe() { _m.Called() } -// Subscription_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe' +// Subscription_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe'. type Subscription_Unsubscribe_Call struct { *mock.Call } -// Unsubscribe is a helper method to define mock.On call +// Unsubscribe is a helper method to define mock.On call. func (_e *Subscription_Expecter) Unsubscribe() *Subscription_Unsubscribe_Call { return &Subscription_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe")} } diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index f6798fa323..246250b3cd 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -8,7 +8,7 @@ import ( types "github.com/cosmos/cosmos-sdk/types" ) -// TxBroadcaster is an autogenerated mock type for the TxBroadcaster type +// TxBroadcaster is an autogenerated mock type for the TxBroadcaster type. type TxBroadcaster struct { mock.Mock } @@ -21,7 +21,7 @@ func (_m *TxBroadcaster) EXPECT() *TxBroadcaster_Expecter { return &TxBroadcaster_Expecter{mock: &_m.Mock} } -// BroadcastTxSync provides a mock function with given fields: txBytes +// BroadcastTxSync provides a mock function with given fields: txBytes. func (_m *TxBroadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, error) { ret := _m.Called(txBytes) @@ -47,7 +47,7 @@ func (_m *TxBroadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, err return r0, r1 } -// TxBroadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync' +// TxBroadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync'. type TxBroadcaster_BroadcastTxSync_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 6a8449633a..2ec15c0e0b 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -9,7 +9,7 @@ import ( types "github.com/ethereum/go-ethereum/core/types" ) -// TxSerializer is an autogenerated mock type for the TxSerializer type +// TxSerializer is an autogenerated mock type for the TxSerializer type. type TxSerializer struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *TxSerializer) EXPECT() *TxSerializer_Expecter { return &TxSerializer_Expecter{mock: &_m.Mock} } -// SerializeToBytes provides a mock function with given fields: signedTx +// SerializeToBytes provides a mock function with given fields: signedTx. func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, error) { ret := _m.Called(signedTx) @@ -48,7 +48,7 @@ func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, e return r0, r1 } -// TxSerializer_SerializeToBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToBytes' +// TxSerializer_SerializeToBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToBytes'. type TxSerializer_SerializeToBytes_Call struct { *mock.Call } @@ -76,7 +76,7 @@ func (_c *TxSerializer_SerializeToBytes_Call) RunAndReturn(run func(*types.Trans return _c } -// SerializeToSdkTx provides a mock function with given fields: signedTx +// SerializeToSdkTx provides a mock function with given fields: signedTx. func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sdktypes.Tx, error) { ret := _m.Called(signedTx) @@ -102,7 +102,7 @@ func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sd return r0, r1 } -// TxSerializer_SerializeToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToSdkTx' +// TxSerializer_SerializeToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToSdkTx'. type TxSerializer_SerializeToSdkTx_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index ec684dd312..6ed1da64ad 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// TxSubProvider is an autogenerated mock type for the TxSubProvider type +// TxSubProvider is an autogenerated mock type for the TxSubProvider type. type TxSubProvider struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *TxSubProvider) EXPECT() *TxSubProvider_Expecter { return &TxSubProvider_Expecter{mock: &_m.Mock} } -// SubscribeNewTxsEvent provides a mock function with given fields: ch +// SubscribeNewTxsEvent provides a mock function with given fields: ch. func (_m *TxSubProvider) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { ret := _m.Called(ch) @@ -38,7 +38,7 @@ func (_m *TxSubProvider) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event. return r0 } -// TxSubProvider_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent' +// TxSubProvider_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent'. type TxSubProvider_SubscribeNewTxsEvent_Call struct { *mock.Call } diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 78a67527f4..bc18b4d2c8 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -81,7 +81,8 @@ var _ = Describe("", func() { log.NewTestLogger(GinkgoT()), cfg, ) - k.SetupPrecompiles() + err = k.SetupPrecompiles() + Expect(err).ToNot(HaveOccurred()) am = evm.NewAppModule(k, ak) }) diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index 0a2eff5411..e835cd135b 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -47,7 +47,7 @@ var _ core.PolarisHostChain = (*host)(nil) type Host interface { core.PolarisHostChain GetAllPlugins() []any - SetupPrecompiles() + SetupPrecompiles() error } type host struct { @@ -94,7 +94,7 @@ func NewHost( // Setup the state, precompile, historical, and txpool plugins // TODO: re-enable historical plugin using ABCI listener. h.hp = historical.NewPlugin(h.cp, h.bp, nil, h.storeKey) - h.pp = precompile.NewPlugin(nil) + h.pp = precompile.NewPlugin() h.sp = state.NewPlugin(h.ak, h.storeKey, nil) h.bp.SetQueryContextFn(h.qc) h.sp.SetQueryContextFn(h.qc) @@ -103,11 +103,14 @@ func NewHost( } // SetupPrecompiles intializes the precompile contracts. -func (h *host) SetupPrecompiles() { +func (h *host) SetupPrecompiles() error { // Set the query context function for the block and state plugins pcs := h.pcs().GetPrecompiles() - h.pp.SetPrecompiles(pcs) + if err := h.pp.RegisterPrecompiles(pcs); err != nil { + return err + } h.sp.SetPrecompileLogFactory(pclog.NewFactory(pcs)) + return nil } // GetBlockPlugin returns the header plugin. diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index 67640e22b7..ff3eae577e 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -100,12 +100,13 @@ func NewKeeper( } // SetupPrecompiles initializes precompiles and the polaris node. -func (k *Keeper) SetupPrecompiles() { - k.host.SetupPrecompiles() - - if err := k.polaris.Init(); err != nil { - panic(err) +func (k *Keeper) SetupPrecompiles() error { + if err := k.host.SetupPrecompiles(); err != nil { + return err } + + // TODO: move this. + return k.polaris.Init() } // Logger returns a module-specific logger. diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index 852e1c5a36..01eb712e1b 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -103,7 +103,8 @@ var _ = Describe("Processor", func() { log.NewTestLogger(GinkgoT()), cfg, ) - k.SetupPrecompiles() + err = k.SetupPrecompiles() + Expect(err).ToNot(HaveOccurred()) ctx = ctx.WithBlockHeight(0) genState := core.DefaultGenesis Expect(k.InitGenesis(ctx, genState)).ToNot(HaveOccurred()) diff --git a/cosmos/x/evm/plugins/precompile/plugin.go b/cosmos/x/evm/plugins/precompile/plugin.go index e8fbb52610..939d3a7b09 100644 --- a/cosmos/x/evm/plugins/precompile/plugin.go +++ b/cosmos/x/evm/plugins/precompile/plugin.go @@ -21,6 +21,7 @@ package precompile import ( + "fmt" "math/big" storetypes "cosmossdk.io/store/types" @@ -42,21 +43,19 @@ import ( // Plugin is the interface that must be implemented by the plugin. type Plugin interface { core.PrecompilePlugin - SetPrecompiles([]ethprecompile.Registrable) + RegisterPrecompiles([]ethprecompile.Registrable) error } -// polarisStateDB is the interface that must be implemented by the state DB. +// PolarStateDB is the interface that must be implemented by the state DB. // The stateDB must allow retrieving the plugin in order to set it's gas config. -type polarisStateDB interface { +type PolarStateDB interface { // GetPlugin retrieves the underlying state plugin from the StateDB. GetPlugin() ethstate.Plugin } // plugin runs precompile containers in the Cosmos environment with the context gas configs. type plugin struct { - libtypes.Registry[common.Address, vm.PrecompileContainer] - // precompiles is all supported precompile contracts. - precompiles []ethprecompile.Registrable + libtypes.Registry[common.Address, vm.PrecompiledContract] // kvGasConfig is the gas config for the KV store. kvGasConfig storetypes.GasConfig // transientKVGasConfig is the gas config for the transient KV store. @@ -64,10 +63,9 @@ type plugin struct { } // NewPlugin creates and returns a plugin with the default KV store gas configs. -func NewPlugin(precompiles []ethprecompile.Registrable) Plugin { +func NewPlugin() Plugin { return &plugin{ - Registry: registry.NewMap[common.Address, vm.PrecompileContainer](), - precompiles: precompiles, + Registry: registry.NewMap[common.Address, vm.PrecompiledContract](), // NOTE: these are hardcoded as they are also hardcoded in the sdk. // This should be updated if it ever changes. kvGasConfig: storetypes.KVGasConfig(), @@ -75,24 +73,47 @@ func NewPlugin(precompiles []ethprecompile.Registrable) Plugin { } } -func (p *plugin) SetPrecompiles(precompiles []ethprecompile.Registrable) { - p.precompiles = precompiles +func (p *plugin) Get(addr common.Address, _ *params.Rules) (vm.PrecompiledContract, bool) { + // TODO: handle rules + val := p.Registry.Get(addr) + if val == nil { + return nil, false + } + return val, true } -// GetPrecompiles implements core.PrecompilePlugin. -func (p *plugin) GetPrecompiles(_ *params.Rules) []ethprecompile.Registrable { - return p.precompiles +func (p *plugin) RegisterPrecompiles(precompiles []ethprecompile.Registrable) error { + for _, pc := range precompiles { + // choose the appropriate precompile factory + var af ethprecompile.AbstractFactory + switch { + case utils.Implements[ethprecompile.StatefulImpl](pc): + af = ethprecompile.NewStatefulFactory() + case utils.Implements[ethprecompile.StatelessImpl](pc): + af = ethprecompile.NewStatelessFactory() + default: + return fmt.Errorf("unknown precompile type %T", pc) + } + // build the precompile container and register with the plugin + container, err := af.Build(pc, p) + if err != nil { + return err + } + + err = p.Register(container) + if err != nil { + return err + } + } + return nil } // GetActive implements core.PrecompilePlugin. -func (p *plugin) GetActive(rules *params.Rules) []common.Address { - defaults := ethprecompile.GetDefaultPrecompiles(rules) - active := make([]common.Address, len(p.precompiles)+len(defaults)) - for i, pc := range p.precompiles { - active[i] = pc.RegistryKey() - } - for i, pc := range defaults { - active[i+len(p.precompiles)] = pc.RegistryKey() +func (p *plugin) GetActive(_ params.Rules) []common.Address { + // TODO: enable hardfork activation and de-activation. + active := make([]common.Address, 0) + for k := range p.Registry.Iterate() { + active = append(active, k) } return active } @@ -109,7 +130,7 @@ func (p *plugin) Run( caller common.Address, value *big.Int, suppliedGas uint64, readOnly bool, ) (ret []byte, gasRemaining uint64, err error) { // get native Cosmos SDK context, MultiStore, and EventManager from the Polaris StateDB - sdb := utils.MustGetAs[vm.PolarisStateDB](evm.GetStateDB()) + sdb := utils.MustGetAs[vm.PolarStateDB](evm.GetStateDB()) ctx := sdk.UnwrapSDKContext(sdb.GetContext()) ms := utils.MustGetAs[MultiStore](ctx.MultiStore()) cem := utils.MustGetAs[state.ControllableEventManager](ctx.EventManager()) @@ -161,10 +182,10 @@ func (p *plugin) Run( // // EnableReentrancy implements core.PrecompilePlugin. func (p *plugin) EnableReentrancy(evm vm.PrecompileEVM) { - p.enableReentrancy(utils.MustGetAs[vm.PolarisStateDB](evm.GetStateDB())) + p.enableReentrancy(utils.MustGetAs[vm.PolarStateDB](evm.GetStateDB())) } -func (p *plugin) enableReentrancy(sdb vm.PolarisStateDB) { +func (p *plugin) enableReentrancy(sdb vm.PolarStateDB) { sdkCtx := sdk.UnwrapSDKContext(sdb.GetContext()) // end precompile execution => stop emitting Cosmos event as Eth logs for now @@ -173,7 +194,7 @@ func (p *plugin) enableReentrancy(sdb vm.PolarisStateDB) { // remove Cosmos gas consumption so gas is consumed only per OPCODE utils.MustGetAs[state.Plugin]( - utils.MustGetAs[polarisStateDB](sdb).GetPlugin(), + utils.MustGetAs[PolarStateDB](sdb).GetPlugin(), ).SetGasConfig(storetypes.GasConfig{}, storetypes.GasConfig{}) } @@ -181,10 +202,10 @@ func (p *plugin) enableReentrancy(sdb vm.PolarisStateDB) { // // DisableReentrancy implements core.PrecompilePlugin. func (p *plugin) DisableReentrancy(evm vm.PrecompileEVM) { - p.disableReentrancy(utils.MustGetAs[vm.PolarisStateDB](evm.GetStateDB())) + p.disableReentrancy(utils.MustGetAs[vm.PolarStateDB](evm.GetStateDB())) } -func (p *plugin) disableReentrancy(sdb vm.PolarisStateDB) { +func (p *plugin) disableReentrancy(sdb vm.PolarStateDB) { sdkCtx := sdk.UnwrapSDKContext(sdb.GetContext()) // resume precompile execution => begin emitting Cosmos event as Eth logs again @@ -193,6 +214,6 @@ func (p *plugin) disableReentrancy(sdb vm.PolarisStateDB) { // restore ctx gas configs for continuing precompile execution utils.MustGetAs[state.Plugin]( - utils.MustGetAs[polarisStateDB](sdb).GetPlugin(), + utils.MustGetAs[PolarStateDB](sdb).GetPlugin(), ).SetGasConfig(p.kvGasConfig, p.transientKVGasConfig) } diff --git a/cosmos/x/evm/plugins/precompile/plugin_test.go b/cosmos/x/evm/plugins/precompile/plugin_test.go index cf453e2263..4ed23ffd42 100644 --- a/cosmos/x/evm/plugins/precompile/plugin_test.go +++ b/cosmos/x/evm/plugins/precompile/plugin_test.go @@ -54,7 +54,7 @@ var _ = Describe("plugin", func() { ctx = ctx.WithEventManager( events.NewManagerFrom(ctx.EventManager(), mock.NewPrecompileLogFactory()), ) - p = utils.MustGetAs[*plugin](NewPlugin(nil)) + p = utils.MustGetAs[*plugin](NewPlugin()) e = &mockEVM{nil, ctx, &mockSDB{nil, ctx, 0}} }) @@ -116,12 +116,12 @@ type mockEVM struct { ms *mockSDB } -func (me *mockEVM) GetStateDB() vm.GethStateDB { +func (me *mockEVM) GetStateDB() vm.StateDB { return me.ms } type mockSDB struct { - vm.PolarisStateDB + vm.PolarStateDB ctx sdk.Context logs int } diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index dbc226d948..17b40a9629 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -110,9 +110,9 @@ type plugin struct { // getQueryContext allows for querying state a historical height. getQueryContext func() func(height int64, prove bool) (sdk.Context, error) - // savedErr stores any error that is returned from state modifications on the underlying + // dbErr stores any error that is returned from state modifications on the underlying // keepers. - savedErr error + dbErr error mu sync.Mutex } @@ -180,7 +180,7 @@ func (p *plugin) Reset(ctx context.Context) { _ = p.Controller.Register(cem) // We reset the saved error, so that we can check for errors in the next state transition. - p.savedErr = nil + p.dbErr = nil } // RegistryKey implements `libtypes.Registrable`. @@ -195,7 +195,7 @@ func (p *plugin) GetContext() context.Context { // Error implements `core.StatePlugin`. func (p *plugin) Error() error { - return p.savedErr + return p.dbErr } // =========================================================================== @@ -221,7 +221,7 @@ func (p *plugin) Exist(addr common.Address) bool { return p.ak.HasAccount(p.ctx, addr[:]) } -// Empty implements the `PolarisStateDB` interface by returning whether the state object +// Empty implements the `PolarStateDB` interface by returning whether the state object // is either non-existent or empty according to the EIP161 epecification // (balance = nonce = code = 0) // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-161.md @@ -317,7 +317,7 @@ func (p *plugin) SetNonce(addr common.Address, nonce uint64) { } if err := acc.SetSequence(nonce); err != nil { - p.savedErr = err + p.dbErr = err } p.ak.SetAccount(p.ctx, acc) @@ -378,7 +378,7 @@ func (p *plugin) IterateCode(fn func(addr common.Address, value common.Hash) boo ) defer func() { if err := it.Close(); err != nil { - p.savedErr = err + p.dbErr = err } }() @@ -445,7 +445,7 @@ func (p *plugin) IterateState(cb func(addr common.Address, key, value common.Has ) defer func() { if err := it.Close(); err != nil { - p.savedErr = err + p.dbErr = err } }() @@ -506,7 +506,7 @@ func (p *plugin) IterateBalances(fn func(common.Address, *big.Int) bool) { ) defer func() { if err := it.Close(); err != nil { - p.savedErr = err + p.dbErr = err } }() diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 4249a6e5fe..2608c527eb 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -2,9 +2,6 @@ module pkg.berachain.dev/polaris/e2e/localnet go 1.21 -// We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f - require ( github.com/docker/docker v24.0.5+incompatible github.com/ethereum/go-ethereum v1.13.1 diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 03c48ef64d..232654947e 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -107,8 +107,6 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -279,6 +277,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 8d758a8310..0ef9ce6df4 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -2,12 +2,8 @@ module pkg.berachain.dev/polaris/e2e/precompile go 1.21 -replace ( - // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f - // Required at the moment until a bug in the comsos-sdk is fixed. - github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 -) +// Required at the moment until a bug in the comsos-sdk is fixed. +replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 require ( github.com/cosmos/cosmos-sdk v0.50.0-rc.1 diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 0dd89be20f..9c7aa381a6 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -107,8 +107,6 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -279,6 +277,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index c14537047e..429ccaa1d1 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -190,7 +190,9 @@ func NewPolarisApp( app.App = appBuilder.Build(db, traceStore, baseAppOptions...) // SetupPrecompiles is used to setup the precompile contracts post depinject. - app.EVMKeeper.SetupPrecompiles() + if err := app.EVMKeeper.SetupPrecompiles(); err != nil { + panic(err) + } // Setup TxPool Wrapper app.mp = txpool.New(app.EVMKeeper.Polaris().TxPool()) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 356221287a..d1610326ed 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,8 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 + // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 13b6ced358..e9b46e70f9 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -276,8 +276,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/eth/core/chain.go b/eth/core/chain.go index 92d7d7dc58..d69844681c 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -59,7 +59,7 @@ type blockchain struct { sp StatePlugin // statedb is the state database that is used to mange state during transactions. - statedb vm.PolarisStateDB + statedb state.StateDB // vmConfig is the configuration used to create the EVM. vmConfig *vm.Config diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 0def5e1b4a..4c36a743e7 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -31,19 +31,19 @@ import ( // ChainResources is the interface that defines functions for code paths within the chain to // acquire resources to use in execution such as StateDBss and EVMss. type ChainResources interface { - StateAtBlockNumber(uint64) (state.StateDBI, error) - StateAt(root common.Hash) (state.StateDBI, error) + StateAtBlockNumber(uint64) (state.StateDB, error) + StateAt(root common.Hash) (state.StateDB, error) GetVMConfig() *vm.Config } // StateAt returns a statedb configured to read what the state of the blockchain is/was at a given. -func (bc *blockchain) StateAt(common.Hash) (state.StateDBI, error) { +func (bc *blockchain) StateAt(common.Hash) (state.StateDB, error) { return nil, errors.New("not implemented") } // StateAtBlockNumber returns a statedb configured to read what the state of the blockchain is/was // at a given block number. -func (bc *blockchain) StateAtBlockNumber(number uint64) (state.StateDBI, error) { +func (bc *blockchain) StateAtBlockNumber(number uint64) (state.StateDB, error) { sp, err := bc.sp.StateAtBlockNumber(number) if err != nil { return nil, err diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 9abc2a311e..7a07b61f55 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -36,7 +36,6 @@ func (bc *blockchain) InsertBlock( logs []*types.Log, ) error { var err error - if _, err = bc.statedb.Commit( block.NumberU64(), bc.cp.ChainConfig().IsEIP158(block.Header().Number), diff --git a/eth/core/imported.go b/eth/core/imported.go index 194a7649f6..aa906be9f2 100644 --- a/eth/core/imported.go +++ b/eth/core/imported.go @@ -33,8 +33,6 @@ type ( ChainHeadEvent = core.ChainHeadEvent // ChainSideEvent is posted when a new side block is added to the chain. ChainSideEvent = core.ChainSideEvent - // ExecutionResult is the result of executing a transaction. - ExecutionResult = core.ExecutionResult // GasPool is a pool of gas that can be consumed by transactions. GasPool = core.GasPool // NewTxsEvent is posted when a batch of transactions enter the transaction pool. @@ -46,19 +44,11 @@ type ( ) var ( - // ApplyTransactionWithEVM applies a transaction to the current state of the blockchain. - ApplyTransactionWithEVM = core.ApplyTransactionWithEVM + ApplyTransaction = core.ApplyTransaction // NewEVMTxContext creates a new context for use in the EVM. NewEVMTxContext = core.NewEVMTxContext // NewEVMBlockContext creates a new block context for a given header. NewEVMBlockContext = core.NewEVMBlockContext - // GetHashFn returns a GetHashFunc. - GetHashFn = core.GetHashFn - // TransactionToMessage converts a transaction to a message. - TransactionToMessage = core.TransactionToMessage - - Transfer = core.Transfer - CanTransfer = core.CanTransfer ) var ( diff --git a/eth/core/mock/precompile_plugin.go b/eth/core/mock/precompile_plugin.go index 7c417e6882..90b25e472d 100644 --- a/eth/core/mock/precompile_plugin.go +++ b/eth/core/mock/precompile_plugin.go @@ -21,10 +21,6 @@ package mock import ( - "github.com/ethereum/go-ethereum/params" - - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/vm" ) @@ -32,12 +28,6 @@ import ( func NewPrecompilePluginMock() *PrecompilePluginMock { return &PrecompilePluginMock{ - GetPrecompilesFunc: func(_ *params.Rules) []precompile.Registrable { - return nil - }, - GetActiveFunc: func(_ *params.Rules) []common.Address { - return nil - }, RegisterFunc: func(pc vm.PrecompileContainer) error { return nil }, diff --git a/eth/core/mock/precompile_plugin.mock.go b/eth/core/mock/precompile_plugin.mock.go index 752573ede8..cae4a68650 100644 --- a/eth/core/mock/precompile_plugin.mock.go +++ b/eth/core/mock/precompile_plugin.mock.go @@ -9,7 +9,6 @@ import ( "github.com/ethereum/go-ethereum/params" "math/big" "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/precompile" "sync" ) @@ -29,18 +28,12 @@ var _ core.PrecompilePlugin = &PrecompilePluginMock{} // EnableReentrancyFunc: func(precompileEVM vm.PrecompileEVM) { // panic("mock out the EnableReentrancy method") // }, -// GetFunc: func(addr common.Address) vm.PrecompiledContract { +// GetFunc: func(addr common.Address, rules *params.Rules) (vm.PrecompiledContract, bool) { // panic("mock out the Get method") // }, -// GetActiveFunc: func(rules *params.Rules) []common.Address { +// GetActiveFunc: func(rules params.Rules) []common.Address { // panic("mock out the GetActive method") // }, -// GetPrecompilesFunc: func(rules *params.Rules) []precompile.Registrable { -// panic("mock out the GetPrecompiles method") -// }, -// HasFunc: func(addr common.Address) bool { -// panic("mock out the Has method") -// }, // RegisterFunc: func(precompiledContract vm.PrecompiledContract) error { // panic("mock out the Register method") // }, @@ -61,16 +54,10 @@ type PrecompilePluginMock struct { EnableReentrancyFunc func(precompileEVM vm.PrecompileEVM) // GetFunc mocks the Get method. - GetFunc func(addr common.Address) vm.PrecompiledContract + GetFunc func(addr common.Address, rules *params.Rules) (vm.PrecompiledContract, bool) // GetActiveFunc mocks the GetActive method. - GetActiveFunc func(rules *params.Rules) []common.Address - - // GetPrecompilesFunc mocks the GetPrecompiles method. - GetPrecompilesFunc func(rules *params.Rules) []precompile.Registrable - - // HasFunc mocks the Has method. - HasFunc func(addr common.Address) bool + GetActiveFunc func(rules params.Rules) []common.Address // RegisterFunc mocks the Register method. RegisterFunc func(precompiledContract vm.PrecompiledContract) error @@ -94,21 +81,13 @@ type PrecompilePluginMock struct { Get []struct { // Addr is the addr argument value. Addr common.Address - } - // GetActive holds details about calls to the GetActive method. - GetActive []struct { // Rules is the rules argument value. Rules *params.Rules } - // GetPrecompiles holds details about calls to the GetPrecompiles method. - GetPrecompiles []struct { + // GetActive holds details about calls to the GetActive method. + GetActive []struct { // Rules is the rules argument value. - Rules *params.Rules - } - // Has holds details about calls to the Has method. - Has []struct { - // Addr is the addr argument value. - Addr common.Address + Rules params.Rules } // Register holds details about calls to the Register method. Register []struct { @@ -137,8 +116,6 @@ type PrecompilePluginMock struct { lockEnableReentrancy sync.RWMutex lockGet sync.RWMutex lockGetActive sync.RWMutex - lockGetPrecompiles sync.RWMutex - lockHas sync.RWMutex lockRegister sync.RWMutex lockRun sync.RWMutex } @@ -208,19 +185,21 @@ func (mock *PrecompilePluginMock) EnableReentrancyCalls() []struct { } // Get calls GetFunc. -func (mock *PrecompilePluginMock) Get(addr common.Address) vm.PrecompiledContract { +func (mock *PrecompilePluginMock) Get(addr common.Address, rules *params.Rules) (vm.PrecompiledContract, bool) { if mock.GetFunc == nil { panic("PrecompilePluginMock.GetFunc: method is nil but PrecompilePlugin.Get was just called") } callInfo := struct { - Addr common.Address + Addr common.Address + Rules *params.Rules }{ - Addr: addr, + Addr: addr, + Rules: rules, } mock.lockGet.Lock() mock.calls.Get = append(mock.calls.Get, callInfo) mock.lockGet.Unlock() - return mock.GetFunc(addr) + return mock.GetFunc(addr, rules) } // GetCalls gets all the calls that were made to Get. @@ -228,10 +207,12 @@ func (mock *PrecompilePluginMock) Get(addr common.Address) vm.PrecompiledContrac // // len(mockedPrecompilePlugin.GetCalls()) func (mock *PrecompilePluginMock) GetCalls() []struct { - Addr common.Address + Addr common.Address + Rules *params.Rules } { var calls []struct { - Addr common.Address + Addr common.Address + Rules *params.Rules } mock.lockGet.RLock() calls = mock.calls.Get @@ -240,12 +221,12 @@ func (mock *PrecompilePluginMock) GetCalls() []struct { } // GetActive calls GetActiveFunc. -func (mock *PrecompilePluginMock) GetActive(rules *params.Rules) []common.Address { +func (mock *PrecompilePluginMock) GetActive(rules params.Rules) []common.Address { if mock.GetActiveFunc == nil { panic("PrecompilePluginMock.GetActiveFunc: method is nil but PrecompilePlugin.GetActive was just called") } callInfo := struct { - Rules *params.Rules + Rules params.Rules }{ Rules: rules, } @@ -260,10 +241,10 @@ func (mock *PrecompilePluginMock) GetActive(rules *params.Rules) []common.Addres // // len(mockedPrecompilePlugin.GetActiveCalls()) func (mock *PrecompilePluginMock) GetActiveCalls() []struct { - Rules *params.Rules + Rules params.Rules } { var calls []struct { - Rules *params.Rules + Rules params.Rules } mock.lockGetActive.RLock() calls = mock.calls.GetActive @@ -271,70 +252,6 @@ func (mock *PrecompilePluginMock) GetActiveCalls() []struct { return calls } -// GetPrecompiles calls GetPrecompilesFunc. -func (mock *PrecompilePluginMock) GetPrecompiles(rules *params.Rules) []precompile.Registrable { - if mock.GetPrecompilesFunc == nil { - panic("PrecompilePluginMock.GetPrecompilesFunc: method is nil but PrecompilePlugin.GetPrecompiles was just called") - } - callInfo := struct { - Rules *params.Rules - }{ - Rules: rules, - } - mock.lockGetPrecompiles.Lock() - mock.calls.GetPrecompiles = append(mock.calls.GetPrecompiles, callInfo) - mock.lockGetPrecompiles.Unlock() - return mock.GetPrecompilesFunc(rules) -} - -// GetPrecompilesCalls gets all the calls that were made to GetPrecompiles. -// Check the length with: -// -// len(mockedPrecompilePlugin.GetPrecompilesCalls()) -func (mock *PrecompilePluginMock) GetPrecompilesCalls() []struct { - Rules *params.Rules -} { - var calls []struct { - Rules *params.Rules - } - mock.lockGetPrecompiles.RLock() - calls = mock.calls.GetPrecompiles - mock.lockGetPrecompiles.RUnlock() - return calls -} - -// Has calls HasFunc. -func (mock *PrecompilePluginMock) Has(addr common.Address) bool { - if mock.HasFunc == nil { - panic("PrecompilePluginMock.HasFunc: method is nil but PrecompilePlugin.Has was just called") - } - callInfo := struct { - Addr common.Address - }{ - Addr: addr, - } - mock.lockHas.Lock() - mock.calls.Has = append(mock.calls.Has, callInfo) - mock.lockHas.Unlock() - return mock.HasFunc(addr) -} - -// HasCalls gets all the calls that were made to Has. -// Check the length with: -// -// len(mockedPrecompilePlugin.HasCalls()) -func (mock *PrecompilePluginMock) HasCalls() []struct { - Addr common.Address -} { - var calls []struct { - Addr common.Address - } - mock.lockHas.RLock() - calls = mock.calls.Has - mock.lockHas.RUnlock() - return calls -} - // Register calls RegisterFunc. func (mock *PrecompilePluginMock) Register(precompiledContract vm.PrecompiledContract) error { if mock.RegisterFunc == nil { diff --git a/eth/core/precompile/default_plugin.go b/eth/core/precompile/default_plugin.go index 23925b7d47..8aae3102ff 100644 --- a/eth/core/precompile/default_plugin.go +++ b/eth/core/precompile/default_plugin.go @@ -51,19 +51,13 @@ func (dp *defaultPlugin) Register(vm.PrecompileContainer) error { return nil } -// GetPrecompiles implements core.PrecompilePlugin. -func (dp *defaultPlugin) GetPrecompiles(rules *params.Rules) []Registrable { - return GetDefaultPrecompiles(rules) +func (dp *defaultPlugin) Get(_ common.Address, _ *params.Rules) (vm.PrecompiledContract, bool) { + return nil, false } // GetActive implements core.PrecompilePlugin. -func (dp *defaultPlugin) GetActive(rules *params.Rules) []common.Address { - pc := dp.GetPrecompiles(rules) - active := make([]common.Address, 0, len(pc)) - for i, p := range pc { - active[i] = p.RegistryKey() - } - return active +func (dp *defaultPlugin) GetActive(_ params.Rules) []common.Address { + return nil } // Run supports executing stateless precompiles with the background context. @@ -89,25 +83,3 @@ func (dp *defaultPlugin) EnableReentrancy(vm.PrecompileEVM) {} // DisableReentrancy implements core.PrecompilePlugin. func (dp *defaultPlugin) DisableReentrancy(vm.PrecompileEVM) {} - -// GetDefaultPrecompiles returns the default set of precompiles for the given rules. -func GetDefaultPrecompiles(rules *params.Rules) []Registrable { - // Depending on the hard fork rules, we need to register a different set of precompiles. - var addrToPrecompiles map[common.Address]vm.PrecompileContainer - switch { - case rules.IsIstanbul: - addrToPrecompiles = vm.PrecompiledContractsIstanbul - case rules.IsBerlin: - addrToPrecompiles = vm.PrecompiledContractsBerlin - case rules.IsByzantium: - addrToPrecompiles = vm.PrecompiledContractsByzantium - case rules.IsHomestead: - addrToPrecompiles = vm.PrecompiledContractsHomestead - } - - allPrecompiles := make([]Registrable, 0, len(addrToPrecompiles)) - for _, precompile := range addrToPrecompiles { - allPrecompiles = append(allPrecompiles, precompile) - } - return allPrecompiles -} diff --git a/eth/core/precompile/default_plugin_test.go b/eth/core/precompile/default_plugin_test.go deleted file mode 100644 index 2062771a0d..0000000000 --- a/eth/core/precompile/default_plugin_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package precompile - -import ( - "github.com/ethereum/go-ethereum/core/vm" - - "pkg.berachain.dev/polaris/eth/common" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -//nolint:lll // test data. -const precompInput = `a8b53bdf3306a35a7103ab5504a0c9b492295564b6202b1942a84ef300107281000000000000000000000000000000000000000000000000000000000000001b307835653165303366353363653138623737326363623030393366663731663366353366356337356237346463623331613835616138623838393262346538621122334455667788991011121314151617181920212223242526272829303132` - -var _ = Describe("Default Plugin", func() { - var dp Plugin - - BeforeEach(func() { - dp = NewDefaultPlugin() - }) - - When("running a stateless contract", func() { - It("should run out of gas", func() { - ret, remainingGas, err := dp.Run(nil, &mockStateless{}, nil, common.Address{}, nil, 5, false) - Expect(ret).To(BeNil()) - Expect(remainingGas).To(Equal(uint64(0))) - Expect(err.Error()).To(Equal("out of gas")) - }) - - It("should run a geth contract", func() { - pc := vm.PrecompiledContractsHomestead[common.BytesToAddress([]byte{1})] - _, remainingGas, err := dp.Run(nil, pc, []byte(precompInput), common.Address{}, nil, 3000, true) - Expect(remainingGas).To(Equal(uint64(0))) - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/eth/core/precompile/interfaces.go b/eth/core/precompile/interfaces.go index ea7a8e2afa..ff379538b6 100644 --- a/eth/core/precompile/interfaces.go +++ b/eth/core/precompile/interfaces.go @@ -24,7 +24,6 @@ import ( "pkg.berachain.dev/polaris/eth/accounts/abi" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/vm" - "pkg.berachain.dev/polaris/eth/params" libtypes "pkg.berachain.dev/polaris/lib/types" ) @@ -35,9 +34,6 @@ type ( Plugin interface { // PrecompileManager is the manager for the native precompiles. vm.PrecompileManager - - // GetPrecompiles returns the native precompiles for the chain. - GetPrecompiles(rules *params.Rules) []Registrable // Register registers a new precompiled contract at the given address. Register(vm.PrecompileContainer) error diff --git a/eth/core/processor.go b/eth/core/processor.go index 20384f4c6f..b919729fab 100644 --- a/eth/core/processor.go +++ b/eth/core/processor.go @@ -22,17 +22,14 @@ package core import ( "context" - "fmt" "sync" "github.com/ethereum/go-ethereum/trie" "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" errorslib "pkg.berachain.dev/polaris/lib/errors" - "pkg.berachain.dev/polaris/lib/utils" ) // initialTxsCapacity is the initial capacity of the transactions and receipts slice. @@ -54,11 +51,8 @@ type StateProcessor struct { // extract the underlying message from a transaction object in `ProcessTransaction`. signer types.Signer - // evm is the EVM that is used to process transactions. We re-use a single EVM for processing - // the entire block. This is done in order to reduce memory allocs. - evm *vm.GethEVM // statedb is the state database that is used to mange state during transactions. - statedb vm.PolarisStateDB + statedb vm.PolarStateDB // vmConfig is the configuration for the EVM. vmConfig *vm.Config @@ -76,7 +70,7 @@ type StateProcessor struct { func NewStateProcessor( cp ConfigurationPlugin, pp PrecompilePlugin, - statedb vm.PolarisStateDB, + statedb vm.PolarStateDB, vmConfig *vm.Config, ) *StateProcessor { sp := &StateProcessor{ @@ -95,7 +89,7 @@ func NewStateProcessor( // ============================================================================== // Prepare prepares the state processor for processing a block. -func (sp *StateProcessor) Prepare(evm *vm.GethEVM, header *types.Header) { +func (sp *StateProcessor) Prepare(header *types.Header) { // We lock the state processor as a safety measure to ensure that Prepare is not called again // before finalize. sp.mtx.Lock() @@ -110,32 +104,20 @@ func (sp *StateProcessor) Prepare(evm *vm.GethEVM, header *types.Header) { // increased. chainConfig := sp.cp.ChainConfig() sp.signer = types.MakeSigner(chainConfig, sp.header.Number, sp.header.Time) - - // Setup the EVM for this block. - rules := chainConfig.Rules(sp.header.Number, true, sp.header.Time) - - // We re-register the default geth precompiles every block, this isn't optimal, but since - // *technically* the precompiles change based on the chain config rules, to be fully correct, - // we should check every block. - sp.BuildAndRegisterPrecompiles(precompile.GetDefaultPrecompiles(&rules)) - sp.BuildAndRegisterPrecompiles(sp.pp.GetPrecompiles(&rules)) - sp.evm = evm } // ProcessTransaction applies a transaction to the current state of the blockchain. func (sp *StateProcessor) ProcessTransaction( - _ context.Context, gasPool *GasPool, tx *types.Transaction, + _ context.Context, chainContext ChainContext, gasPool *GasPool, tx *types.Transaction, ) (*types.Receipt, error) { // Set the transaction context in the state database. // This clears the logs and sets the transaction info. sp.statedb.SetTxContext(tx.Hash(), len(sp.txs)) // Inshallah we will be able to apply the transaction. - receipt, err := ApplyTransactionWithEVM( - sp.evm, sp.cp.ChainConfig(), gasPool, sp.statedb, - sp.header, tx, &sp.header.GasUsed, - ) - + receipt, err := ApplyTransaction( + sp.cp.ChainConfig(), chainContext, &sp.header.Coinbase, gasPool, sp.statedb, + sp.header, tx, &sp.header.GasUsed, *sp.vmConfig) if err != nil { return nil, errorslib.Wrapf(err, "could not apply transaction [%s]", tx.Hash().Hex()) } @@ -177,45 +159,3 @@ func (sp *StateProcessor) Finalize( // We return a new block with the updated header and the receipts to the `blockchain`. return block, sp.receipts, logs, nil } - -// =========================================================================== -// Utilities -// =========================================================================== - -// BuildAndRegisterPrecompiles builds the given precompiles and registers them with the precompile -// plugin. -// TODO: move precompile registration out of the state processor? -func (sp *StateProcessor) BuildAndRegisterPrecompiles(precompiles []precompile.Registrable) { - for _, pc := range precompiles { - // skip registering precompiles that are already registered. - if sp.pp.Has(pc.RegistryKey()) { - continue - } - - // choose the appropriate precompile factory - var af precompile.AbstractFactory - switch { - case utils.Implements[precompile.StatefulImpl](pc): - af = precompile.NewStatefulFactory() - case utils.Implements[precompile.StatelessImpl](pc): - af = precompile.NewStatelessFactory() - default: - panic( - fmt.Sprintf( - "native precompile %s not properly implemented", pc.RegistryKey().Hex(), - ), - ) - } - - // build the precompile container and register with the plugin - container, err := af.Build(pc, sp.pp) - if err != nil { - panic(err) - } - // TODO: set code on the statedb for every precompiled contract. - err = sp.pp.Register(container) - if err != nil { - panic(err) - } - } -} diff --git a/eth/core/processor_test.go b/eth/core/processor_test.go index 6c435ff60c..c370af41a5 100644 --- a/eth/core/processor_test.go +++ b/eth/core/processor_test.go @@ -24,6 +24,8 @@ import ( "context" "math/big" + "github.com/ethereum/go-ethereum/consensus" + bindings "pkg.berachain.dev/polaris/contracts/bindings/testing" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" @@ -46,9 +48,10 @@ var ( _ = signer blockGasLimit = 10000000 dummyHeader = &types.Header{ - Number: big.NewInt(1), - BaseFee: big.NewInt(1), - GasLimit: uint64(blockGasLimit), + Number: big.NewInt(1), + BaseFee: big.NewInt(1), + GasLimit: uint64(blockGasLimit), + Difficulty: big.NewInt(0), } legacyTxData = &types.LegacyTx{ Nonce: 0, @@ -61,12 +64,11 @@ var ( var _ = Describe("StateProcessor", func() { var ( - sdb *vmmock.PolarisStateDBMock + sdb *vmmock.PolarStateDBMock bp *mock.BlockPluginMock cp *mock.ConfigurationPluginMock pp *mock.PrecompilePluginMock sp *core.StateProcessor - evm *vm.GethEVM ) BeforeEach(func() { @@ -75,20 +77,21 @@ var _ = Describe("StateProcessor", func() { bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) } - pp.HasFunc = func(addr common.Address) bool { - return false + sdb.GetPrecompileManagerFunc = func() any { + return pp + } + sdb.TxIndexFunc = func() int { + return 0 + } + pp.GetActiveFunc = func(params.Rules) []common.Address { + return []common.Address{} + } + pp.GetFunc = func(common.Address, *params.Rules) (vm.PrecompiledContract, bool) { + return nil, false } - sdb.SetTxContextFunc = func(thash common.Hash, ti int) {} - sdb.TxIndexFunc = func() int { return 0 } sp = core.NewStateProcessor(cp, pp, sdb, &vm.Config{}) Expect(sp).ToNot(BeNil()) - evm = vm.NewGethEVMWithPrecompiles( - vm.BlockContext{ - Transfer: core.Transfer, - CanTransfer: core.CanTransfer, - }, vm.TxContext{}, sdb, cp.ChainConfig(), vm.Config{}, pp, - ) - sp.Prepare(evm, dummyHeader) + sp.Prepare(dummyHeader) }) Context("Empty block", func() { @@ -105,12 +108,13 @@ var _ = Describe("StateProcessor", func() { BeforeEach(func() { _, _, _, err := sp.Finalize(context.Background()) Expect(err).ToNot(HaveOccurred()) - sp.Prepare(evm, dummyHeader) + sp.Prepare(dummyHeader) }) It("should error on an unsigned transaction", func() { gasPool := new(core.GasPool).AddGas(1000002) - receipt, err := sp.ProcessTransaction(context.Background(), gasPool, types.NewTx(legacyTxData)) + receipt, err := sp.ProcessTransaction( + context.Background(), &mockChainContext{}, gasPool, types.NewTx(legacyTxData)) Expect(err).To(HaveOccurred()) Expect(receipt).To(BeNil()) block, receipts, logs, err := sp.Finalize(context.Background()) @@ -125,9 +129,9 @@ var _ = Describe("StateProcessor", func() { sdb.GetBalanceFunc = func(addr common.Address) *big.Int { return big.NewInt(1000001) } - sdb.FinaliseFunc = func(bool) {} gasPool := new(core.GasPool).AddGas(1000002) - result, err := sp.ProcessTransaction(context.Background(), gasPool, signedTx) + result, err := sp.ProcessTransaction( + context.Background(), &mockChainContext{}, gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) Expect(result).ToNot(BeNil()) Expect(result.Status).To(Equal(uint64(1))) @@ -153,17 +157,18 @@ var _ = Describe("StateProcessor", func() { if addr != dummyContract { return common.Hash{} } - return crypto.Keccak256Hash(common.Hex2Bytes(bindings.PrecompileConstructorMetaData.Bin)) + return crypto.Keccak256Hash( + common.Hex2Bytes(bindings.PrecompileConstructorMetaData.Bin)) } sdb.ExistFunc = func(addr common.Address) bool { return addr == dummyContract } - sdb.FinaliseFunc = func(bool) {} legacyTxData.To = nil legacyTxData.Value = new(big.Int) signedTx := types.MustSignNewTx(key, signer, legacyTxData) gasPool := new(core.GasPool).AddGas(1000002) - result, err := sp.ProcessTransaction(context.Background(), gasPool, signedTx) + result, err := sp.ProcessTransaction( + context.Background(), &mockChainContext{}, gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) Expect(result).ToNot(BeNil()) Expect(result.Status).To(Equal(uint64(1))) @@ -172,7 +177,8 @@ var _ = Describe("StateProcessor", func() { legacyTxData.To = &dummyContract signedTx = types.MustSignNewTx(key, signer, legacyTxData) gasPool = new(core.GasPool).AddGas(1000002) - result, err = sp.ProcessTransaction(context.Background(), gasPool, signedTx) + result, err = sp.ProcessTransaction( + context.Background(), &mockChainContext{}, gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) Expect(result).ToNot(BeNil()) Expect(result.Status).To(Equal(uint64(1))) @@ -194,9 +200,21 @@ var _ = Describe("No precompile plugin provided", func() { } sp := core.NewStateProcessor(cp, pp, vmmock.NewEmptyStateDB(), &vm.Config{}) Expect(func() { - sp.Prepare(nil, &types.Header{ + sp.Prepare(&types.Header{ GasLimit: uint64(blockGasLimit), }) }).ToNot(Panic()) }) }) + +type mockChainContext struct{} + +// Engine retrieves the chain's consensus engine. +func (mockChainContext) Engine() consensus.Engine { + return nil +} + +// GetHeader returns the header corresponding to the hash/number argument pair. +func (mockChainContext) GetHeader(common.Hash, uint64) *types.Header { + return nil +} diff --git a/eth/core/state/imported.go b/eth/core/state/imported.go deleted file mode 100644 index f5ecbf8484..0000000000 --- a/eth/core/state/imported.go +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package state - -import "github.com/ethereum/go-ethereum/core/state" - -type ( - Dump = state.Dump - DumpCollector = state.DumpCollector - DumpConfig = state.DumpConfig - IteratorDump = state.IteratorDump - Database = state.Database - Trie = state.Trie - StateDBI = state.StateDBI //nolint:revive // vibes. - StateObject = state.StateObject //nolint:revive // vibes. -) diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 257ab722b4..6821066c60 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// Accesslist is an autogenerated mock type for the Accesslist type +// Accesslist is an autogenerated mock type for the Accesslist type. type Accesslist struct { mock.Mock } @@ -22,12 +22,12 @@ func (_m *Accesslist) EXPECT() *Accesslist_Expecter { return &Accesslist_Expecter{mock: &_m.Mock} } -// AddAddressToAccessList provides a mock function with given fields: _a0 +// AddAddressToAccessList provides a mock function with given fields: _a0. func (_m *Accesslist) AddAddressToAccessList(_a0 common.Address) { _m.Called(_a0) } -// Accesslist_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList' +// Accesslist_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList'. type Accesslist_AddAddressToAccessList_Call struct { *mock.Call } @@ -55,12 +55,12 @@ func (_c *Accesslist_AddAddressToAccessList_Call) RunAndReturn(run func(common.A return _c } -// AddSlotToAccessList provides a mock function with given fields: _a0, _a1 +// AddSlotToAccessList provides a mock function with given fields: _a0, _a1. func (_m *Accesslist) AddSlotToAccessList(_a0 common.Address, _a1 common.Hash) { _m.Called(_a0, _a1) } -// Accesslist_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList' +// Accesslist_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList'. type Accesslist_AddSlotToAccessList_Call struct { *mock.Call } @@ -89,7 +89,7 @@ func (_c *Accesslist_AddSlotToAccessList_Call) RunAndReturn(run func(common.Addr return _c } -// AddressInAccessList provides a mock function with given fields: _a0 +// AddressInAccessList provides a mock function with given fields: _a0. func (_m *Accesslist) AddressInAccessList(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -103,7 +103,7 @@ func (_m *Accesslist) AddressInAccessList(_a0 common.Address) bool { return r0 } -// Accesslist_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList' +// Accesslist_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList'. type Accesslist_AddressInAccessList_Call struct { *mock.Call } @@ -131,7 +131,7 @@ func (_c *Accesslist_AddressInAccessList_Call) RunAndReturn(run func(common.Addr return _c } -// Clone provides a mock function with given fields: +// Clone provides a mock function with given fields:. func (_m *Accesslist) Clone() journal.Accesslist { ret := _m.Called() @@ -147,12 +147,12 @@ func (_m *Accesslist) Clone() journal.Accesslist { return r0 } -// Accesslist_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +// Accesslist_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. type Accesslist_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call +// Clone is a helper method to define mock.On call. func (_e *Accesslist_Expecter) Clone() *Accesslist_Clone_Call { return &Accesslist_Clone_Call{Call: _e.mock.On("Clone")} } @@ -174,17 +174,17 @@ func (_c *Accesslist_Clone_Call) RunAndReturn(run func() journal.Accesslist) *Ac return _c } -// Finalize provides a mock function with given fields: +// Finalize provides a mock function with given fields:. func (_m *Accesslist) Finalize() { _m.Called() } -// Accesslist_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +// Accesslist_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. type Accesslist_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call +// Finalize is a helper method to define mock.On call. func (_e *Accesslist_Expecter) Finalize() *Accesslist_Finalize_Call { return &Accesslist_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -206,7 +206,7 @@ func (_c *Accesslist_Finalize_Call) RunAndReturn(run func()) *Accesslist_Finaliz return _c } -// RegistryKey provides a mock function with given fields: +// RegistryKey provides a mock function with given fields:. func (_m *Accesslist) RegistryKey() string { ret := _m.Called() @@ -220,12 +220,12 @@ func (_m *Accesslist) RegistryKey() string { return r0 } -// Accesslist_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +// Accesslist_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. type Accesslist_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call +// RegistryKey is a helper method to define mock.On call. func (_e *Accesslist_Expecter) RegistryKey() *Accesslist_RegistryKey_Call { return &Accesslist_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -247,12 +247,12 @@ func (_c *Accesslist_RegistryKey_Call) RunAndReturn(run func() string) *Accessli return _c } -// RevertToSnapshot provides a mock function with given fields: _a0 +// RevertToSnapshot provides a mock function with given fields: _a0. func (_m *Accesslist) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Accesslist_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +// Accesslist_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. type Accesslist_RevertToSnapshot_Call struct { *mock.Call } @@ -280,7 +280,7 @@ func (_c *Accesslist_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Accessl return _c } -// SlotInAccessList provides a mock function with given fields: _a0, _a1 +// SlotInAccessList provides a mock function with given fields: _a0, _a1. func (_m *Accesslist) SlotInAccessList(_a0 common.Address, _a1 common.Hash) (bool, bool) { ret := _m.Called(_a0, _a1) @@ -304,7 +304,7 @@ func (_m *Accesslist) SlotInAccessList(_a0 common.Address, _a1 common.Hash) (boo return r0, r1 } -// Accesslist_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList' +// Accesslist_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList'. type Accesslist_SlotInAccessList_Call struct { *mock.Call } @@ -333,7 +333,7 @@ func (_c *Accesslist_SlotInAccessList_Call) RunAndReturn(run func(common.Address return _c } -// Snapshot provides a mock function with given fields: +// Snapshot provides a mock function with given fields:. func (_m *Accesslist) Snapshot() int { ret := _m.Called() @@ -347,12 +347,12 @@ func (_m *Accesslist) Snapshot() int { return r0 } -// Accesslist_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +// Accesslist_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. type Accesslist_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call +// Snapshot is a helper method to define mock.On call. func (_e *Accesslist_Expecter) Snapshot() *Accesslist_Snapshot_Call { return &Accesslist_Snapshot_Call{Call: _e.mock.On("Snapshot")} } diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index ae16a6e5e0..a78ba40092 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -11,7 +11,7 @@ import ( types "github.com/ethereum/go-ethereum/core/types" ) -// Log is an autogenerated mock type for the Log type +// Log is an autogenerated mock type for the Log type. type Log struct { mock.Mock } @@ -24,12 +24,12 @@ func (_m *Log) EXPECT() *Log_Expecter { return &Log_Expecter{mock: &_m.Mock} } -// AddLog provides a mock function with given fields: _a0 +// AddLog provides a mock function with given fields: _a0. func (_m *Log) AddLog(_a0 *types.Log) { _m.Called(_a0) } -// Log_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog' +// Log_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog'. type Log_AddLog_Call struct { *mock.Call } @@ -57,7 +57,7 @@ func (_c *Log_AddLog_Call) RunAndReturn(run func(*types.Log)) *Log_AddLog_Call { return _c } -// Clone provides a mock function with given fields: +// Clone provides a mock function with given fields:. func (_m *Log) Clone() journal.Log { ret := _m.Called() @@ -73,12 +73,12 @@ func (_m *Log) Clone() journal.Log { return r0 } -// Log_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +// Log_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. type Log_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call +// Clone is a helper method to define mock.On call. func (_e *Log_Expecter) Clone() *Log_Clone_Call { return &Log_Clone_Call{Call: _e.mock.On("Clone")} } @@ -100,17 +100,17 @@ func (_c *Log_Clone_Call) RunAndReturn(run func() journal.Log) *Log_Clone_Call { return _c } -// Finalize provides a mock function with given fields: +// Finalize provides a mock function with given fields:. func (_m *Log) Finalize() { _m.Called() } -// Log_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +// Log_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. type Log_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call +// Finalize is a helper method to define mock.On call. func (_e *Log_Expecter) Finalize() *Log_Finalize_Call { return &Log_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -132,7 +132,7 @@ func (_c *Log_Finalize_Call) RunAndReturn(run func()) *Log_Finalize_Call { return _c } -// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash +// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash. func (_m *Log) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { ret := _m.Called(hash, blockNumber, blockHash) @@ -148,7 +148,7 @@ func (_m *Log) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Ha return r0 } -// Log_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs' +// Log_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs'. type Log_GetLogs_Call struct { *mock.Call } @@ -178,7 +178,7 @@ func (_c *Log_GetLogs_Call) RunAndReturn(run func(common.Hash, uint64, common.Ha return _c } -// Logs provides a mock function with given fields: +// Logs provides a mock function with given fields:. func (_m *Log) Logs() []*types.Log { ret := _m.Called() @@ -194,12 +194,12 @@ func (_m *Log) Logs() []*types.Log { return r0 } -// Log_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs' +// Log_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs'. type Log_Logs_Call struct { *mock.Call } -// Logs is a helper method to define mock.On call +// Logs is a helper method to define mock.On call. func (_e *Log_Expecter) Logs() *Log_Logs_Call { return &Log_Logs_Call{Call: _e.mock.On("Logs")} } @@ -221,7 +221,7 @@ func (_c *Log_Logs_Call) RunAndReturn(run func() []*types.Log) *Log_Logs_Call { return _c } -// RegistryKey provides a mock function with given fields: +// RegistryKey provides a mock function with given fields:. func (_m *Log) RegistryKey() string { ret := _m.Called() @@ -235,12 +235,12 @@ func (_m *Log) RegistryKey() string { return r0 } -// Log_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +// Log_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. type Log_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call +// RegistryKey is a helper method to define mock.On call. func (_e *Log_Expecter) RegistryKey() *Log_RegistryKey_Call { return &Log_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -262,12 +262,12 @@ func (_c *Log_RegistryKey_Call) RunAndReturn(run func() string) *Log_RegistryKey return _c } -// RevertToSnapshot provides a mock function with given fields: _a0 +// RevertToSnapshot provides a mock function with given fields: _a0. func (_m *Log) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Log_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +// Log_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. type Log_RevertToSnapshot_Call struct { *mock.Call } @@ -295,12 +295,12 @@ func (_c *Log_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Log_RevertToSn return _c } -// SetTxContext provides a mock function with given fields: thash, ti +// SetTxContext provides a mock function with given fields: thash, ti. func (_m *Log) SetTxContext(thash common.Hash, ti int) { _m.Called(thash, ti) } -// Log_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext' +// Log_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext'. type Log_SetTxContext_Call struct { *mock.Call } @@ -329,7 +329,7 @@ func (_c *Log_SetTxContext_Call) RunAndReturn(run func(common.Hash, int)) *Log_S return _c } -// Snapshot provides a mock function with given fields: +// Snapshot provides a mock function with given fields:. func (_m *Log) Snapshot() int { ret := _m.Called() @@ -343,12 +343,12 @@ func (_m *Log) Snapshot() int { return r0 } -// Log_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +// Log_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. type Log_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call +// Snapshot is a helper method to define mock.On call. func (_e *Log_Expecter) Snapshot() *Log_Snapshot_Call { return &Log_Snapshot_Call{Call: _e.mock.On("Snapshot")} } @@ -370,7 +370,7 @@ func (_c *Log_Snapshot_Call) RunAndReturn(run func() int) *Log_Snapshot_Call { return _c } -// TxIndex provides a mock function with given fields: +// TxIndex provides a mock function with given fields:. func (_m *Log) TxIndex() int { ret := _m.Called() @@ -384,12 +384,12 @@ func (_m *Log) TxIndex() int { return r0 } -// Log_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex' +// Log_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex'. type Log_TxIndex_Call struct { *mock.Call } -// TxIndex is a helper method to define mock.On call +// TxIndex is a helper method to define mock.On call. func (_e *Log_Expecter) TxIndex() *Log_TxIndex_Call { return &Log_TxIndex_Call{Call: _e.mock.On("TxIndex")} } diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index a1799e851f..e2d21b0268 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -7,7 +7,7 @@ import ( journal "pkg.berachain.dev/polaris/eth/core/state/journal" ) -// Refund is an autogenerated mock type for the Refund type +// Refund is an autogenerated mock type for the Refund type. type Refund struct { mock.Mock } @@ -20,12 +20,12 @@ func (_m *Refund) EXPECT() *Refund_Expecter { return &Refund_Expecter{mock: &_m.Mock} } -// AddRefund provides a mock function with given fields: gas +// AddRefund provides a mock function with given fields: gas. func (_m *Refund) AddRefund(gas uint64) { _m.Called(gas) } -// Refund_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund' +// Refund_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund'. type Refund_AddRefund_Call struct { *mock.Call } @@ -53,7 +53,7 @@ func (_c *Refund_AddRefund_Call) RunAndReturn(run func(uint64)) *Refund_AddRefun return _c } -// Clone provides a mock function with given fields: +// Clone provides a mock function with given fields:. func (_m *Refund) Clone() journal.Refund { ret := _m.Called() @@ -69,12 +69,12 @@ func (_m *Refund) Clone() journal.Refund { return r0 } -// Refund_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +// Refund_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. type Refund_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call +// Clone is a helper method to define mock.On call. func (_e *Refund_Expecter) Clone() *Refund_Clone_Call { return &Refund_Clone_Call{Call: _e.mock.On("Clone")} } @@ -96,17 +96,17 @@ func (_c *Refund_Clone_Call) RunAndReturn(run func() journal.Refund) *Refund_Clo return _c } -// Finalize provides a mock function with given fields: +// Finalize provides a mock function with given fields:. func (_m *Refund) Finalize() { _m.Called() } -// Refund_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +// Refund_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. type Refund_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call +// Finalize is a helper method to define mock.On call. func (_e *Refund_Expecter) Finalize() *Refund_Finalize_Call { return &Refund_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -128,7 +128,7 @@ func (_c *Refund_Finalize_Call) RunAndReturn(run func()) *Refund_Finalize_Call { return _c } -// GetRefund provides a mock function with given fields: +// GetRefund provides a mock function with given fields:. func (_m *Refund) GetRefund() uint64 { ret := _m.Called() @@ -142,12 +142,12 @@ func (_m *Refund) GetRefund() uint64 { return r0 } -// Refund_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund' +// Refund_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund'. type Refund_GetRefund_Call struct { *mock.Call } -// GetRefund is a helper method to define mock.On call +// GetRefund is a helper method to define mock.On call. func (_e *Refund_Expecter) GetRefund() *Refund_GetRefund_Call { return &Refund_GetRefund_Call{Call: _e.mock.On("GetRefund")} } @@ -169,7 +169,7 @@ func (_c *Refund_GetRefund_Call) RunAndReturn(run func() uint64) *Refund_GetRefu return _c } -// RegistryKey provides a mock function with given fields: +// RegistryKey provides a mock function with given fields:. func (_m *Refund) RegistryKey() string { ret := _m.Called() @@ -183,12 +183,12 @@ func (_m *Refund) RegistryKey() string { return r0 } -// Refund_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +// Refund_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. type Refund_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call +// RegistryKey is a helper method to define mock.On call. func (_e *Refund_Expecter) RegistryKey() *Refund_RegistryKey_Call { return &Refund_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -210,12 +210,12 @@ func (_c *Refund_RegistryKey_Call) RunAndReturn(run func() string) *Refund_Regis return _c } -// RevertToSnapshot provides a mock function with given fields: _a0 +// RevertToSnapshot provides a mock function with given fields: _a0. func (_m *Refund) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Refund_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +// Refund_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. type Refund_RevertToSnapshot_Call struct { *mock.Call } @@ -243,7 +243,7 @@ func (_c *Refund_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Refund_Reve return _c } -// Snapshot provides a mock function with given fields: +// Snapshot provides a mock function with given fields:. func (_m *Refund) Snapshot() int { ret := _m.Called() @@ -257,12 +257,12 @@ func (_m *Refund) Snapshot() int { return r0 } -// Refund_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +// Refund_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. type Refund_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call +// Snapshot is a helper method to define mock.On call. func (_e *Refund_Expecter) Snapshot() *Refund_Snapshot_Call { return &Refund_Snapshot_Call{Call: _e.mock.On("Snapshot")} } @@ -284,12 +284,12 @@ func (_c *Refund_Snapshot_Call) RunAndReturn(run func() int) *Refund_Snapshot_Ca return _c } -// SubRefund provides a mock function with given fields: gas +// SubRefund provides a mock function with given fields: gas. func (_m *Refund) SubRefund(gas uint64) { _m.Called(gas) } -// Refund_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund' +// Refund_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund'. type Refund_SubRefund_Call struct { *mock.Call } diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 5633c28620..f69480ddc4 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -10,7 +10,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// SelfDestructStatePlugin is an autogenerated mock type for the selfDestructStatePlugin type +// SelfDestructStatePlugin is an autogenerated mock type for the selfDestructStatePlugin type. type SelfDestructStatePlugin struct { mock.Mock } @@ -23,7 +23,7 @@ func (_m *SelfDestructStatePlugin) EXPECT() *SelfDestructStatePlugin_Expecter { return &SelfDestructStatePlugin_Expecter{mock: &_m.Mock} } -// GetBalance provides a mock function with given fields: _a0 +// GetBalance provides a mock function with given fields: _a0. func (_m *SelfDestructStatePlugin) GetBalance(_a0 common.Address) *big.Int { ret := _m.Called(_a0) @@ -39,7 +39,7 @@ func (_m *SelfDestructStatePlugin) GetBalance(_a0 common.Address) *big.Int { return r0 } -// SelfDestructStatePlugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +// SelfDestructStatePlugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance'. type SelfDestructStatePlugin_GetBalance_Call struct { *mock.Call } @@ -67,7 +67,7 @@ func (_c *SelfDestructStatePlugin_GetBalance_Call) RunAndReturn(run func(common. return _c } -// GetCodeHash provides a mock function with given fields: _a0 +// GetCodeHash provides a mock function with given fields: _a0. func (_m *SelfDestructStatePlugin) GetCodeHash(_a0 common.Address) common.Hash { ret := _m.Called(_a0) @@ -83,7 +83,7 @@ func (_m *SelfDestructStatePlugin) GetCodeHash(_a0 common.Address) common.Hash { return r0 } -// SelfDestructStatePlugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' +// SelfDestructStatePlugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash'. type SelfDestructStatePlugin_GetCodeHash_Call struct { *mock.Call } @@ -111,12 +111,12 @@ func (_c *SelfDestructStatePlugin_GetCodeHash_Call) RunAndReturn(run func(common return _c } -// SubBalance provides a mock function with given fields: _a0, _a1 +// SubBalance provides a mock function with given fields: _a0, _a1. func (_m *SelfDestructStatePlugin) SubBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// SelfDestructStatePlugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' +// SelfDestructStatePlugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance'. type SelfDestructStatePlugin_SubBalance_Call struct { *mock.Call } diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index 4f657c938f..fdcc14a551 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// SelfDestructs is an autogenerated mock type for the SelfDestructs type +// SelfDestructs is an autogenerated mock type for the SelfDestructs type. type SelfDestructs struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *SelfDestructs) EXPECT() *SelfDestructs_Expecter { return &SelfDestructs_Expecter{mock: &_m.Mock} } -// Clone provides a mock function with given fields: +// Clone provides a mock function with given fields:. func (_m *SelfDestructs) Clone() journal.SelfDestructs { ret := _m.Called() @@ -38,12 +38,12 @@ func (_m *SelfDestructs) Clone() journal.SelfDestructs { return r0 } -// SelfDestructs_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +// SelfDestructs_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. type SelfDestructs_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call +// Clone is a helper method to define mock.On call. func (_e *SelfDestructs_Expecter) Clone() *SelfDestructs_Clone_Call { return &SelfDestructs_Clone_Call{Call: _e.mock.On("Clone")} } @@ -65,17 +65,17 @@ func (_c *SelfDestructs_Clone_Call) RunAndReturn(run func() journal.SelfDestruct return _c } -// Finalize provides a mock function with given fields: +// Finalize provides a mock function with given fields:. func (_m *SelfDestructs) Finalize() { _m.Called() } -// SelfDestructs_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +// SelfDestructs_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. type SelfDestructs_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call +// Finalize is a helper method to define mock.On call. func (_e *SelfDestructs_Expecter) Finalize() *SelfDestructs_Finalize_Call { return &SelfDestructs_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -97,7 +97,7 @@ func (_c *SelfDestructs_Finalize_Call) RunAndReturn(run func()) *SelfDestructs_F return _c } -// GetSelfDestructs provides a mock function with given fields: +// GetSelfDestructs provides a mock function with given fields:. func (_m *SelfDestructs) GetSelfDestructs() []common.Address { ret := _m.Called() @@ -113,12 +113,12 @@ func (_m *SelfDestructs) GetSelfDestructs() []common.Address { return r0 } -// SelfDestructs_GetSelfDestructs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSelfDestructs' +// SelfDestructs_GetSelfDestructs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSelfDestructs'. type SelfDestructs_GetSelfDestructs_Call struct { *mock.Call } -// GetSelfDestructs is a helper method to define mock.On call +// GetSelfDestructs is a helper method to define mock.On call. func (_e *SelfDestructs_Expecter) GetSelfDestructs() *SelfDestructs_GetSelfDestructs_Call { return &SelfDestructs_GetSelfDestructs_Call{Call: _e.mock.On("GetSelfDestructs")} } @@ -140,7 +140,7 @@ func (_c *SelfDestructs_GetSelfDestructs_Call) RunAndReturn(run func() []common. return _c } -// HasSelfDestructed provides a mock function with given fields: _a0 +// HasSelfDestructed provides a mock function with given fields: _a0. func (_m *SelfDestructs) HasSelfDestructed(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -154,7 +154,7 @@ func (_m *SelfDestructs) HasSelfDestructed(_a0 common.Address) bool { return r0 } -// SelfDestructs_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed' +// SelfDestructs_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed'. type SelfDestructs_HasSelfDestructed_Call struct { *mock.Call } @@ -182,7 +182,7 @@ func (_c *SelfDestructs_HasSelfDestructed_Call) RunAndReturn(run func(common.Add return _c } -// RegistryKey provides a mock function with given fields: +// RegistryKey provides a mock function with given fields:. func (_m *SelfDestructs) RegistryKey() string { ret := _m.Called() @@ -196,12 +196,12 @@ func (_m *SelfDestructs) RegistryKey() string { return r0 } -// SelfDestructs_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +// SelfDestructs_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. type SelfDestructs_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call +// RegistryKey is a helper method to define mock.On call. func (_e *SelfDestructs_Expecter) RegistryKey() *SelfDestructs_RegistryKey_Call { return &SelfDestructs_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -223,12 +223,12 @@ func (_c *SelfDestructs_RegistryKey_Call) RunAndReturn(run func() string) *SelfD return _c } -// RevertToSnapshot provides a mock function with given fields: _a0 +// RevertToSnapshot provides a mock function with given fields: _a0. func (_m *SelfDestructs) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// SelfDestructs_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +// SelfDestructs_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. type SelfDestructs_RevertToSnapshot_Call struct { *mock.Call } @@ -256,12 +256,12 @@ func (_c *SelfDestructs_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Self return _c } -// SelfDestruct provides a mock function with given fields: _a0 +// SelfDestruct provides a mock function with given fields: _a0. func (_m *SelfDestructs) SelfDestruct(_a0 common.Address) { _m.Called(_a0) } -// SelfDestructs_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct' +// SelfDestructs_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct'. type SelfDestructs_SelfDestruct_Call struct { *mock.Call } @@ -289,12 +289,12 @@ func (_c *SelfDestructs_SelfDestruct_Call) RunAndReturn(run func(common.Address) return _c } -// Selfdestruct6780 provides a mock function with given fields: _a0 +// Selfdestruct6780 provides a mock function with given fields: _a0. func (_m *SelfDestructs) Selfdestruct6780(_a0 common.Address) { _m.Called(_a0) } -// SelfDestructs_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780' +// SelfDestructs_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780'. type SelfDestructs_Selfdestruct6780_Call struct { *mock.Call } @@ -322,7 +322,7 @@ func (_c *SelfDestructs_Selfdestruct6780_Call) RunAndReturn(run func(common.Addr return _c } -// Snapshot provides a mock function with given fields: +// Snapshot provides a mock function with given fields:. func (_m *SelfDestructs) Snapshot() int { ret := _m.Called() @@ -336,12 +336,12 @@ func (_m *SelfDestructs) Snapshot() int { return r0 } -// SelfDestructs_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +// SelfDestructs_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. type SelfDestructs_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call +// Snapshot is a helper method to define mock.On call. func (_e *SelfDestructs_Expecter) Snapshot() *SelfDestructs_Snapshot_Call { return &SelfDestructs_Snapshot_Call{Call: _e.mock.On("Snapshot")} } diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index 40f35c8cbb..bb011530a5 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// TransientStorage is an autogenerated mock type for the TransientStorage type +// TransientStorage is an autogenerated mock type for the TransientStorage type. type TransientStorage struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *TransientStorage) EXPECT() *TransientStorage_Expecter { return &TransientStorage_Expecter{mock: &_m.Mock} } -// Clone provides a mock function with given fields: +// Clone provides a mock function with given fields:. func (_m *TransientStorage) Clone() journal.TransientStorage { ret := _m.Called() @@ -38,12 +38,12 @@ func (_m *TransientStorage) Clone() journal.TransientStorage { return r0 } -// TransientStorage_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +// TransientStorage_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. type TransientStorage_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call +// Clone is a helper method to define mock.On call. func (_e *TransientStorage_Expecter) Clone() *TransientStorage_Clone_Call { return &TransientStorage_Clone_Call{Call: _e.mock.On("Clone")} } @@ -65,17 +65,17 @@ func (_c *TransientStorage_Clone_Call) RunAndReturn(run func() journal.Transient return _c } -// Finalize provides a mock function with given fields: +// Finalize provides a mock function with given fields:. func (_m *TransientStorage) Finalize() { _m.Called() } -// TransientStorage_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +// TransientStorage_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. type TransientStorage_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call +// Finalize is a helper method to define mock.On call. func (_e *TransientStorage_Expecter) Finalize() *TransientStorage_Finalize_Call { return &TransientStorage_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -97,7 +97,7 @@ func (_c *TransientStorage_Finalize_Call) RunAndReturn(run func()) *TransientSto return _c } -// GetTransientState provides a mock function with given fields: addr, key +// GetTransientState provides a mock function with given fields: addr, key. func (_m *TransientStorage) GetTransientState(addr common.Address, key common.Hash) common.Hash { ret := _m.Called(addr, key) @@ -113,7 +113,7 @@ func (_m *TransientStorage) GetTransientState(addr common.Address, key common.Ha return r0 } -// TransientStorage_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState' +// TransientStorage_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState'. type TransientStorage_GetTransientState_Call struct { *mock.Call } @@ -142,7 +142,7 @@ func (_c *TransientStorage_GetTransientState_Call) RunAndReturn(run func(common. return _c } -// RegistryKey provides a mock function with given fields: +// RegistryKey provides a mock function with given fields:. func (_m *TransientStorage) RegistryKey() string { ret := _m.Called() @@ -156,12 +156,12 @@ func (_m *TransientStorage) RegistryKey() string { return r0 } -// TransientStorage_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +// TransientStorage_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. type TransientStorage_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call +// RegistryKey is a helper method to define mock.On call. func (_e *TransientStorage_Expecter) RegistryKey() *TransientStorage_RegistryKey_Call { return &TransientStorage_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -183,12 +183,12 @@ func (_c *TransientStorage_RegistryKey_Call) RunAndReturn(run func() string) *Tr return _c } -// RevertToSnapshot provides a mock function with given fields: _a0 +// RevertToSnapshot provides a mock function with given fields: _a0. func (_m *TransientStorage) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// TransientStorage_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +// TransientStorage_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. type TransientStorage_RevertToSnapshot_Call struct { *mock.Call } @@ -216,12 +216,12 @@ func (_c *TransientStorage_RevertToSnapshot_Call) RunAndReturn(run func(int)) *T return _c } -// SetTransientState provides a mock function with given fields: addr, key, value +// SetTransientState provides a mock function with given fields: addr, key, value. func (_m *TransientStorage) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { _m.Called(addr, key, value) } -// TransientStorage_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState' +// TransientStorage_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState'. type TransientStorage_SetTransientState_Call struct { *mock.Call } @@ -251,7 +251,7 @@ func (_c *TransientStorage_SetTransientState_Call) RunAndReturn(run func(common. return _c } -// Snapshot provides a mock function with given fields: +// Snapshot provides a mock function with given fields:. func (_m *TransientStorage) Snapshot() int { ret := _m.Called() @@ -265,12 +265,12 @@ func (_m *TransientStorage) Snapshot() int { return r0 } -// TransientStorage_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +// TransientStorage_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. type TransientStorage_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call +// Snapshot is a helper method to define mock.On call. func (_e *TransientStorage_Expecter) Snapshot() *TransientStorage_Snapshot_Call { return &TransientStorage_Snapshot_Call{Call: _e.mock.On("Snapshot")} } diff --git a/eth/core/state/journal/selfdestructs.go b/eth/core/state/journal/selfdestructs.go index fa29772a6c..5490908cb9 100644 --- a/eth/core/state/journal/selfdestructs.go +++ b/eth/core/state/journal/selfdestructs.go @@ -85,7 +85,7 @@ func (s *selfDestructs) RegistryKey() string { return suicidesRegistryKey } -// SelfDestruct implements the PolarisStateDB interface by marking the given address as self +// SelfDestruct implements the PolarStateDB interface by marking the given address as self // destructed. This clears the account balance, but the code and state of the address remains // available until after Commit is called. func (s *selfDestructs) SelfDestruct(addr common.Address) { @@ -112,7 +112,7 @@ func (s *selfDestructs) Selfdestruct6780(_ common.Address) { // TODO: IMPLEMENT EIP-6780 } -// HasSelfDestructed implements the PolarisStateDB interface by returning if the contract was +// HasSelfDestructed implements the PolarStateDB interface by returning if the contract was // self destructed in current transaction. func (s *selfDestructs) HasSelfDestructed(addr common.Address) bool { for i := s.Size() - 1; i >= 0; i-- { diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index 0b295c7f7b..7e111ba69f 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -13,7 +13,7 @@ import ( state "pkg.berachain.dev/polaris/eth/core/state" ) -// Plugin is an autogenerated mock type for the Plugin type +// Plugin is an autogenerated mock type for the Plugin type. type Plugin struct { mock.Mock } @@ -26,12 +26,12 @@ func (_m *Plugin) EXPECT() *Plugin_Expecter { return &Plugin_Expecter{mock: &_m.Mock} } -// AddBalance provides a mock function with given fields: _a0, _a1 +// AddBalance provides a mock function with given fields: _a0, _a1. func (_m *Plugin) AddBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// Plugin_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance' +// Plugin_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance'. type Plugin_AddBalance_Call struct { *mock.Call } @@ -60,7 +60,7 @@ func (_c *Plugin_AddBalance_Call) RunAndReturn(run func(common.Address, *big.Int return _c } -// Clone provides a mock function with given fields: +// Clone provides a mock function with given fields:. func (_m *Plugin) Clone() state.Plugin { ret := _m.Called() @@ -76,12 +76,12 @@ func (_m *Plugin) Clone() state.Plugin { return r0 } -// Plugin_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' +// Plugin_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. type Plugin_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call +// Clone is a helper method to define mock.On call. func (_e *Plugin_Expecter) Clone() *Plugin_Clone_Call { return &Plugin_Clone_Call{Call: _e.mock.On("Clone")} } @@ -103,12 +103,12 @@ func (_c *Plugin_Clone_Call) RunAndReturn(run func() state.Plugin) *Plugin_Clone return _c } -// CreateAccount provides a mock function with given fields: _a0 +// CreateAccount provides a mock function with given fields: _a0. func (_m *Plugin) CreateAccount(_a0 common.Address) { _m.Called(_a0) } -// Plugin_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount' +// Plugin_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount'. type Plugin_CreateAccount_Call struct { *mock.Call } @@ -136,12 +136,12 @@ func (_c *Plugin_CreateAccount_Call) RunAndReturn(run func(common.Address)) *Plu return _c } -// DeleteAccounts provides a mock function with given fields: _a0 +// DeleteAccounts provides a mock function with given fields: _a0. func (_m *Plugin) DeleteAccounts(_a0 []common.Address) { _m.Called(_a0) } -// Plugin_DeleteAccounts_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccounts' +// Plugin_DeleteAccounts_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccounts'. type Plugin_DeleteAccounts_Call struct { *mock.Call } @@ -169,7 +169,7 @@ func (_c *Plugin_DeleteAccounts_Call) RunAndReturn(run func([]common.Address)) * return _c } -// Empty provides a mock function with given fields: _a0 +// Empty provides a mock function with given fields: _a0. func (_m *Plugin) Empty(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -183,7 +183,7 @@ func (_m *Plugin) Empty(_a0 common.Address) bool { return r0 } -// Plugin_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty' +// Plugin_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty'. type Plugin_Empty_Call struct { *mock.Call } @@ -211,7 +211,7 @@ func (_c *Plugin_Empty_Call) RunAndReturn(run func(common.Address) bool) *Plugin return _c } -// Error provides a mock function with given fields: +// Error provides a mock function with given fields:. func (_m *Plugin) Error() error { ret := _m.Called() @@ -225,12 +225,12 @@ func (_m *Plugin) Error() error { return r0 } -// Plugin_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' +// Plugin_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error'. type Plugin_Error_Call struct { *mock.Call } -// Error is a helper method to define mock.On call +// Error is a helper method to define mock.On call. func (_e *Plugin_Expecter) Error() *Plugin_Error_Call { return &Plugin_Error_Call{Call: _e.mock.On("Error")} } @@ -252,7 +252,7 @@ func (_c *Plugin_Error_Call) RunAndReturn(run func() error) *Plugin_Error_Call { return _c } -// Exist provides a mock function with given fields: _a0 +// Exist provides a mock function with given fields: _a0. func (_m *Plugin) Exist(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -266,7 +266,7 @@ func (_m *Plugin) Exist(_a0 common.Address) bool { return r0 } -// Plugin_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist' +// Plugin_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist'. type Plugin_Exist_Call struct { *mock.Call } @@ -294,17 +294,17 @@ func (_c *Plugin_Exist_Call) RunAndReturn(run func(common.Address) bool) *Plugin return _c } -// Finalize provides a mock function with given fields: +// Finalize provides a mock function with given fields:. func (_m *Plugin) Finalize() { _m.Called() } -// Plugin_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' +// Plugin_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. type Plugin_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call +// Finalize is a helper method to define mock.On call. func (_e *Plugin_Expecter) Finalize() *Plugin_Finalize_Call { return &Plugin_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -326,7 +326,7 @@ func (_c *Plugin_Finalize_Call) RunAndReturn(run func()) *Plugin_Finalize_Call { return _c } -// ForEachStorage provides a mock function with given fields: _a0, _a1 +// ForEachStorage provides a mock function with given fields: _a0, _a1. func (_m *Plugin) ForEachStorage(_a0 common.Address, _a1 func(common.Hash, common.Hash) bool) error { ret := _m.Called(_a0, _a1) @@ -340,7 +340,7 @@ func (_m *Plugin) ForEachStorage(_a0 common.Address, _a1 func(common.Hash, commo return r0 } -// Plugin_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage' +// Plugin_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage'. type Plugin_ForEachStorage_Call struct { *mock.Call } @@ -369,7 +369,7 @@ func (_c *Plugin_ForEachStorage_Call) RunAndReturn(run func(common.Address, func return _c } -// GetBalance provides a mock function with given fields: _a0 +// GetBalance provides a mock function with given fields: _a0. func (_m *Plugin) GetBalance(_a0 common.Address) *big.Int { ret := _m.Called(_a0) @@ -385,7 +385,7 @@ func (_m *Plugin) GetBalance(_a0 common.Address) *big.Int { return r0 } -// Plugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +// Plugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance'. type Plugin_GetBalance_Call struct { *mock.Call } @@ -413,7 +413,7 @@ func (_c *Plugin_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int return _c } -// GetCode provides a mock function with given fields: _a0 +// GetCode provides a mock function with given fields: _a0. func (_m *Plugin) GetCode(_a0 common.Address) []byte { ret := _m.Called(_a0) @@ -429,7 +429,7 @@ func (_m *Plugin) GetCode(_a0 common.Address) []byte { return r0 } -// Plugin_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode' +// Plugin_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode'. type Plugin_GetCode_Call struct { *mock.Call } @@ -457,7 +457,7 @@ func (_c *Plugin_GetCode_Call) RunAndReturn(run func(common.Address) []byte) *Pl return _c } -// GetCodeHash provides a mock function with given fields: _a0 +// GetCodeHash provides a mock function with given fields: _a0. func (_m *Plugin) GetCodeHash(_a0 common.Address) common.Hash { ret := _m.Called(_a0) @@ -473,7 +473,7 @@ func (_m *Plugin) GetCodeHash(_a0 common.Address) common.Hash { return r0 } -// Plugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' +// Plugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash'. type Plugin_GetCodeHash_Call struct { *mock.Call } @@ -501,7 +501,7 @@ func (_c *Plugin_GetCodeHash_Call) RunAndReturn(run func(common.Address) common. return _c } -// GetCommittedState provides a mock function with given fields: _a0, _a1 +// GetCommittedState provides a mock function with given fields: _a0, _a1. func (_m *Plugin) GetCommittedState(_a0 common.Address, _a1 common.Hash) common.Hash { ret := _m.Called(_a0, _a1) @@ -517,7 +517,7 @@ func (_m *Plugin) GetCommittedState(_a0 common.Address, _a1 common.Hash) common. return r0 } -// Plugin_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState' +// Plugin_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState'. type Plugin_GetCommittedState_Call struct { *mock.Call } @@ -546,7 +546,7 @@ func (_c *Plugin_GetCommittedState_Call) RunAndReturn(run func(common.Address, c return _c } -// GetContext provides a mock function with given fields: +// GetContext provides a mock function with given fields:. func (_m *Plugin) GetContext() context.Context { ret := _m.Called() @@ -562,12 +562,12 @@ func (_m *Plugin) GetContext() context.Context { return r0 } -// Plugin_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext' +// Plugin_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext'. type Plugin_GetContext_Call struct { *mock.Call } -// GetContext is a helper method to define mock.On call +// GetContext is a helper method to define mock.On call. func (_e *Plugin_Expecter) GetContext() *Plugin_GetContext_Call { return &Plugin_GetContext_Call{Call: _e.mock.On("GetContext")} } @@ -589,7 +589,7 @@ func (_c *Plugin_GetContext_Call) RunAndReturn(run func() context.Context) *Plug return _c } -// GetNonce provides a mock function with given fields: _a0 +// GetNonce provides a mock function with given fields: _a0. func (_m *Plugin) GetNonce(_a0 common.Address) uint64 { ret := _m.Called(_a0) @@ -603,7 +603,7 @@ func (_m *Plugin) GetNonce(_a0 common.Address) uint64 { return r0 } -// Plugin_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce' +// Plugin_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce'. type Plugin_GetNonce_Call struct { *mock.Call } @@ -631,7 +631,7 @@ func (_c *Plugin_GetNonce_Call) RunAndReturn(run func(common.Address) uint64) *P return _c } -// GetState provides a mock function with given fields: _a0, _a1 +// GetState provides a mock function with given fields: _a0, _a1. func (_m *Plugin) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { ret := _m.Called(_a0, _a1) @@ -647,7 +647,7 @@ func (_m *Plugin) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { return r0 } -// Plugin_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState' +// Plugin_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState'. type Plugin_GetState_Call struct { *mock.Call } @@ -676,12 +676,12 @@ func (_c *Plugin_GetState_Call) RunAndReturn(run func(common.Address, common.Has return _c } -// Prepare provides a mock function with given fields: _a0 +// Prepare provides a mock function with given fields: _a0. func (_m *Plugin) Prepare(_a0 context.Context) { _m.Called(_a0) } -// Plugin_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare' +// Plugin_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare'. type Plugin_Prepare_Call struct { *mock.Call } @@ -709,7 +709,7 @@ func (_c *Plugin_Prepare_Call) RunAndReturn(run func(context.Context)) *Plugin_P return _c } -// RegistryKey provides a mock function with given fields: +// RegistryKey provides a mock function with given fields:. func (_m *Plugin) RegistryKey() string { ret := _m.Called() @@ -723,12 +723,12 @@ func (_m *Plugin) RegistryKey() string { return r0 } -// Plugin_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' +// Plugin_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. type Plugin_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call +// RegistryKey is a helper method to define mock.On call. func (_e *Plugin_Expecter) RegistryKey() *Plugin_RegistryKey_Call { return &Plugin_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -750,12 +750,12 @@ func (_c *Plugin_RegistryKey_Call) RunAndReturn(run func() string) *Plugin_Regis return _c } -// Reset provides a mock function with given fields: _a0 +// Reset provides a mock function with given fields: _a0. func (_m *Plugin) Reset(_a0 context.Context) { _m.Called(_a0) } -// Plugin_Reset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reset' +// Plugin_Reset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reset'. type Plugin_Reset_Call struct { *mock.Call } @@ -783,12 +783,12 @@ func (_c *Plugin_Reset_Call) RunAndReturn(run func(context.Context)) *Plugin_Res return _c } -// RevertToSnapshot provides a mock function with given fields: _a0 +// RevertToSnapshot provides a mock function with given fields: _a0. func (_m *Plugin) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Plugin_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +// Plugin_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. type Plugin_RevertToSnapshot_Call struct { *mock.Call } @@ -816,12 +816,12 @@ func (_c *Plugin_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Plugin_Reve return _c } -// SetBalance provides a mock function with given fields: _a0, _a1 +// SetBalance provides a mock function with given fields: _a0, _a1. func (_m *Plugin) SetBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// Plugin_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance' +// Plugin_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance'. type Plugin_SetBalance_Call struct { *mock.Call } @@ -850,12 +850,12 @@ func (_c *Plugin_SetBalance_Call) RunAndReturn(run func(common.Address, *big.Int return _c } -// SetCode provides a mock function with given fields: _a0, _a1 +// SetCode provides a mock function with given fields: _a0, _a1. func (_m *Plugin) SetCode(_a0 common.Address, _a1 []byte) { _m.Called(_a0, _a1) } -// Plugin_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode' +// Plugin_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode'. type Plugin_SetCode_Call struct { *mock.Call } @@ -884,12 +884,12 @@ func (_c *Plugin_SetCode_Call) RunAndReturn(run func(common.Address, []byte)) *P return _c } -// SetNonce provides a mock function with given fields: _a0, _a1 +// SetNonce provides a mock function with given fields: _a0, _a1. func (_m *Plugin) SetNonce(_a0 common.Address, _a1 uint64) { _m.Called(_a0, _a1) } -// Plugin_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce' +// Plugin_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce'. type Plugin_SetNonce_Call struct { *mock.Call } @@ -918,12 +918,12 @@ func (_c *Plugin_SetNonce_Call) RunAndReturn(run func(common.Address, uint64)) * return _c } -// SetState provides a mock function with given fields: _a0, _a1, _a2 +// SetState provides a mock function with given fields: _a0, _a1, _a2. func (_m *Plugin) SetState(_a0 common.Address, _a1 common.Hash, _a2 common.Hash) { _m.Called(_a0, _a1, _a2) } -// Plugin_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState' +// Plugin_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState'. type Plugin_SetState_Call struct { *mock.Call } @@ -953,12 +953,12 @@ func (_c *Plugin_SetState_Call) RunAndReturn(run func(common.Address, common.Has return _c } -// SetStorage provides a mock function with given fields: addr, storage +// SetStorage provides a mock function with given fields: addr, storage. func (_m *Plugin) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { _m.Called(addr, storage) } -// Plugin_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage' +// Plugin_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage'. type Plugin_SetStorage_Call struct { *mock.Call } @@ -987,7 +987,7 @@ func (_c *Plugin_SetStorage_Call) RunAndReturn(run func(common.Address, map[comm return _c } -// Snapshot provides a mock function with given fields: +// Snapshot provides a mock function with given fields:. func (_m *Plugin) Snapshot() int { ret := _m.Called() @@ -1001,12 +1001,12 @@ func (_m *Plugin) Snapshot() int { return r0 } -// Plugin_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +// Plugin_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. type Plugin_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call +// Snapshot is a helper method to define mock.On call. func (_e *Plugin_Expecter) Snapshot() *Plugin_Snapshot_Call { return &Plugin_Snapshot_Call{Call: _e.mock.On("Snapshot")} } @@ -1028,12 +1028,12 @@ func (_c *Plugin_Snapshot_Call) RunAndReturn(run func() int) *Plugin_Snapshot_Ca return _c } -// SubBalance provides a mock function with given fields: _a0, _a1 +// SubBalance provides a mock function with given fields: _a0, _a1. func (_m *Plugin) SubBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// Plugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' +// Plugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance'. type Plugin_SubBalance_Call struct { *mock.Call } diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index 5d98088b42..e95e76ac67 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -3,11 +3,17 @@ package mocks import ( + big "math/big" + common "github.com/ethereum/go-ethereum/common" mock "github.com/stretchr/testify/mock" + + params "github.com/ethereum/go-ethereum/params" + + vm "github.com/ethereum/go-ethereum/core/vm" ) -// PrecompilePlugin is an autogenerated mock type for the PrecompilePlugin type +// PrecompilePlugin is an autogenerated mock type for the PrecompilePlugin type. type PrecompilePlugin struct { mock.Mock } @@ -20,44 +26,276 @@ func (_m *PrecompilePlugin) EXPECT() *PrecompilePlugin_Expecter { return &PrecompilePlugin_Expecter{mock: &_m.Mock} } -// Has provides a mock function with given fields: _a0 -func (_m *PrecompilePlugin) Has(_a0 common.Address) bool { +// DisableReentrancy provides a mock function with given fields: _a0. +func (_m *PrecompilePlugin) DisableReentrancy(_a0 vm.PrecompileEVM) { + _m.Called(_a0) +} + +// PrecompilePlugin_DisableReentrancy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DisableReentrancy'. +type PrecompilePlugin_DisableReentrancy_Call struct { + *mock.Call +} + +// DisableReentrancy is a helper method to define mock.On call +// - _a0 vm.PrecompileEVM +func (_e *PrecompilePlugin_Expecter) DisableReentrancy(_a0 interface{}) *PrecompilePlugin_DisableReentrancy_Call { + return &PrecompilePlugin_DisableReentrancy_Call{Call: _e.mock.On("DisableReentrancy", _a0)} +} + +func (_c *PrecompilePlugin_DisableReentrancy_Call) Run(run func(_a0 vm.PrecompileEVM)) *PrecompilePlugin_DisableReentrancy_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(vm.PrecompileEVM)) + }) + return _c +} + +func (_c *PrecompilePlugin_DisableReentrancy_Call) Return() *PrecompilePlugin_DisableReentrancy_Call { + _c.Call.Return() + return _c +} + +func (_c *PrecompilePlugin_DisableReentrancy_Call) RunAndReturn(run func(vm.PrecompileEVM)) *PrecompilePlugin_DisableReentrancy_Call { + _c.Call.Return(run) + return _c +} + +// EnableReentrancy provides a mock function with given fields: _a0. +func (_m *PrecompilePlugin) EnableReentrancy(_a0 vm.PrecompileEVM) { + _m.Called(_a0) +} + +// PrecompilePlugin_EnableReentrancy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnableReentrancy'. +type PrecompilePlugin_EnableReentrancy_Call struct { + *mock.Call +} + +// EnableReentrancy is a helper method to define mock.On call +// - _a0 vm.PrecompileEVM +func (_e *PrecompilePlugin_Expecter) EnableReentrancy(_a0 interface{}) *PrecompilePlugin_EnableReentrancy_Call { + return &PrecompilePlugin_EnableReentrancy_Call{Call: _e.mock.On("EnableReentrancy", _a0)} +} + +func (_c *PrecompilePlugin_EnableReentrancy_Call) Run(run func(_a0 vm.PrecompileEVM)) *PrecompilePlugin_EnableReentrancy_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(vm.PrecompileEVM)) + }) + return _c +} + +func (_c *PrecompilePlugin_EnableReentrancy_Call) Return() *PrecompilePlugin_EnableReentrancy_Call { + _c.Call.Return() + return _c +} + +func (_c *PrecompilePlugin_EnableReentrancy_Call) RunAndReturn(run func(vm.PrecompileEVM)) *PrecompilePlugin_EnableReentrancy_Call { + _c.Call.Return(run) + return _c +} + +// Get provides a mock function with given fields: addr, rules. +func (_m *PrecompilePlugin) Get(addr common.Address, rules *params.Rules) (vm.PrecompiledContract, bool) { + ret := _m.Called(addr, rules) + + var r0 vm.PrecompiledContract + var r1 bool + if rf, ok := ret.Get(0).(func(common.Address, *params.Rules) (vm.PrecompiledContract, bool)); ok { + return rf(addr, rules) + } + if rf, ok := ret.Get(0).(func(common.Address, *params.Rules) vm.PrecompiledContract); ok { + r0 = rf(addr, rules) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(vm.PrecompiledContract) + } + } + + if rf, ok := ret.Get(1).(func(common.Address, *params.Rules) bool); ok { + r1 = rf(addr, rules) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// PrecompilePlugin_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get'. +type PrecompilePlugin_Get_Call struct { + *mock.Call +} + +// Get is a helper method to define mock.On call +// - addr common.Address +// - rules *params.Rules +func (_e *PrecompilePlugin_Expecter) Get(addr interface{}, rules interface{}) *PrecompilePlugin_Get_Call { + return &PrecompilePlugin_Get_Call{Call: _e.mock.On("Get", addr, rules)} +} + +func (_c *PrecompilePlugin_Get_Call) Run(run func(addr common.Address, rules *params.Rules)) *PrecompilePlugin_Get_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*params.Rules)) + }) + return _c +} + +func (_c *PrecompilePlugin_Get_Call) Return(_a0 vm.PrecompiledContract, _a1 bool) *PrecompilePlugin_Get_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PrecompilePlugin_Get_Call) RunAndReturn(run func(common.Address, *params.Rules) (vm.PrecompiledContract, bool)) *PrecompilePlugin_Get_Call { + _c.Call.Return(run) + return _c +} + +// GetActive provides a mock function with given fields: _a0. +func (_m *PrecompilePlugin) GetActive(_a0 params.Rules) []common.Address { + ret := _m.Called(_a0) + + var r0 []common.Address + if rf, ok := ret.Get(0).(func(params.Rules) []common.Address); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Address) + } + } + + return r0 +} + +// PrecompilePlugin_GetActive_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetActive'. +type PrecompilePlugin_GetActive_Call struct { + *mock.Call +} + +// GetActive is a helper method to define mock.On call +// - _a0 params.Rules +func (_e *PrecompilePlugin_Expecter) GetActive(_a0 interface{}) *PrecompilePlugin_GetActive_Call { + return &PrecompilePlugin_GetActive_Call{Call: _e.mock.On("GetActive", _a0)} +} + +func (_c *PrecompilePlugin_GetActive_Call) Run(run func(_a0 params.Rules)) *PrecompilePlugin_GetActive_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(params.Rules)) + }) + return _c +} + +func (_c *PrecompilePlugin_GetActive_Call) Return(_a0 []common.Address) *PrecompilePlugin_GetActive_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PrecompilePlugin_GetActive_Call) RunAndReturn(run func(params.Rules) []common.Address) *PrecompilePlugin_GetActive_Call { + _c.Call.Return(run) + return _c +} + +// Register provides a mock function with given fields: _a0. +func (_m *PrecompilePlugin) Register(_a0 vm.PrecompiledContract) error { ret := _m.Called(_a0) - var r0 bool - if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + var r0 error + if rf, ok := ret.Get(0).(func(vm.PrecompiledContract) error); ok { r0 = rf(_a0) } else { - r0 = ret.Get(0).(bool) + r0 = ret.Error(0) } return r0 } -// PrecompilePlugin_Has_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Has' -type PrecompilePlugin_Has_Call struct { +// PrecompilePlugin_Register_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Register'. +type PrecompilePlugin_Register_Call struct { *mock.Call } -// Has is a helper method to define mock.On call -// - _a0 common.Address -func (_e *PrecompilePlugin_Expecter) Has(_a0 interface{}) *PrecompilePlugin_Has_Call { - return &PrecompilePlugin_Has_Call{Call: _e.mock.On("Has", _a0)} +// Register is a helper method to define mock.On call +// - _a0 vm.PrecompiledContract +func (_e *PrecompilePlugin_Expecter) Register(_a0 interface{}) *PrecompilePlugin_Register_Call { + return &PrecompilePlugin_Register_Call{Call: _e.mock.On("Register", _a0)} } -func (_c *PrecompilePlugin_Has_Call) Run(run func(_a0 common.Address)) *PrecompilePlugin_Has_Call { +func (_c *PrecompilePlugin_Register_Call) Run(run func(_a0 vm.PrecompiledContract)) *PrecompilePlugin_Register_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) + run(args[0].(vm.PrecompiledContract)) }) return _c } -func (_c *PrecompilePlugin_Has_Call) Return(_a0 bool) *PrecompilePlugin_Has_Call { +func (_c *PrecompilePlugin_Register_Call) Return(_a0 error) *PrecompilePlugin_Register_Call { _c.Call.Return(_a0) return _c } -func (_c *PrecompilePlugin_Has_Call) RunAndReturn(run func(common.Address) bool) *PrecompilePlugin_Has_Call { +func (_c *PrecompilePlugin_Register_Call) RunAndReturn(run func(vm.PrecompiledContract) error) *PrecompilePlugin_Register_Call { + _c.Call.Return(run) + return _c +} + +// Run provides a mock function with given fields: evm, p, input, caller, value, suppliedGas, readonly. +func (_m *PrecompilePlugin) Run(evm vm.PrecompileEVM, p vm.PrecompiledContract, input []byte, caller common.Address, value *big.Int, suppliedGas uint64, readonly bool) ([]byte, uint64, error) { + ret := _m.Called(evm, p, input, caller, value, suppliedGas, readonly) + + var r0 []byte + var r1 uint64 + var r2 error + if rf, ok := ret.Get(0).(func(vm.PrecompileEVM, vm.PrecompiledContract, []byte, common.Address, *big.Int, uint64, bool) ([]byte, uint64, error)); ok { + return rf(evm, p, input, caller, value, suppliedGas, readonly) + } + if rf, ok := ret.Get(0).(func(vm.PrecompileEVM, vm.PrecompiledContract, []byte, common.Address, *big.Int, uint64, bool) []byte); ok { + r0 = rf(evm, p, input, caller, value, suppliedGas, readonly) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(vm.PrecompileEVM, vm.PrecompiledContract, []byte, common.Address, *big.Int, uint64, bool) uint64); ok { + r1 = rf(evm, p, input, caller, value, suppliedGas, readonly) + } else { + r1 = ret.Get(1).(uint64) + } + + if rf, ok := ret.Get(2).(func(vm.PrecompileEVM, vm.PrecompiledContract, []byte, common.Address, *big.Int, uint64, bool) error); ok { + r2 = rf(evm, p, input, caller, value, suppliedGas, readonly) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// PrecompilePlugin_Run_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Run'. +type PrecompilePlugin_Run_Call struct { + *mock.Call +} + +// Run is a helper method to define mock.On call +// - evm vm.PrecompileEVM +// - p vm.PrecompiledContract +// - input []byte +// - caller common.Address +// - value *big.Int +// - suppliedGas uint64 +// - readonly bool +func (_e *PrecompilePlugin_Expecter) Run(evm interface{}, p interface{}, input interface{}, caller interface{}, value interface{}, suppliedGas interface{}, readonly interface{}) *PrecompilePlugin_Run_Call { + return &PrecompilePlugin_Run_Call{Call: _e.mock.On("Run", evm, p, input, caller, value, suppliedGas, readonly)} +} + +func (_c *PrecompilePlugin_Run_Call) Run(run func(evm vm.PrecompileEVM, p vm.PrecompiledContract, input []byte, caller common.Address, value *big.Int, suppliedGas uint64, readonly bool)) *PrecompilePlugin_Run_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(vm.PrecompileEVM), args[1].(vm.PrecompiledContract), args[2].([]byte), args[3].(common.Address), args[4].(*big.Int), args[5].(uint64), args[6].(bool)) + }) + return _c +} + +func (_c *PrecompilePlugin_Run_Call) Return(ret []byte, remainingGas uint64, err error) *PrecompilePlugin_Run_Call { + _c.Call.Return(ret, remainingGas, err) + return _c +} + +func (_c *PrecompilePlugin_Run_Call) RunAndReturn(run func(vm.PrecompileEVM, vm.PrecompiledContract, []byte, common.Address, *big.Int, uint64, bool) ([]byte, uint64, error)) *PrecompilePlugin_Run_Call { _c.Call.Return(run) return _c } diff --git a/eth/core/state/mocks/state_db.go b/eth/core/state/mocks/state_db.go new file mode 100644 index 0000000000..061b7a39b2 --- /dev/null +++ b/eth/core/state/mocks/state_db.go @@ -0,0 +1,2221 @@ +// Code generated by mockery v2.35.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + corestate "github.com/ethereum/go-ethereum/core/state" + + mock "github.com/stretchr/testify/mock" + + params "github.com/ethereum/go-ethereum/params" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// StateDB is an autogenerated mock type for the StateDB type. +type StateDB struct { + mock.Mock +} + +type StateDB_Expecter struct { + mock *mock.Mock +} + +func (_m *StateDB) EXPECT() *StateDB_Expecter { + return &StateDB_Expecter{mock: &_m.Mock} +} + +// AddAddressToAccessList provides a mock function with given fields: addr. +func (_m *StateDB) AddAddressToAccessList(addr common.Address) { + _m.Called(addr) +} + +// StateDB_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList'. +type StateDB_AddAddressToAccessList_Call struct { + *mock.Call +} + +// AddAddressToAccessList is a helper method to define mock.On call +// - addr common.Address +func (_e *StateDB_Expecter) AddAddressToAccessList(addr interface{}) *StateDB_AddAddressToAccessList_Call { + return &StateDB_AddAddressToAccessList_Call{Call: _e.mock.On("AddAddressToAccessList", addr)} +} + +func (_c *StateDB_AddAddressToAccessList_Call) Run(run func(addr common.Address)) *StateDB_AddAddressToAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_AddAddressToAccessList_Call) Return() *StateDB_AddAddressToAccessList_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_AddAddressToAccessList_Call) RunAndReturn(run func(common.Address)) *StateDB_AddAddressToAccessList_Call { + _c.Call.Return(run) + return _c +} + +// AddBalance provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) AddBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// StateDB_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance'. +type StateDB_AddBalance_Call struct { + *mock.Call +} + +// AddBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *StateDB_Expecter) AddBalance(_a0 interface{}, _a1 interface{}) *StateDB_AddBalance_Call { + return &StateDB_AddBalance_Call{Call: _e.mock.On("AddBalance", _a0, _a1)} +} + +func (_c *StateDB_AddBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *StateDB_AddBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *StateDB_AddBalance_Call) Return() *StateDB_AddBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_AddBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *StateDB_AddBalance_Call { + _c.Call.Return(run) + return _c +} + +// AddLog provides a mock function with given fields: _a0. +func (_m *StateDB) AddLog(_a0 *types.Log) { + _m.Called(_a0) +} + +// StateDB_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog'. +type StateDB_AddLog_Call struct { + *mock.Call +} + +// AddLog is a helper method to define mock.On call +// - _a0 *types.Log +func (_e *StateDB_Expecter) AddLog(_a0 interface{}) *StateDB_AddLog_Call { + return &StateDB_AddLog_Call{Call: _e.mock.On("AddLog", _a0)} +} + +func (_c *StateDB_AddLog_Call) Run(run func(_a0 *types.Log)) *StateDB_AddLog_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*types.Log)) + }) + return _c +} + +func (_c *StateDB_AddLog_Call) Return() *StateDB_AddLog_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_AddLog_Call) RunAndReturn(run func(*types.Log)) *StateDB_AddLog_Call { + _c.Call.Return(run) + return _c +} + +// AddPreimage provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) AddPreimage(_a0 common.Hash, _a1 []byte) { + _m.Called(_a0, _a1) +} + +// StateDB_AddPreimage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPreimage'. +type StateDB_AddPreimage_Call struct { + *mock.Call +} + +// AddPreimage is a helper method to define mock.On call +// - _a0 common.Hash +// - _a1 []byte +func (_e *StateDB_Expecter) AddPreimage(_a0 interface{}, _a1 interface{}) *StateDB_AddPreimage_Call { + return &StateDB_AddPreimage_Call{Call: _e.mock.On("AddPreimage", _a0, _a1)} +} + +func (_c *StateDB_AddPreimage_Call) Run(run func(_a0 common.Hash, _a1 []byte)) *StateDB_AddPreimage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].([]byte)) + }) + return _c +} + +func (_c *StateDB_AddPreimage_Call) Return() *StateDB_AddPreimage_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_AddPreimage_Call) RunAndReturn(run func(common.Hash, []byte)) *StateDB_AddPreimage_Call { + _c.Call.Return(run) + return _c +} + +// AddRefund provides a mock function with given fields: _a0. +func (_m *StateDB) AddRefund(_a0 uint64) { + _m.Called(_a0) +} + +// StateDB_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund'. +type StateDB_AddRefund_Call struct { + *mock.Call +} + +// AddRefund is a helper method to define mock.On call +// - _a0 uint64 +func (_e *StateDB_Expecter) AddRefund(_a0 interface{}) *StateDB_AddRefund_Call { + return &StateDB_AddRefund_Call{Call: _e.mock.On("AddRefund", _a0)} +} + +func (_c *StateDB_AddRefund_Call) Run(run func(_a0 uint64)) *StateDB_AddRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *StateDB_AddRefund_Call) Return() *StateDB_AddRefund_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_AddRefund_Call) RunAndReturn(run func(uint64)) *StateDB_AddRefund_Call { + _c.Call.Return(run) + return _c +} + +// AddSlotToAccessList provides a mock function with given fields: addr, slot. +func (_m *StateDB) AddSlotToAccessList(addr common.Address, slot common.Hash) { + _m.Called(addr, slot) +} + +// StateDB_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList'. +type StateDB_AddSlotToAccessList_Call struct { + *mock.Call +} + +// AddSlotToAccessList is a helper method to define mock.On call +// - addr common.Address +// - slot common.Hash +func (_e *StateDB_Expecter) AddSlotToAccessList(addr interface{}, slot interface{}) *StateDB_AddSlotToAccessList_Call { + return &StateDB_AddSlotToAccessList_Call{Call: _e.mock.On("AddSlotToAccessList", addr, slot)} +} + +func (_c *StateDB_AddSlotToAccessList_Call) Run(run func(addr common.Address, slot common.Hash)) *StateDB_AddSlotToAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_AddSlotToAccessList_Call) Return() *StateDB_AddSlotToAccessList_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_AddSlotToAccessList_Call) RunAndReturn(run func(common.Address, common.Hash)) *StateDB_AddSlotToAccessList_Call { + _c.Call.Return(run) + return _c +} + +// AddressInAccessList provides a mock function with given fields: addr. +func (_m *StateDB) AddressInAccessList(addr common.Address) bool { + ret := _m.Called(addr) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(addr) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// StateDB_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList'. +type StateDB_AddressInAccessList_Call struct { + *mock.Call +} + +// AddressInAccessList is a helper method to define mock.On call +// - addr common.Address +func (_e *StateDB_Expecter) AddressInAccessList(addr interface{}) *StateDB_AddressInAccessList_Call { + return &StateDB_AddressInAccessList_Call{Call: _e.mock.On("AddressInAccessList", addr)} +} + +func (_c *StateDB_AddressInAccessList_Call) Run(run func(addr common.Address)) *StateDB_AddressInAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_AddressInAccessList_Call) Return(_a0 bool) *StateDB_AddressInAccessList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_AddressInAccessList_Call) RunAndReturn(run func(common.Address) bool) *StateDB_AddressInAccessList_Call { + _c.Call.Return(run) + return _c +} + +// Commit provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) Commit(_a0 uint64, _a1 bool) (common.Hash, error) { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(uint64, bool) (common.Hash, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(uint64, bool) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(uint64, bool) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StateDB_Commit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Commit'. +type StateDB_Commit_Call struct { + *mock.Call +} + +// Commit is a helper method to define mock.On call +// - _a0 uint64 +// - _a1 bool +func (_e *StateDB_Expecter) Commit(_a0 interface{}, _a1 interface{}) *StateDB_Commit_Call { + return &StateDB_Commit_Call{Call: _e.mock.On("Commit", _a0, _a1)} +} + +func (_c *StateDB_Commit_Call) Run(run func(_a0 uint64, _a1 bool)) *StateDB_Commit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64), args[1].(bool)) + }) + return _c +} + +func (_c *StateDB_Commit_Call) Return(_a0 common.Hash, _a1 error) *StateDB_Commit_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *StateDB_Commit_Call) RunAndReturn(run func(uint64, bool) (common.Hash, error)) *StateDB_Commit_Call { + _c.Call.Return(run) + return _c +} + +// Copy provides a mock function with given fields:. +func (_m *StateDB) Copy() corestate.StateDBI { + ret := _m.Called() + + var r0 corestate.StateDBI + if rf, ok := ret.Get(0).(func() corestate.StateDBI); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(corestate.StateDBI) + } + } + + return r0 +} + +// StateDB_Copy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Copy'. +type StateDB_Copy_Call struct { + *mock.Call +} + +// Copy is a helper method to define mock.On call. +func (_e *StateDB_Expecter) Copy() *StateDB_Copy_Call { + return &StateDB_Copy_Call{Call: _e.mock.On("Copy")} +} + +func (_c *StateDB_Copy_Call) Run(run func()) *StateDB_Copy_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_Copy_Call) Return(_a0 corestate.StateDBI) *StateDB_Copy_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Copy_Call) RunAndReturn(run func() corestate.StateDBI) *StateDB_Copy_Call { + _c.Call.Return(run) + return _c +} + +// CreateAccount provides a mock function with given fields: _a0. +func (_m *StateDB) CreateAccount(_a0 common.Address) { + _m.Called(_a0) +} + +// StateDB_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount'. +type StateDB_CreateAccount_Call struct { + *mock.Call +} + +// CreateAccount is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) CreateAccount(_a0 interface{}) *StateDB_CreateAccount_Call { + return &StateDB_CreateAccount_Call{Call: _e.mock.On("CreateAccount", _a0)} +} + +func (_c *StateDB_CreateAccount_Call) Run(run func(_a0 common.Address)) *StateDB_CreateAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_CreateAccount_Call) Return() *StateDB_CreateAccount_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_CreateAccount_Call) RunAndReturn(run func(common.Address)) *StateDB_CreateAccount_Call { + _c.Call.Return(run) + return _c +} + +// Database provides a mock function with given fields:. +func (_m *StateDB) Database() corestate.Database { + ret := _m.Called() + + var r0 corestate.Database + if rf, ok := ret.Get(0).(func() corestate.Database); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(corestate.Database) + } + } + + return r0 +} + +// StateDB_Database_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Database'. +type StateDB_Database_Call struct { + *mock.Call +} + +// Database is a helper method to define mock.On call. +func (_e *StateDB_Expecter) Database() *StateDB_Database_Call { + return &StateDB_Database_Call{Call: _e.mock.On("Database")} +} + +func (_c *StateDB_Database_Call) Run(run func()) *StateDB_Database_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_Database_Call) Return(_a0 corestate.Database) *StateDB_Database_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Database_Call) RunAndReturn(run func() corestate.Database) *StateDB_Database_Call { + _c.Call.Return(run) + return _c +} + +// Dump provides a mock function with given fields: opts. +func (_m *StateDB) Dump(opts *corestate.DumpConfig) []byte { + ret := _m.Called(opts) + + var r0 []byte + if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) []byte); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// StateDB_Dump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Dump'. +type StateDB_Dump_Call struct { + *mock.Call +} + +// Dump is a helper method to define mock.On call +// - opts *corestate.DumpConfig +func (_e *StateDB_Expecter) Dump(opts interface{}) *StateDB_Dump_Call { + return &StateDB_Dump_Call{Call: _e.mock.On("Dump", opts)} +} + +func (_c *StateDB_Dump_Call) Run(run func(opts *corestate.DumpConfig)) *StateDB_Dump_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *StateDB_Dump_Call) Return(_a0 []byte) *StateDB_Dump_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Dump_Call) RunAndReturn(run func(*corestate.DumpConfig) []byte) *StateDB_Dump_Call { + _c.Call.Return(run) + return _c +} + +// DumpToCollector provides a mock function with given fields: c, conf. +func (_m *StateDB) DumpToCollector(c corestate.DumpCollector, conf *corestate.DumpConfig) []byte { + ret := _m.Called(c, conf) + + var r0 []byte + if rf, ok := ret.Get(0).(func(corestate.DumpCollector, *corestate.DumpConfig) []byte); ok { + r0 = rf(c, conf) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// StateDB_DumpToCollector_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DumpToCollector'. +type StateDB_DumpToCollector_Call struct { + *mock.Call +} + +// DumpToCollector is a helper method to define mock.On call +// - c corestate.DumpCollector +// - conf *corestate.DumpConfig +func (_e *StateDB_Expecter) DumpToCollector(c interface{}, conf interface{}) *StateDB_DumpToCollector_Call { + return &StateDB_DumpToCollector_Call{Call: _e.mock.On("DumpToCollector", c, conf)} +} + +func (_c *StateDB_DumpToCollector_Call) Run(run func(c corestate.DumpCollector, conf *corestate.DumpConfig)) *StateDB_DumpToCollector_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(corestate.DumpCollector), args[1].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *StateDB_DumpToCollector_Call) Return(nextKey []byte) *StateDB_DumpToCollector_Call { + _c.Call.Return(nextKey) + return _c +} + +func (_c *StateDB_DumpToCollector_Call) RunAndReturn(run func(corestate.DumpCollector, *corestate.DumpConfig) []byte) *StateDB_DumpToCollector_Call { + _c.Call.Return(run) + return _c +} + +// Empty provides a mock function with given fields: _a0. +func (_m *StateDB) Empty(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// StateDB_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty'. +type StateDB_Empty_Call struct { + *mock.Call +} + +// Empty is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) Empty(_a0 interface{}) *StateDB_Empty_Call { + return &StateDB_Empty_Call{Call: _e.mock.On("Empty", _a0)} +} + +func (_c *StateDB_Empty_Call) Run(run func(_a0 common.Address)) *StateDB_Empty_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_Empty_Call) Return(_a0 bool) *StateDB_Empty_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Empty_Call) RunAndReturn(run func(common.Address) bool) *StateDB_Empty_Call { + _c.Call.Return(run) + return _c +} + +// Error provides a mock function with given fields:. +func (_m *StateDB) Error() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StateDB_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error'. +type StateDB_Error_Call struct { + *mock.Call +} + +// Error is a helper method to define mock.On call. +func (_e *StateDB_Expecter) Error() *StateDB_Error_Call { + return &StateDB_Error_Call{Call: _e.mock.On("Error")} +} + +func (_c *StateDB_Error_Call) Run(run func()) *StateDB_Error_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_Error_Call) Return(_a0 error) *StateDB_Error_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Error_Call) RunAndReturn(run func() error) *StateDB_Error_Call { + _c.Call.Return(run) + return _c +} + +// Exist provides a mock function with given fields: _a0. +func (_m *StateDB) Exist(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// StateDB_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist'. +type StateDB_Exist_Call struct { + *mock.Call +} + +// Exist is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) Exist(_a0 interface{}) *StateDB_Exist_Call { + return &StateDB_Exist_Call{Call: _e.mock.On("Exist", _a0)} +} + +func (_c *StateDB_Exist_Call) Run(run func(_a0 common.Address)) *StateDB_Exist_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_Exist_Call) Return(_a0 bool) *StateDB_Exist_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Exist_Call) RunAndReturn(run func(common.Address) bool) *StateDB_Exist_Call { + _c.Call.Return(run) + return _c +} + +// Finalise provides a mock function with given fields: deleteEmptyObjects. +func (_m *StateDB) Finalise(deleteEmptyObjects bool) { + _m.Called(deleteEmptyObjects) +} + +// StateDB_Finalise_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalise'. +type StateDB_Finalise_Call struct { + *mock.Call +} + +// Finalise is a helper method to define mock.On call +// - deleteEmptyObjects bool +func (_e *StateDB_Expecter) Finalise(deleteEmptyObjects interface{}) *StateDB_Finalise_Call { + return &StateDB_Finalise_Call{Call: _e.mock.On("Finalise", deleteEmptyObjects)} +} + +func (_c *StateDB_Finalise_Call) Run(run func(deleteEmptyObjects bool)) *StateDB_Finalise_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(bool)) + }) + return _c +} + +func (_c *StateDB_Finalise_Call) Return() *StateDB_Finalise_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_Finalise_Call) RunAndReturn(run func(bool)) *StateDB_Finalise_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: _a0. +func (_m *StateDB) GetBalance(_a0 common.Address) *big.Int { + ret := _m.Called(_a0) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(common.Address) *big.Int); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + return r0 +} + +// StateDB_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance'. +type StateDB_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) GetBalance(_a0 interface{}) *StateDB_GetBalance_Call { + return &StateDB_GetBalance_Call{Call: _e.mock.On("GetBalance", _a0)} +} + +func (_c *StateDB_GetBalance_Call) Run(run func(_a0 common.Address)) *StateDB_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetBalance_Call) Return(_a0 *big.Int) *StateDB_GetBalance_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int) *StateDB_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetCode provides a mock function with given fields: _a0. +func (_m *StateDB) GetCode(_a0 common.Address) []byte { + ret := _m.Called(_a0) + + var r0 []byte + if rf, ok := ret.Get(0).(func(common.Address) []byte); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// StateDB_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode'. +type StateDB_GetCode_Call struct { + *mock.Call +} + +// GetCode is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) GetCode(_a0 interface{}) *StateDB_GetCode_Call { + return &StateDB_GetCode_Call{Call: _e.mock.On("GetCode", _a0)} +} + +func (_c *StateDB_GetCode_Call) Run(run func(_a0 common.Address)) *StateDB_GetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetCode_Call) Return(_a0 []byte) *StateDB_GetCode_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetCode_Call) RunAndReturn(run func(common.Address) []byte) *StateDB_GetCode_Call { + _c.Call.Return(run) + return _c +} + +// GetCodeHash provides a mock function with given fields: _a0. +func (_m *StateDB) GetCodeHash(_a0 common.Address) common.Hash { + ret := _m.Called(_a0) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// StateDB_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash'. +type StateDB_GetCodeHash_Call struct { + *mock.Call +} + +// GetCodeHash is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) GetCodeHash(_a0 interface{}) *StateDB_GetCodeHash_Call { + return &StateDB_GetCodeHash_Call{Call: _e.mock.On("GetCodeHash", _a0)} +} + +func (_c *StateDB_GetCodeHash_Call) Run(run func(_a0 common.Address)) *StateDB_GetCodeHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetCodeHash_Call) Return(_a0 common.Hash) *StateDB_GetCodeHash_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetCodeHash_Call) RunAndReturn(run func(common.Address) common.Hash) *StateDB_GetCodeHash_Call { + _c.Call.Return(run) + return _c +} + +// GetCodeSize provides a mock function with given fields: _a0. +func (_m *StateDB) GetCodeSize(_a0 common.Address) int { + ret := _m.Called(_a0) + + var r0 int + if rf, ok := ret.Get(0).(func(common.Address) int); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// StateDB_GetCodeSize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeSize'. +type StateDB_GetCodeSize_Call struct { + *mock.Call +} + +// GetCodeSize is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) GetCodeSize(_a0 interface{}) *StateDB_GetCodeSize_Call { + return &StateDB_GetCodeSize_Call{Call: _e.mock.On("GetCodeSize", _a0)} +} + +func (_c *StateDB_GetCodeSize_Call) Run(run func(_a0 common.Address)) *StateDB_GetCodeSize_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetCodeSize_Call) Return(_a0 int) *StateDB_GetCodeSize_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetCodeSize_Call) RunAndReturn(run func(common.Address) int) *StateDB_GetCodeSize_Call { + _c.Call.Return(run) + return _c +} + +// GetCommittedState provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) GetCommittedState(_a0 common.Address, _a1 common.Hash) common.Hash { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// StateDB_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState'. +type StateDB_GetCommittedState_Call struct { + *mock.Call +} + +// GetCommittedState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *StateDB_Expecter) GetCommittedState(_a0 interface{}, _a1 interface{}) *StateDB_GetCommittedState_Call { + return &StateDB_GetCommittedState_Call{Call: _e.mock.On("GetCommittedState", _a0, _a1)} +} + +func (_c *StateDB_GetCommittedState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *StateDB_GetCommittedState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_GetCommittedState_Call) Return(_a0 common.Hash) *StateDB_GetCommittedState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetCommittedState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *StateDB_GetCommittedState_Call { + _c.Call.Return(run) + return _c +} + +// GetContext provides a mock function with given fields:. +func (_m *StateDB) GetContext() context.Context { + ret := _m.Called() + + var r0 context.Context + if rf, ok := ret.Get(0).(func() context.Context); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(context.Context) + } + } + + return r0 +} + +// StateDB_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext'. +type StateDB_GetContext_Call struct { + *mock.Call +} + +// GetContext is a helper method to define mock.On call. +func (_e *StateDB_Expecter) GetContext() *StateDB_GetContext_Call { + return &StateDB_GetContext_Call{Call: _e.mock.On("GetContext")} +} + +func (_c *StateDB_GetContext_Call) Run(run func()) *StateDB_GetContext_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_GetContext_Call) Return(_a0 context.Context) *StateDB_GetContext_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetContext_Call) RunAndReturn(run func() context.Context) *StateDB_GetContext_Call { + _c.Call.Return(run) + return _c +} + +// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash. +func (_m *StateDB) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { + ret := _m.Called(hash, blockNumber, blockHash) + + var r0 []*types.Log + if rf, ok := ret.Get(0).(func(common.Hash, uint64, common.Hash) []*types.Log); ok { + r0 = rf(hash, blockNumber, blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Log) + } + } + + return r0 +} + +// StateDB_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs'. +type StateDB_GetLogs_Call struct { + *mock.Call +} + +// GetLogs is a helper method to define mock.On call +// - hash common.Hash +// - blockNumber uint64 +// - blockHash common.Hash +func (_e *StateDB_Expecter) GetLogs(hash interface{}, blockNumber interface{}, blockHash interface{}) *StateDB_GetLogs_Call { + return &StateDB_GetLogs_Call{Call: _e.mock.On("GetLogs", hash, blockNumber, blockHash)} +} + +func (_c *StateDB_GetLogs_Call) Run(run func(hash common.Hash, blockNumber uint64, blockHash common.Hash)) *StateDB_GetLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(uint64), args[2].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_GetLogs_Call) Return(_a0 []*types.Log) *StateDB_GetLogs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetLogs_Call) RunAndReturn(run func(common.Hash, uint64, common.Hash) []*types.Log) *StateDB_GetLogs_Call { + _c.Call.Return(run) + return _c +} + +// GetNonce provides a mock function with given fields: _a0. +func (_m *StateDB) GetNonce(_a0 common.Address) uint64 { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(common.Address) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// StateDB_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce'. +type StateDB_GetNonce_Call struct { + *mock.Call +} + +// GetNonce is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) GetNonce(_a0 interface{}) *StateDB_GetNonce_Call { + return &StateDB_GetNonce_Call{Call: _e.mock.On("GetNonce", _a0)} +} + +func (_c *StateDB_GetNonce_Call) Run(run func(_a0 common.Address)) *StateDB_GetNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetNonce_Call) Return(_a0 uint64) *StateDB_GetNonce_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetNonce_Call) RunAndReturn(run func(common.Address) uint64) *StateDB_GetNonce_Call { + _c.Call.Return(run) + return _c +} + +// GetOrNewStateObject provides a mock function with given fields: addr. +func (_m *StateDB) GetOrNewStateObject(addr common.Address) *corestate.StateObject { + ret := _m.Called(addr) + + var r0 *corestate.StateObject + if rf, ok := ret.Get(0).(func(common.Address) *corestate.StateObject); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*corestate.StateObject) + } + } + + return r0 +} + +// StateDB_GetOrNewStateObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOrNewStateObject'. +type StateDB_GetOrNewStateObject_Call struct { + *mock.Call +} + +// GetOrNewStateObject is a helper method to define mock.On call +// - addr common.Address +func (_e *StateDB_Expecter) GetOrNewStateObject(addr interface{}) *StateDB_GetOrNewStateObject_Call { + return &StateDB_GetOrNewStateObject_Call{Call: _e.mock.On("GetOrNewStateObject", addr)} +} + +func (_c *StateDB_GetOrNewStateObject_Call) Run(run func(addr common.Address)) *StateDB_GetOrNewStateObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetOrNewStateObject_Call) Return(_a0 *corestate.StateObject) *StateDB_GetOrNewStateObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetOrNewStateObject_Call) RunAndReturn(run func(common.Address) *corestate.StateObject) *StateDB_GetOrNewStateObject_Call { + _c.Call.Return(run) + return _c +} + +// GetPrecompileManager provides a mock function with given fields:. +func (_m *StateDB) GetPrecompileManager() interface{} { + ret := _m.Called() + + var r0 interface{} + if rf, ok := ret.Get(0).(func() interface{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + return r0 +} + +// StateDB_GetPrecompileManager_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPrecompileManager'. +type StateDB_GetPrecompileManager_Call struct { + *mock.Call +} + +// GetPrecompileManager is a helper method to define mock.On call. +func (_e *StateDB_Expecter) GetPrecompileManager() *StateDB_GetPrecompileManager_Call { + return &StateDB_GetPrecompileManager_Call{Call: _e.mock.On("GetPrecompileManager")} +} + +func (_c *StateDB_GetPrecompileManager_Call) Run(run func()) *StateDB_GetPrecompileManager_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_GetPrecompileManager_Call) Return(_a0 interface{}) *StateDB_GetPrecompileManager_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetPrecompileManager_Call) RunAndReturn(run func() interface{}) *StateDB_GetPrecompileManager_Call { + _c.Call.Return(run) + return _c +} + +// GetRefund provides a mock function with given fields:. +func (_m *StateDB) GetRefund() uint64 { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// StateDB_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund'. +type StateDB_GetRefund_Call struct { + *mock.Call +} + +// GetRefund is a helper method to define mock.On call. +func (_e *StateDB_Expecter) GetRefund() *StateDB_GetRefund_Call { + return &StateDB_GetRefund_Call{Call: _e.mock.On("GetRefund")} +} + +func (_c *StateDB_GetRefund_Call) Run(run func()) *StateDB_GetRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_GetRefund_Call) Return(_a0 uint64) *StateDB_GetRefund_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetRefund_Call) RunAndReturn(run func() uint64) *StateDB_GetRefund_Call { + _c.Call.Return(run) + return _c +} + +// GetState provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// StateDB_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState'. +type StateDB_GetState_Call struct { + *mock.Call +} + +// GetState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *StateDB_Expecter) GetState(_a0 interface{}, _a1 interface{}) *StateDB_GetState_Call { + return &StateDB_GetState_Call{Call: _e.mock.On("GetState", _a0, _a1)} +} + +func (_c *StateDB_GetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *StateDB_GetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_GetState_Call) Return(_a0 common.Hash) *StateDB_GetState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *StateDB_GetState_Call { + _c.Call.Return(run) + return _c +} + +// GetStorageRoot provides a mock function with given fields: addr. +func (_m *StateDB) GetStorageRoot(addr common.Address) common.Hash { + ret := _m.Called(addr) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// StateDB_GetStorageRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetStorageRoot'. +type StateDB_GetStorageRoot_Call struct { + *mock.Call +} + +// GetStorageRoot is a helper method to define mock.On call +// - addr common.Address +func (_e *StateDB_Expecter) GetStorageRoot(addr interface{}) *StateDB_GetStorageRoot_Call { + return &StateDB_GetStorageRoot_Call{Call: _e.mock.On("GetStorageRoot", addr)} +} + +func (_c *StateDB_GetStorageRoot_Call) Run(run func(addr common.Address)) *StateDB_GetStorageRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_GetStorageRoot_Call) Return(_a0 common.Hash) *StateDB_GetStorageRoot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetStorageRoot_Call) RunAndReturn(run func(common.Address) common.Hash) *StateDB_GetStorageRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetTransientState provides a mock function with given fields: addr, key. +func (_m *StateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash { + ret := _m.Called(addr, key) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(addr, key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// StateDB_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState'. +type StateDB_GetTransientState_Call struct { + *mock.Call +} + +// GetTransientState is a helper method to define mock.On call +// - addr common.Address +// - key common.Hash +func (_e *StateDB_Expecter) GetTransientState(addr interface{}, key interface{}) *StateDB_GetTransientState_Call { + return &StateDB_GetTransientState_Call{Call: _e.mock.On("GetTransientState", addr, key)} +} + +func (_c *StateDB_GetTransientState_Call) Run(run func(addr common.Address, key common.Hash)) *StateDB_GetTransientState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_GetTransientState_Call) Return(_a0 common.Hash) *StateDB_GetTransientState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_GetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *StateDB_GetTransientState_Call { + _c.Call.Return(run) + return _c +} + +// HasSelfDestructed provides a mock function with given fields: _a0. +func (_m *StateDB) HasSelfDestructed(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// StateDB_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed'. +type StateDB_HasSelfDestructed_Call struct { + *mock.Call +} + +// HasSelfDestructed is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) HasSelfDestructed(_a0 interface{}) *StateDB_HasSelfDestructed_Call { + return &StateDB_HasSelfDestructed_Call{Call: _e.mock.On("HasSelfDestructed", _a0)} +} + +func (_c *StateDB_HasSelfDestructed_Call) Run(run func(_a0 common.Address)) *StateDB_HasSelfDestructed_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_HasSelfDestructed_Call) Return(_a0 bool) *StateDB_HasSelfDestructed_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_HasSelfDestructed_Call) RunAndReturn(run func(common.Address) bool) *StateDB_HasSelfDestructed_Call { + _c.Call.Return(run) + return _c +} + +// IntermediateRoot provides a mock function with given fields: deleteEmptyObjects. +func (_m *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { + ret := _m.Called(deleteEmptyObjects) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(bool) common.Hash); ok { + r0 = rf(deleteEmptyObjects) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// StateDB_IntermediateRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IntermediateRoot'. +type StateDB_IntermediateRoot_Call struct { + *mock.Call +} + +// IntermediateRoot is a helper method to define mock.On call +// - deleteEmptyObjects bool +func (_e *StateDB_Expecter) IntermediateRoot(deleteEmptyObjects interface{}) *StateDB_IntermediateRoot_Call { + return &StateDB_IntermediateRoot_Call{Call: _e.mock.On("IntermediateRoot", deleteEmptyObjects)} +} + +func (_c *StateDB_IntermediateRoot_Call) Run(run func(deleteEmptyObjects bool)) *StateDB_IntermediateRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(bool)) + }) + return _c +} + +func (_c *StateDB_IntermediateRoot_Call) Return(_a0 common.Hash) *StateDB_IntermediateRoot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_IntermediateRoot_Call) RunAndReturn(run func(bool) common.Hash) *StateDB_IntermediateRoot_Call { + _c.Call.Return(run) + return _c +} + +// IteratorDump provides a mock function with given fields: opts. +func (_m *StateDB) IteratorDump(opts *corestate.DumpConfig) corestate.IteratorDump { + ret := _m.Called(opts) + + var r0 corestate.IteratorDump + if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) corestate.IteratorDump); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(corestate.IteratorDump) + } + + return r0 +} + +// StateDB_IteratorDump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IteratorDump'. +type StateDB_IteratorDump_Call struct { + *mock.Call +} + +// IteratorDump is a helper method to define mock.On call +// - opts *corestate.DumpConfig +func (_e *StateDB_Expecter) IteratorDump(opts interface{}) *StateDB_IteratorDump_Call { + return &StateDB_IteratorDump_Call{Call: _e.mock.On("IteratorDump", opts)} +} + +func (_c *StateDB_IteratorDump_Call) Run(run func(opts *corestate.DumpConfig)) *StateDB_IteratorDump_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *StateDB_IteratorDump_Call) Return(_a0 corestate.IteratorDump) *StateDB_IteratorDump_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_IteratorDump_Call) RunAndReturn(run func(*corestate.DumpConfig) corestate.IteratorDump) *StateDB_IteratorDump_Call { + _c.Call.Return(run) + return _c +} + +// Logs provides a mock function with given fields:. +func (_m *StateDB) Logs() []*types.Log { + ret := _m.Called() + + var r0 []*types.Log + if rf, ok := ret.Get(0).(func() []*types.Log); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Log) + } + } + + return r0 +} + +// StateDB_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs'. +type StateDB_Logs_Call struct { + *mock.Call +} + +// Logs is a helper method to define mock.On call. +func (_e *StateDB_Expecter) Logs() *StateDB_Logs_Call { + return &StateDB_Logs_Call{Call: _e.mock.On("Logs")} +} + +func (_c *StateDB_Logs_Call) Run(run func()) *StateDB_Logs_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_Logs_Call) Return(_a0 []*types.Log) *StateDB_Logs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Logs_Call) RunAndReturn(run func() []*types.Log) *StateDB_Logs_Call { + _c.Call.Return(run) + return _c +} + +// Preimages provides a mock function with given fields:. +func (_m *StateDB) Preimages() map[common.Hash][]byte { + ret := _m.Called() + + var r0 map[common.Hash][]byte + if rf, ok := ret.Get(0).(func() map[common.Hash][]byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[common.Hash][]byte) + } + } + + return r0 +} + +// StateDB_Preimages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Preimages'. +type StateDB_Preimages_Call struct { + *mock.Call +} + +// Preimages is a helper method to define mock.On call. +func (_e *StateDB_Expecter) Preimages() *StateDB_Preimages_Call { + return &StateDB_Preimages_Call{Call: _e.mock.On("Preimages")} +} + +func (_c *StateDB_Preimages_Call) Run(run func()) *StateDB_Preimages_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_Preimages_Call) Return(_a0 map[common.Hash][]byte) *StateDB_Preimages_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Preimages_Call) RunAndReturn(run func() map[common.Hash][]byte) *StateDB_Preimages_Call { + _c.Call.Return(run) + return _c +} + +// Prepare provides a mock function with given fields: rules, sender, coinbase, dest, precompiles, txAccesses. +func (_m *StateDB) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { + _m.Called(rules, sender, coinbase, dest, precompiles, txAccesses) +} + +// StateDB_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare'. +type StateDB_Prepare_Call struct { + *mock.Call +} + +// Prepare is a helper method to define mock.On call +// - rules params.Rules +// - sender common.Address +// - coinbase common.Address +// - dest *common.Address +// - precompiles []common.Address +// - txAccesses types.AccessList +func (_e *StateDB_Expecter) Prepare(rules interface{}, sender interface{}, coinbase interface{}, dest interface{}, precompiles interface{}, txAccesses interface{}) *StateDB_Prepare_Call { + return &StateDB_Prepare_Call{Call: _e.mock.On("Prepare", rules, sender, coinbase, dest, precompiles, txAccesses)} +} + +func (_c *StateDB_Prepare_Call) Run(run func(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList)) *StateDB_Prepare_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(params.Rules), args[1].(common.Address), args[2].(common.Address), args[3].(*common.Address), args[4].([]common.Address), args[5].(types.AccessList)) + }) + return _c +} + +func (_c *StateDB_Prepare_Call) Return() *StateDB_Prepare_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_Prepare_Call) RunAndReturn(run func(params.Rules, common.Address, common.Address, *common.Address, []common.Address, types.AccessList)) *StateDB_Prepare_Call { + _c.Call.Return(run) + return _c +} + +// RawDump provides a mock function with given fields: opts. +func (_m *StateDB) RawDump(opts *corestate.DumpConfig) corestate.Dump { + ret := _m.Called(opts) + + var r0 corestate.Dump + if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) corestate.Dump); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(corestate.Dump) + } + + return r0 +} + +// StateDB_RawDump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RawDump'. +type StateDB_RawDump_Call struct { + *mock.Call +} + +// RawDump is a helper method to define mock.On call +// - opts *corestate.DumpConfig +func (_e *StateDB_Expecter) RawDump(opts interface{}) *StateDB_RawDump_Call { + return &StateDB_RawDump_Call{Call: _e.mock.On("RawDump", opts)} +} + +func (_c *StateDB_RawDump_Call) Run(run func(opts *corestate.DumpConfig)) *StateDB_RawDump_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *StateDB_RawDump_Call) Return(_a0 corestate.Dump) *StateDB_RawDump_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_RawDump_Call) RunAndReturn(run func(*corestate.DumpConfig) corestate.Dump) *StateDB_RawDump_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0. +func (_m *StateDB) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// StateDB_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +type StateDB_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *StateDB_Expecter) RevertToSnapshot(_a0 interface{}) *StateDB_RevertToSnapshot_Call { + return &StateDB_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *StateDB_RevertToSnapshot_Call) Run(run func(_a0 int)) *StateDB_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *StateDB_RevertToSnapshot_Call) Return() *StateDB_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_RevertToSnapshot_Call) RunAndReturn(run func(int)) *StateDB_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SelfDestruct provides a mock function with given fields: _a0. +func (_m *StateDB) SelfDestruct(_a0 common.Address) { + _m.Called(_a0) +} + +// StateDB_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct'. +type StateDB_SelfDestruct_Call struct { + *mock.Call +} + +// SelfDestruct is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) SelfDestruct(_a0 interface{}) *StateDB_SelfDestruct_Call { + return &StateDB_SelfDestruct_Call{Call: _e.mock.On("SelfDestruct", _a0)} +} + +func (_c *StateDB_SelfDestruct_Call) Run(run func(_a0 common.Address)) *StateDB_SelfDestruct_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_SelfDestruct_Call) Return() *StateDB_SelfDestruct_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SelfDestruct_Call) RunAndReturn(run func(common.Address)) *StateDB_SelfDestruct_Call { + _c.Call.Return(run) + return _c +} + +// Selfdestruct6780 provides a mock function with given fields: _a0. +func (_m *StateDB) Selfdestruct6780(_a0 common.Address) { + _m.Called(_a0) +} + +// StateDB_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780'. +type StateDB_Selfdestruct6780_Call struct { + *mock.Call +} + +// Selfdestruct6780 is a helper method to define mock.On call +// - _a0 common.Address +func (_e *StateDB_Expecter) Selfdestruct6780(_a0 interface{}) *StateDB_Selfdestruct6780_Call { + return &StateDB_Selfdestruct6780_Call{Call: _e.mock.On("Selfdestruct6780", _a0)} +} + +func (_c *StateDB_Selfdestruct6780_Call) Run(run func(_a0 common.Address)) *StateDB_Selfdestruct6780_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *StateDB_Selfdestruct6780_Call) Return() *StateDB_Selfdestruct6780_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_Selfdestruct6780_Call) RunAndReturn(run func(common.Address)) *StateDB_Selfdestruct6780_Call { + _c.Call.Return(run) + return _c +} + +// SetBalance provides a mock function with given fields: addr, amount. +func (_m *StateDB) SetBalance(addr common.Address, amount *big.Int) { + _m.Called(addr, amount) +} + +// StateDB_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance'. +type StateDB_SetBalance_Call struct { + *mock.Call +} + +// SetBalance is a helper method to define mock.On call +// - addr common.Address +// - amount *big.Int +func (_e *StateDB_Expecter) SetBalance(addr interface{}, amount interface{}) *StateDB_SetBalance_Call { + return &StateDB_SetBalance_Call{Call: _e.mock.On("SetBalance", addr, amount)} +} + +func (_c *StateDB_SetBalance_Call) Run(run func(addr common.Address, amount *big.Int)) *StateDB_SetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *StateDB_SetBalance_Call) Return() *StateDB_SetBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *StateDB_SetBalance_Call { + _c.Call.Return(run) + return _c +} + +// SetCode provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) SetCode(_a0 common.Address, _a1 []byte) { + _m.Called(_a0, _a1) +} + +// StateDB_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode'. +type StateDB_SetCode_Call struct { + *mock.Call +} + +// SetCode is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 []byte +func (_e *StateDB_Expecter) SetCode(_a0 interface{}, _a1 interface{}) *StateDB_SetCode_Call { + return &StateDB_SetCode_Call{Call: _e.mock.On("SetCode", _a0, _a1)} +} + +func (_c *StateDB_SetCode_Call) Run(run func(_a0 common.Address, _a1 []byte)) *StateDB_SetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].([]byte)) + }) + return _c +} + +func (_c *StateDB_SetCode_Call) Return() *StateDB_SetCode_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetCode_Call) RunAndReturn(run func(common.Address, []byte)) *StateDB_SetCode_Call { + _c.Call.Return(run) + return _c +} + +// SetNonce provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) SetNonce(_a0 common.Address, _a1 uint64) { + _m.Called(_a0, _a1) +} + +// StateDB_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce'. +type StateDB_SetNonce_Call struct { + *mock.Call +} + +// SetNonce is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 uint64 +func (_e *StateDB_Expecter) SetNonce(_a0 interface{}, _a1 interface{}) *StateDB_SetNonce_Call { + return &StateDB_SetNonce_Call{Call: _e.mock.On("SetNonce", _a0, _a1)} +} + +func (_c *StateDB_SetNonce_Call) Run(run func(_a0 common.Address, _a1 uint64)) *StateDB_SetNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(uint64)) + }) + return _c +} + +func (_c *StateDB_SetNonce_Call) Return() *StateDB_SetNonce_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetNonce_Call) RunAndReturn(run func(common.Address, uint64)) *StateDB_SetNonce_Call { + _c.Call.Return(run) + return _c +} + +// SetState provides a mock function with given fields: _a0, _a1, _a2. +func (_m *StateDB) SetState(_a0 common.Address, _a1 common.Hash, _a2 common.Hash) { + _m.Called(_a0, _a1, _a2) +} + +// StateDB_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState'. +type StateDB_SetState_Call struct { + *mock.Call +} + +// SetState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +// - _a2 common.Hash +func (_e *StateDB_Expecter) SetState(_a0 interface{}, _a1 interface{}, _a2 interface{}) *StateDB_SetState_Call { + return &StateDB_SetState_Call{Call: _e.mock.On("SetState", _a0, _a1, _a2)} +} + +func (_c *StateDB_SetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash, _a2 common.Hash)) *StateDB_SetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_SetState_Call) Return() *StateDB_SetState_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *StateDB_SetState_Call { + _c.Call.Return(run) + return _c +} + +// SetStorage provides a mock function with given fields: addr, storage. +func (_m *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { + _m.Called(addr, storage) +} + +// StateDB_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage'. +type StateDB_SetStorage_Call struct { + *mock.Call +} + +// SetStorage is a helper method to define mock.On call +// - addr common.Address +// - storage map[common.Hash]common.Hash +func (_e *StateDB_Expecter) SetStorage(addr interface{}, storage interface{}) *StateDB_SetStorage_Call { + return &StateDB_SetStorage_Call{Call: _e.mock.On("SetStorage", addr, storage)} +} + +func (_c *StateDB_SetStorage_Call) Run(run func(addr common.Address, storage map[common.Hash]common.Hash)) *StateDB_SetStorage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(map[common.Hash]common.Hash)) + }) + return _c +} + +func (_c *StateDB_SetStorage_Call) Return() *StateDB_SetStorage_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetStorage_Call) RunAndReturn(run func(common.Address, map[common.Hash]common.Hash)) *StateDB_SetStorage_Call { + _c.Call.Return(run) + return _c +} + +// SetTransientState provides a mock function with given fields: addr, key, value. +func (_m *StateDB) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { + _m.Called(addr, key, value) +} + +// StateDB_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState'. +type StateDB_SetTransientState_Call struct { + *mock.Call +} + +// SetTransientState is a helper method to define mock.On call +// - addr common.Address +// - key common.Hash +// - value common.Hash +func (_e *StateDB_Expecter) SetTransientState(addr interface{}, key interface{}, value interface{}) *StateDB_SetTransientState_Call { + return &StateDB_SetTransientState_Call{Call: _e.mock.On("SetTransientState", addr, key, value)} +} + +func (_c *StateDB_SetTransientState_Call) Run(run func(addr common.Address, key common.Hash, value common.Hash)) *StateDB_SetTransientState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_SetTransientState_Call) Return() *StateDB_SetTransientState_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *StateDB_SetTransientState_Call { + _c.Call.Return(run) + return _c +} + +// SetTxContext provides a mock function with given fields: thash, ti. +func (_m *StateDB) SetTxContext(thash common.Hash, ti int) { + _m.Called(thash, ti) +} + +// StateDB_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext'. +type StateDB_SetTxContext_Call struct { + *mock.Call +} + +// SetTxContext is a helper method to define mock.On call +// - thash common.Hash +// - ti int +func (_e *StateDB_Expecter) SetTxContext(thash interface{}, ti interface{}) *StateDB_SetTxContext_Call { + return &StateDB_SetTxContext_Call{Call: _e.mock.On("SetTxContext", thash, ti)} +} + +func (_c *StateDB_SetTxContext_Call) Run(run func(thash common.Hash, ti int)) *StateDB_SetTxContext_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(int)) + }) + return _c +} + +func (_c *StateDB_SetTxContext_Call) Return() *StateDB_SetTxContext_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SetTxContext_Call) RunAndReturn(run func(common.Hash, int)) *StateDB_SetTxContext_Call { + _c.Call.Return(run) + return _c +} + +// SlotInAccessList provides a mock function with given fields: addr, slot. +func (_m *StateDB) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { + ret := _m.Called(addr, slot) + + var r0 bool + var r1 bool + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) (bool, bool)); ok { + return rf(addr, slot) + } + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) bool); ok { + r0 = rf(addr, slot) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(common.Address, common.Hash) bool); ok { + r1 = rf(addr, slot) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// StateDB_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList'. +type StateDB_SlotInAccessList_Call struct { + *mock.Call +} + +// SlotInAccessList is a helper method to define mock.On call +// - addr common.Address +// - slot common.Hash +func (_e *StateDB_Expecter) SlotInAccessList(addr interface{}, slot interface{}) *StateDB_SlotInAccessList_Call { + return &StateDB_SlotInAccessList_Call{Call: _e.mock.On("SlotInAccessList", addr, slot)} +} + +func (_c *StateDB_SlotInAccessList_Call) Run(run func(addr common.Address, slot common.Hash)) *StateDB_SlotInAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *StateDB_SlotInAccessList_Call) Return(addressOk bool, slotOk bool) *StateDB_SlotInAccessList_Call { + _c.Call.Return(addressOk, slotOk) + return _c +} + +func (_c *StateDB_SlotInAccessList_Call) RunAndReturn(run func(common.Address, common.Hash) (bool, bool)) *StateDB_SlotInAccessList_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields:. +func (_m *StateDB) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// StateDB_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +type StateDB_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call. +func (_e *StateDB_Expecter) Snapshot() *StateDB_Snapshot_Call { + return &StateDB_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *StateDB_Snapshot_Call) Run(run func()) *StateDB_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_Snapshot_Call) Return(_a0 int) *StateDB_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_Snapshot_Call) RunAndReturn(run func() int) *StateDB_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// StartPrefetcher provides a mock function with given fields: namespace. +func (_m *StateDB) StartPrefetcher(namespace string) { + _m.Called(namespace) +} + +// StateDB_StartPrefetcher_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StartPrefetcher'. +type StateDB_StartPrefetcher_Call struct { + *mock.Call +} + +// StartPrefetcher is a helper method to define mock.On call +// - namespace string +func (_e *StateDB_Expecter) StartPrefetcher(namespace interface{}) *StateDB_StartPrefetcher_Call { + return &StateDB_StartPrefetcher_Call{Call: _e.mock.On("StartPrefetcher", namespace)} +} + +func (_c *StateDB_StartPrefetcher_Call) Run(run func(namespace string)) *StateDB_StartPrefetcher_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *StateDB_StartPrefetcher_Call) Return() *StateDB_StartPrefetcher_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_StartPrefetcher_Call) RunAndReturn(run func(string)) *StateDB_StartPrefetcher_Call { + _c.Call.Return(run) + return _c +} + +// StopPrefetcher provides a mock function with given fields:. +func (_m *StateDB) StopPrefetcher() { + _m.Called() +} + +// StateDB_StopPrefetcher_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StopPrefetcher'. +type StateDB_StopPrefetcher_Call struct { + *mock.Call +} + +// StopPrefetcher is a helper method to define mock.On call. +func (_e *StateDB_Expecter) StopPrefetcher() *StateDB_StopPrefetcher_Call { + return &StateDB_StopPrefetcher_Call{Call: _e.mock.On("StopPrefetcher")} +} + +func (_c *StateDB_StopPrefetcher_Call) Run(run func()) *StateDB_StopPrefetcher_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_StopPrefetcher_Call) Return() *StateDB_StopPrefetcher_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_StopPrefetcher_Call) RunAndReturn(run func()) *StateDB_StopPrefetcher_Call { + _c.Call.Return(run) + return _c +} + +// SubBalance provides a mock function with given fields: _a0, _a1. +func (_m *StateDB) SubBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// StateDB_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance'. +type StateDB_SubBalance_Call struct { + *mock.Call +} + +// SubBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *StateDB_Expecter) SubBalance(_a0 interface{}, _a1 interface{}) *StateDB_SubBalance_Call { + return &StateDB_SubBalance_Call{Call: _e.mock.On("SubBalance", _a0, _a1)} +} + +func (_c *StateDB_SubBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *StateDB_SubBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *StateDB_SubBalance_Call) Return() *StateDB_SubBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SubBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *StateDB_SubBalance_Call { + _c.Call.Return(run) + return _c +} + +// SubRefund provides a mock function with given fields: _a0. +func (_m *StateDB) SubRefund(_a0 uint64) { + _m.Called(_a0) +} + +// StateDB_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund'. +type StateDB_SubRefund_Call struct { + *mock.Call +} + +// SubRefund is a helper method to define mock.On call +// - _a0 uint64 +func (_e *StateDB_Expecter) SubRefund(_a0 interface{}) *StateDB_SubRefund_Call { + return &StateDB_SubRefund_Call{Call: _e.mock.On("SubRefund", _a0)} +} + +func (_c *StateDB_SubRefund_Call) Run(run func(_a0 uint64)) *StateDB_SubRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *StateDB_SubRefund_Call) Return() *StateDB_SubRefund_Call { + _c.Call.Return() + return _c +} + +func (_c *StateDB_SubRefund_Call) RunAndReturn(run func(uint64)) *StateDB_SubRefund_Call { + _c.Call.Return(run) + return _c +} + +// TxIndex provides a mock function with given fields:. +func (_m *StateDB) TxIndex() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// StateDB_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex'. +type StateDB_TxIndex_Call struct { + *mock.Call +} + +// TxIndex is a helper method to define mock.On call. +func (_e *StateDB_Expecter) TxIndex() *StateDB_TxIndex_Call { + return &StateDB_TxIndex_Call{Call: _e.mock.On("TxIndex")} +} + +func (_c *StateDB_TxIndex_Call) Run(run func()) *StateDB_TxIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *StateDB_TxIndex_Call) Return(_a0 int) *StateDB_TxIndex_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StateDB_TxIndex_Call) RunAndReturn(run func() int) *StateDB_TxIndex_Call { + _c.Call.Return(run) + return _c +} + +// NewStateDB creates a new instance of StateDB. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewStateDB(t interface { + mock.TestingT + Cleanup(func()) +}) *StateDB { + mock := &StateDB{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index 823092de88..b8708f2fbd 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -21,26 +21,29 @@ package state import ( + "context" + + "github.com/ethereum/go-ethereum/core/state" + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/state/journal" coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/params" "pkg.berachain.dev/polaris/lib/snapshot" libtypes "pkg.berachain.dev/polaris/lib/types" ) -// PrecompilePlugin defines the interface to check for the existence of a precompile at an -// address. +// For mocks. type PrecompilePlugin interface { - Has(common.Address) bool + precompile.Plugin } // stateDB is a struct that holds the plugins and controller to manage Ethereum state. type stateDB struct { // Plugin is injected by the chain running the Polaris EVM. Plugin - pp PrecompilePlugin + pp precompile.Plugin // Journals built internally and required for the stateDB. journal.Log @@ -51,21 +54,35 @@ type stateDB struct { // ctrl is used to manage snapshots and reverts across plugins and journals. ctrl libtypes.Controller[string, libtypes.Controllable[string]] + + // rules is used to store the rules for the chain. + rules *params.Rules } -// NewStateDB returns a vm.PolarisStateDB with the given StatePlugin and new journals. -func NewStateDB(sp Plugin, pp PrecompilePlugin) vm.PolarisStateDB { +type ( + // StateDB is an alias for StateDBI. + StateDB = state.StateDBI //nolint:revive // to match geth. + + // PolarStateDB is a Polaris StateDB with a context. + PolarStateDB interface { + StateDB + GetContext() context.Context + } +) + +// NewStateDB returns a vm.PolarStateDB with the given StatePlugin and new journals. +func NewStateDB(sp Plugin, pp precompile.Plugin) PolarStateDB { return newStateDBWithJournals( sp, pp, journal.NewLogs(), journal.NewRefund(), journal.NewAccesslist(), journal.NewSelfDestructs(sp), journal.NewTransientStorage(), ) } -// newStateDBWithJournals returns a vm.PolarisStateDB with the given StatePlugin and journals. +// newStateDBWithJournals returns a vm.PolarStateDB with the given StatePlugin and journals. func newStateDBWithJournals( - sp Plugin, pp PrecompilePlugin, lj journal.Log, rj journal.Refund, aj journal.Accesslist, + sp Plugin, pp precompile.Plugin, lj journal.Log, rj journal.Refund, aj journal.Accesslist, sj journal.SelfDestructs, tj journal.TransientStorage, -) vm.PolarisStateDB { +) *stateDB { if sp == nil { panic("StatePlugin is nil in newStateDBWithJournals") } else if pp == nil { @@ -102,16 +119,20 @@ func (sdb *stateDB) GetPlugin() Plugin { return sdb.Plugin } +func (sdb *stateDB) GetPrecompileManager() any { + return sdb.pp +} + // ============================================================================= // Snapshot // ============================================================================= -// Snapshot implements vm.PolarisStateDB. +// Snapshot implements vm.PolarStateDB. func (sdb *stateDB) Snapshot() int { return sdb.ctrl.Snapshot() } -// RevertToSnapshot implements vm.PolarisStateDB. +// RevertToSnapshot implements vm.PolarStateDB. func (sdb *stateDB) RevertToSnapshot(id int) { sdb.ctrl.RevertToSnapshot(id) } @@ -134,7 +155,7 @@ func (sdb *stateDB) IntermediateRoot(bool) common.Hash { return common.Hash{} } -// Commit implements vm.PolarisStateDB. +// Commit implements vm.PolarStateDB. func (sdb *stateDB) Commit(_ uint64, _ bool) (common.Hash, error) { if err := sdb.Error(); err != nil { return common.Hash{}, err @@ -146,11 +167,15 @@ func (sdb *stateDB) Commit(_ uint64, _ bool) (common.Hash, error) { // Prepare // ============================================================================= -// Implementation taken directly from the vm.PolarisStateDB in Go-Ethereum. +// Implementation taken directly from the vm.PolarStateDB in Go-Ethereum. // -// Prepare implements vm.PolarisStateDB. +// Prepare implements vm.PolarStateDB. func (sdb *stateDB) Prepare(rules params.Rules, sender, coinbase common.Address, - dest *common.Address, precompiles []common.Address, txAccesses coretypes.AccessList) { + dest *common.Address, precompiles []common.Address, txAccesses coretypes.AccessList, +) { + copyRules := rules + sdb.rules = ©Rules + if rules.IsBerlin { // Clear out any leftover from previous executions sdb.Accesslist = journal.NewAccesslist() @@ -181,7 +206,7 @@ func (sdb *stateDB) Prepare(rules params.Rules, sender, coinbase common.Address, // PreImage // ============================================================================= -// AddPreimage implements the the vm.PolarisStateDB interface, but currently +// AddPreimage implements the the vm.PolarStateDB interface, but currently // performs a no-op since the EnablePreimageRecording flag is disabled. func (sdb *stateDB) AddPreimage(_ common.Hash, _ []byte) {} @@ -195,17 +220,17 @@ func (sdb *stateDB) Preimages() map[common.Hash][]byte { // Code // ============================================================================= -// GetCodeSize implements the vm.PolarisStateDB interface by returning the size of the +// GetCodeSize implements the vm.PolarStateDB interface by returning the size of the // code associated with the given account. func (sdb *stateDB) GetCode(addr common.Address) []byte { // We return a single byte for client compatibility w/precompiles. - if sdb.pp.Has(addr) { + if _, ok := sdb.pp.Get(addr, sdb.rules); ok { return []byte{0x01} } return sdb.Plugin.GetCode(addr) } -// GetCodeSize implements the vm.PolarisStateDB interface by returning the size of the +// GetCodeSize implements the vm.PolarStateDB interface by returning the size of the // code associated with the given account. func (sdb *stateDB) GetCodeSize(addr common.Address) int { return len(sdb.GetCode(addr)) @@ -216,30 +241,30 @@ func (sdb *stateDB) GetCodeSize(addr common.Address) int { // ============================================================================= // Copy returns a new statedb with cloned plugin and journals. -func (sdb *stateDB) Copy() StateDBI { +func (sdb *stateDB) Copy() StateDB { return newStateDBWithJournals( sdb.Plugin.Clone(), sdb.pp, sdb.Log.Clone(), sdb.Refund.Clone(), sdb.Accesslist.Clone(), sdb.SelfDestructs.Clone(), sdb.TransientStorage.Clone(), ) } -func (sdb *stateDB) DumpToCollector(_ DumpCollector, _ *DumpConfig) []byte { +func (sdb *stateDB) DumpToCollector(_ state.DumpCollector, _ *state.DumpConfig) []byte { return nil } -func (sdb *stateDB) Dump(_ *DumpConfig) []byte { +func (sdb *stateDB) Dump(_ *state.DumpConfig) []byte { return nil } -func (sdb *stateDB) RawDump(_ *DumpConfig) Dump { - return Dump{} +func (sdb *stateDB) RawDump(_ *state.DumpConfig) state.Dump { + return state.Dump{} } -func (sdb *stateDB) IteratorDump(_ *DumpConfig) IteratorDump { - return IteratorDump{} +func (sdb *stateDB) IteratorDump(_ *state.DumpConfig) state.IteratorDump { + return state.IteratorDump{} } -func (sdb *stateDB) Database() Database { +func (sdb *stateDB) Database() state.Database { return nil } @@ -247,7 +272,7 @@ func (sdb *stateDB) StartPrefetcher(_ string) {} func (sdb *stateDB) StopPrefetcher() {} -func (sdb *stateDB) StorageTrie(_ common.Address) (Trie, error) { +func (sdb *stateDB) StorageTrie(_ common.Address) (state.Trie, error) { return nil, nil } @@ -259,7 +284,7 @@ func (sdb *stateDB) GetProof(_ common.Address) ([][]byte, error) { return nil, nil } -func (sdb *stateDB) GetOrNewStateObject(_ common.Address) *StateObject { +func (sdb *stateDB) GetOrNewStateObject(_ common.Address) *state.StateObject { return nil } diff --git a/eth/core/state/statedb_test.go b/eth/core/state/statedb_test.go index 54af659dd1..27573ea82f 100644 --- a/eth/core/state/statedb_test.go +++ b/eth/core/state/statedb_test.go @@ -24,12 +24,13 @@ import ( "errors" "math/big" + tmock "github.com/stretchr/testify/mock" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/state/mock" "pkg.berachain.dev/polaris/eth/core/state/mocks" coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/params" . "github.com/onsi/ginkgo/v2" @@ -43,7 +44,7 @@ var ( ) var _ = Describe("StateDB", func() { - var sdb vm.PolarisStateDB + var sdb state.StateDB var sp *mock.PluginMock var pp *mocks.PrecompilePlugin @@ -132,9 +133,9 @@ var _ = Describe("StateDB", func() { }) It("should return code for precompiles", func() { - pp.On("Has", common.Address{0x7}).Return(true).Once() + pp.On("Get", common.Address{0x7}, tmock.Anything).Return(nil, true).Once() Expect(sdb.GetCode(common.Address{0x7})).To(Equal([]byte{0x1})) - pp.On("Has", common.Address{0x7}).Return(false).Once() + pp.On("Get", common.Address{0x7}, tmock.Anything).Return(nil, false).Once() Expect(sdb.GetCode(common.Address{0x7})).To(Equal([]byte{})) }) }) diff --git a/eth/core/types/imported.go b/eth/core/types/imported.go index f39f74a1d2..cc0cc17271 100644 --- a/eth/core/types/imported.go +++ b/eth/core/types/imported.go @@ -48,33 +48,14 @@ type ( var ( NewLondonSigner = types.NewLondonSigner - BytesToBloom = types.BytesToBloom - CreateBloom = types.CreateBloom MakeSigner = types.MakeSigner - CopyHeader = types.CopyHeader - LogsBloom = types.LogsBloom - LegacyTxType = types.LegacyTxType - DynamicFeeTxType = types.DynamicFeeTxType - AccessListTxType = types.AccessListTxType - DeriveSha = types.DeriveSha - EmptyTxsHash = types.EmptyTxsHash - EmptyReceiptsHash = types.EmptyReceiptsHash - EmptyRootHash = types.EmptyRootHash - EmptyUncleHash = types.EmptyUncleHash SignTx = types.SignTx Sender = types.Sender NewTx = types.NewTx NewTransaction = types.NewTransaction - NewEIP2930Signer = types.NewEIP2930Signer LatestSignerForChainID = types.LatestSignerForChainID SignNewTx = types.SignNewTx MustSignNewTx = types.MustSignNewTx NewBlock = types.NewBlock NewBlockWithHeader = types.NewBlockWithHeader - ErrInvalidSig = types.ErrInvalidSig -) - -var ( - ReceiptStatusFailed = types.ReceiptStatusFailed - ReceiptStatusSuccessful = types.ReceiptStatusSuccessful ) diff --git a/eth/core/vm/errors.go b/eth/core/vm/errors.go deleted file mode 100644 index 26af6f9cba..0000000000 --- a/eth/core/vm/errors.go +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package vm - -import "errors" - -var ( - // ErrStateDBNotSupported is returned when the state DB is not compatible for running - // stateful precompiles. - ErrStateDBNotSupported = errors.New( - "given StateDB is not compatible for running stateful precompiles") -) diff --git a/eth/core/vm/imported.go b/eth/core/vm/imported.go index 3c108e0efa..b9b0bde77b 100644 --- a/eth/core/vm/imported.go +++ b/eth/core/vm/imported.go @@ -27,27 +27,19 @@ import ( type ( AccountRef = vm.AccountRef BlockContext = vm.BlockContext - CanTransferFunc = vm.CanTransferFunc - ContractRef = vm.ContractRef Config = vm.Config - EVMLogger = vm.EVMLogger - GethEVM = vm.EVM - GethStateDB = vm.StateDB - GetHashFunc = vm.GetHashFunc + EVM = vm.EVM + StateDB = vm.StateDB PrecompileContainer = vm.PrecompiledContract PrecompileManager = vm.PrecompileManager PrecompileEVM = vm.PrecompileEVM - TransferFunc = vm.TransferFunc TxContext = vm.TxContext + PrecompiledContract = vm.PrecompiledContract ) var ( - NewGethEVMWithPrecompiles = vm.NewEVMWithPrecompiles - ErrOutOfGas = vm.ErrOutOfGas - ErrExecutionReverted = vm.ErrExecutionReverted - ErrWriteProtection = vm.ErrWriteProtection - PrecompiledContractsBerlin = vm.PrecompiledContractsBerlin - PrecompiledContractsByzantium = vm.PrecompiledContractsByzantium - PrecompiledContractsHomestead = vm.PrecompiledContractsHomestead - PrecompiledContractsIstanbul = vm.PrecompiledContractsIstanbul + NewEVM = vm.NewEVM + ErrOutOfGas = vm.ErrOutOfGas + ErrExecutionReverted = vm.ErrExecutionReverted + ErrWriteProtection = vm.ErrWriteProtection ) diff --git a/eth/core/vm/interfaces.go b/eth/core/vm/interfaces.go index d608d582da..172f8e17e1 100644 --- a/eth/core/vm/interfaces.go +++ b/eth/core/vm/interfaces.go @@ -25,10 +25,11 @@ import ( ) type ( - // PolarisStateDB defines an extension to the interface provided by Go-Ethereum to support + // PolarStateDB defines an extension to the interface provided by Go-Ethereum to support // additional state transition functionalities. - PolarisStateDB interface { - GethStateDB + PolarStateDB interface { + // StateDB represents vm.StateDB + StateDB // GetContext returns the current context of the state plugin. GetContext() context.Context } diff --git a/eth/core/vm/mock/evm.go b/eth/core/vm/mock/evm.go index 6d5d1ee7cf..563a7c5825 100644 --- a/eth/core/vm/mock/evm.go +++ b/eth/core/vm/mock/evm.go @@ -31,7 +31,7 @@ import ( func NewEVM() *PrecompileEVMMock { mockSDB := NewEmptyStateDB() return &PrecompileEVMMock{ - GetStateDBFunc: func() vm.GethStateDB { + GetStateDBFunc: func() vm.StateDB { return mockSDB }, GetContextFunc: func() *vm.BlockContext { diff --git a/eth/core/vm/mock/logger.go b/eth/core/vm/mock/logger.go deleted file mode 100644 index 93422e8bc8..0000000000 --- a/eth/core/vm/mock/logger.go +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mock - -import ( - "math/big" - - ethereumcorevm "github.com/ethereum/go-ethereum/core/vm" - - "pkg.berachain.dev/polaris/eth/common" -) - -//go:generate moq -out ./logger.mock.go -pkg mock ../ EVMLogger - -func NewEVMLoggerMock() *EVMLoggerMock { - mockedEVMLogger := &EVMLoggerMock{ - CaptureEnterFunc: func(typ ethereumcorevm.OpCode, - from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { - // no-op - }, - CaptureExitFunc: func(output []byte, gasUsed uint64, err error) { - // no-op - }, - CaptureFaultFunc: func(pc uint64, - op ethereumcorevm.OpCode, gas uint64, cost uint64, - scope *ethereumcorevm.ScopeContext, depth int, err error) { - // no-op - }, - CaptureStartFunc: func(env *ethereumcorevm.EVM, - from common.Address, to common.Address, create bool, input []byte, gas uint64, - value *big.Int) { - // no-op - }, - CaptureStateFunc: func(pc uint64, - op ethereumcorevm.OpCode, gas uint64, cost uint64, - scope *ethereumcorevm.ScopeContext, rData []byte, depth int, err error) { - // no-op - }, - CaptureTxEndFunc: func(restGas uint64) { - // no-op - }, - CaptureTxStartFunc: func(gasLimit uint64) { - // no-op - }, - } - return mockedEVMLogger -} diff --git a/eth/core/vm/mock/logger.mock.go b/eth/core/vm/mock/logger.mock.go deleted file mode 100644 index 67c6b9add2..0000000000 --- a/eth/core/vm/mock/logger.mock.go +++ /dev/null @@ -1,554 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package mock - -import ( - "github.com/ethereum/go-ethereum/common" - ethereumcorevm "github.com/ethereum/go-ethereum/core/vm" - "math/big" - ethcorevm "pkg.berachain.dev/polaris/eth/core/vm" - "sync" -) - -// Ensure, that EVMLoggerMock does implement ethcorevm.EVMLogger. -// If this is not the case, regenerate this file with moq. -var _ ethcorevm.EVMLogger = &EVMLoggerMock{} - -// EVMLoggerMock is a mock implementation of ethcorevm.EVMLogger. -// -// func TestSomethingThatUsesEVMLogger(t *testing.T) { -// -// // make and configure a mocked ethcorevm.EVMLogger -// mockedEVMLogger := &EVMLoggerMock{ -// CaptureEndFunc: func(output []byte, gasUsed uint64, err error) { -// panic("mock out the CaptureEnd method") -// }, -// CaptureEnterFunc: func(typ ethereumcorevm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { -// panic("mock out the CaptureEnter method") -// }, -// CaptureExitFunc: func(output []byte, gasUsed uint64, err error) { -// panic("mock out the CaptureExit method") -// }, -// CaptureFaultFunc: func(pc uint64, op ethereumcorevm.OpCode, gas uint64, cost uint64, scope *ethereumcorevm.ScopeContext, depth int, err error) { -// panic("mock out the CaptureFault method") -// }, -// CaptureStartFunc: func(env *ethereumcorevm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { -// panic("mock out the CaptureStart method") -// }, -// CaptureStateFunc: func(pc uint64, op ethereumcorevm.OpCode, gas uint64, cost uint64, scope *ethereumcorevm.ScopeContext, rData []byte, depth int, err error) { -// panic("mock out the CaptureState method") -// }, -// CaptureTxEndFunc: func(restGas uint64) { -// panic("mock out the CaptureTxEnd method") -// }, -// CaptureTxStartFunc: func(gasLimit uint64) { -// panic("mock out the CaptureTxStart method") -// }, -// } -// -// // use mockedEVMLogger in code that requires ethcorevm.EVMLogger -// // and then make assertions. -// -// } -type EVMLoggerMock struct { - // CaptureEndFunc mocks the CaptureEnd method. - CaptureEndFunc func(output []byte, gasUsed uint64, err error) - - // CaptureEnterFunc mocks the CaptureEnter method. - CaptureEnterFunc func(typ ethereumcorevm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) - - // CaptureExitFunc mocks the CaptureExit method. - CaptureExitFunc func(output []byte, gasUsed uint64, err error) - - // CaptureFaultFunc mocks the CaptureFault method. - CaptureFaultFunc func(pc uint64, op ethereumcorevm.OpCode, gas uint64, cost uint64, scope *ethereumcorevm.ScopeContext, depth int, err error) - - // CaptureStartFunc mocks the CaptureStart method. - CaptureStartFunc func(env *ethereumcorevm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) - - // CaptureStateFunc mocks the CaptureState method. - CaptureStateFunc func(pc uint64, op ethereumcorevm.OpCode, gas uint64, cost uint64, scope *ethereumcorevm.ScopeContext, rData []byte, depth int, err error) - - // CaptureTxEndFunc mocks the CaptureTxEnd method. - CaptureTxEndFunc func(restGas uint64) - - // CaptureTxStartFunc mocks the CaptureTxStart method. - CaptureTxStartFunc func(gasLimit uint64) - - // calls tracks calls to the methods. - calls struct { - // CaptureEnd holds details about calls to the CaptureEnd method. - CaptureEnd []struct { - // Output is the output argument value. - Output []byte - // GasUsed is the gasUsed argument value. - GasUsed uint64 - // Err is the err argument value. - Err error - } - // CaptureEnter holds details about calls to the CaptureEnter method. - CaptureEnter []struct { - // Typ is the typ argument value. - Typ ethereumcorevm.OpCode - // From is the from argument value. - From common.Address - // To is the to argument value. - To common.Address - // Input is the input argument value. - Input []byte - // Gas is the gas argument value. - Gas uint64 - // Value is the value argument value. - Value *big.Int - } - // CaptureExit holds details about calls to the CaptureExit method. - CaptureExit []struct { - // Output is the output argument value. - Output []byte - // GasUsed is the gasUsed argument value. - GasUsed uint64 - // Err is the err argument value. - Err error - } - // CaptureFault holds details about calls to the CaptureFault method. - CaptureFault []struct { - // Pc is the pc argument value. - Pc uint64 - // Op is the op argument value. - Op ethereumcorevm.OpCode - // Gas is the gas argument value. - Gas uint64 - // Cost is the cost argument value. - Cost uint64 - // Scope is the scope argument value. - Scope *ethereumcorevm.ScopeContext - // Depth is the depth argument value. - Depth int - // Err is the err argument value. - Err error - } - // CaptureStart holds details about calls to the CaptureStart method. - CaptureStart []struct { - // Env is the env argument value. - Env *ethereumcorevm.EVM - // From is the from argument value. - From common.Address - // To is the to argument value. - To common.Address - // Create is the create argument value. - Create bool - // Input is the input argument value. - Input []byte - // Gas is the gas argument value. - Gas uint64 - // Value is the value argument value. - Value *big.Int - } - // CaptureState holds details about calls to the CaptureState method. - CaptureState []struct { - // Pc is the pc argument value. - Pc uint64 - // Op is the op argument value. - Op ethereumcorevm.OpCode - // Gas is the gas argument value. - Gas uint64 - // Cost is the cost argument value. - Cost uint64 - // Scope is the scope argument value. - Scope *ethereumcorevm.ScopeContext - // RData is the rData argument value. - RData []byte - // Depth is the depth argument value. - Depth int - // Err is the err argument value. - Err error - } - // CaptureTxEnd holds details about calls to the CaptureTxEnd method. - CaptureTxEnd []struct { - // RestGas is the restGas argument value. - RestGas uint64 - } - // CaptureTxStart holds details about calls to the CaptureTxStart method. - CaptureTxStart []struct { - // GasLimit is the gasLimit argument value. - GasLimit uint64 - } - } - lockCaptureEnd sync.RWMutex - lockCaptureEnter sync.RWMutex - lockCaptureExit sync.RWMutex - lockCaptureFault sync.RWMutex - lockCaptureStart sync.RWMutex - lockCaptureState sync.RWMutex - lockCaptureTxEnd sync.RWMutex - lockCaptureTxStart sync.RWMutex -} - -// CaptureEnd calls CaptureEndFunc. -func (mock *EVMLoggerMock) CaptureEnd(output []byte, gasUsed uint64, err error) { - if mock.CaptureEndFunc == nil { - panic("EVMLoggerMock.CaptureEndFunc: method is nil but EVMLogger.CaptureEnd was just called") - } - callInfo := struct { - Output []byte - GasUsed uint64 - Err error - }{ - Output: output, - GasUsed: gasUsed, - Err: err, - } - mock.lockCaptureEnd.Lock() - mock.calls.CaptureEnd = append(mock.calls.CaptureEnd, callInfo) - mock.lockCaptureEnd.Unlock() - mock.CaptureEndFunc(output, gasUsed, err) -} - -// CaptureEndCalls gets all the calls that were made to CaptureEnd. -// Check the length with: -// -// len(mockedEVMLogger.CaptureEndCalls()) -func (mock *EVMLoggerMock) CaptureEndCalls() []struct { - Output []byte - GasUsed uint64 - Err error -} { - var calls []struct { - Output []byte - GasUsed uint64 - Err error - } - mock.lockCaptureEnd.RLock() - calls = mock.calls.CaptureEnd - mock.lockCaptureEnd.RUnlock() - return calls -} - -// CaptureEnter calls CaptureEnterFunc. -func (mock *EVMLoggerMock) CaptureEnter(typ ethereumcorevm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { - if mock.CaptureEnterFunc == nil { - panic("EVMLoggerMock.CaptureEnterFunc: method is nil but EVMLogger.CaptureEnter was just called") - } - callInfo := struct { - Typ ethereumcorevm.OpCode - From common.Address - To common.Address - Input []byte - Gas uint64 - Value *big.Int - }{ - Typ: typ, - From: from, - To: to, - Input: input, - Gas: gas, - Value: value, - } - mock.lockCaptureEnter.Lock() - mock.calls.CaptureEnter = append(mock.calls.CaptureEnter, callInfo) - mock.lockCaptureEnter.Unlock() - mock.CaptureEnterFunc(typ, from, to, input, gas, value) -} - -// CaptureEnterCalls gets all the calls that were made to CaptureEnter. -// Check the length with: -// -// len(mockedEVMLogger.CaptureEnterCalls()) -func (mock *EVMLoggerMock) CaptureEnterCalls() []struct { - Typ ethereumcorevm.OpCode - From common.Address - To common.Address - Input []byte - Gas uint64 - Value *big.Int -} { - var calls []struct { - Typ ethereumcorevm.OpCode - From common.Address - To common.Address - Input []byte - Gas uint64 - Value *big.Int - } - mock.lockCaptureEnter.RLock() - calls = mock.calls.CaptureEnter - mock.lockCaptureEnter.RUnlock() - return calls -} - -// CaptureExit calls CaptureExitFunc. -func (mock *EVMLoggerMock) CaptureExit(output []byte, gasUsed uint64, err error) { - if mock.CaptureExitFunc == nil { - panic("EVMLoggerMock.CaptureExitFunc: method is nil but EVMLogger.CaptureExit was just called") - } - callInfo := struct { - Output []byte - GasUsed uint64 - Err error - }{ - Output: output, - GasUsed: gasUsed, - Err: err, - } - mock.lockCaptureExit.Lock() - mock.calls.CaptureExit = append(mock.calls.CaptureExit, callInfo) - mock.lockCaptureExit.Unlock() - mock.CaptureExitFunc(output, gasUsed, err) -} - -// CaptureExitCalls gets all the calls that were made to CaptureExit. -// Check the length with: -// -// len(mockedEVMLogger.CaptureExitCalls()) -func (mock *EVMLoggerMock) CaptureExitCalls() []struct { - Output []byte - GasUsed uint64 - Err error -} { - var calls []struct { - Output []byte - GasUsed uint64 - Err error - } - mock.lockCaptureExit.RLock() - calls = mock.calls.CaptureExit - mock.lockCaptureExit.RUnlock() - return calls -} - -// CaptureFault calls CaptureFaultFunc. -func (mock *EVMLoggerMock) CaptureFault(pc uint64, op ethereumcorevm.OpCode, gas uint64, cost uint64, scope *ethereumcorevm.ScopeContext, depth int, err error) { - if mock.CaptureFaultFunc == nil { - panic("EVMLoggerMock.CaptureFaultFunc: method is nil but EVMLogger.CaptureFault was just called") - } - callInfo := struct { - Pc uint64 - Op ethereumcorevm.OpCode - Gas uint64 - Cost uint64 - Scope *ethereumcorevm.ScopeContext - Depth int - Err error - }{ - Pc: pc, - Op: op, - Gas: gas, - Cost: cost, - Scope: scope, - Depth: depth, - Err: err, - } - mock.lockCaptureFault.Lock() - mock.calls.CaptureFault = append(mock.calls.CaptureFault, callInfo) - mock.lockCaptureFault.Unlock() - mock.CaptureFaultFunc(pc, op, gas, cost, scope, depth, err) -} - -// CaptureFaultCalls gets all the calls that were made to CaptureFault. -// Check the length with: -// -// len(mockedEVMLogger.CaptureFaultCalls()) -func (mock *EVMLoggerMock) CaptureFaultCalls() []struct { - Pc uint64 - Op ethereumcorevm.OpCode - Gas uint64 - Cost uint64 - Scope *ethereumcorevm.ScopeContext - Depth int - Err error -} { - var calls []struct { - Pc uint64 - Op ethereumcorevm.OpCode - Gas uint64 - Cost uint64 - Scope *ethereumcorevm.ScopeContext - Depth int - Err error - } - mock.lockCaptureFault.RLock() - calls = mock.calls.CaptureFault - mock.lockCaptureFault.RUnlock() - return calls -} - -// CaptureStart calls CaptureStartFunc. -func (mock *EVMLoggerMock) CaptureStart(env *ethereumcorevm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { - if mock.CaptureStartFunc == nil { - panic("EVMLoggerMock.CaptureStartFunc: method is nil but EVMLogger.CaptureStart was just called") - } - callInfo := struct { - Env *ethereumcorevm.EVM - From common.Address - To common.Address - Create bool - Input []byte - Gas uint64 - Value *big.Int - }{ - Env: env, - From: from, - To: to, - Create: create, - Input: input, - Gas: gas, - Value: value, - } - mock.lockCaptureStart.Lock() - mock.calls.CaptureStart = append(mock.calls.CaptureStart, callInfo) - mock.lockCaptureStart.Unlock() - mock.CaptureStartFunc(env, from, to, create, input, gas, value) -} - -// CaptureStartCalls gets all the calls that were made to CaptureStart. -// Check the length with: -// -// len(mockedEVMLogger.CaptureStartCalls()) -func (mock *EVMLoggerMock) CaptureStartCalls() []struct { - Env *ethereumcorevm.EVM - From common.Address - To common.Address - Create bool - Input []byte - Gas uint64 - Value *big.Int -} { - var calls []struct { - Env *ethereumcorevm.EVM - From common.Address - To common.Address - Create bool - Input []byte - Gas uint64 - Value *big.Int - } - mock.lockCaptureStart.RLock() - calls = mock.calls.CaptureStart - mock.lockCaptureStart.RUnlock() - return calls -} - -// CaptureState calls CaptureStateFunc. -func (mock *EVMLoggerMock) CaptureState(pc uint64, op ethereumcorevm.OpCode, gas uint64, cost uint64, scope *ethereumcorevm.ScopeContext, rData []byte, depth int, err error) { - if mock.CaptureStateFunc == nil { - panic("EVMLoggerMock.CaptureStateFunc: method is nil but EVMLogger.CaptureState was just called") - } - callInfo := struct { - Pc uint64 - Op ethereumcorevm.OpCode - Gas uint64 - Cost uint64 - Scope *ethereumcorevm.ScopeContext - RData []byte - Depth int - Err error - }{ - Pc: pc, - Op: op, - Gas: gas, - Cost: cost, - Scope: scope, - RData: rData, - Depth: depth, - Err: err, - } - mock.lockCaptureState.Lock() - mock.calls.CaptureState = append(mock.calls.CaptureState, callInfo) - mock.lockCaptureState.Unlock() - mock.CaptureStateFunc(pc, op, gas, cost, scope, rData, depth, err) -} - -// CaptureStateCalls gets all the calls that were made to CaptureState. -// Check the length with: -// -// len(mockedEVMLogger.CaptureStateCalls()) -func (mock *EVMLoggerMock) CaptureStateCalls() []struct { - Pc uint64 - Op ethereumcorevm.OpCode - Gas uint64 - Cost uint64 - Scope *ethereumcorevm.ScopeContext - RData []byte - Depth int - Err error -} { - var calls []struct { - Pc uint64 - Op ethereumcorevm.OpCode - Gas uint64 - Cost uint64 - Scope *ethereumcorevm.ScopeContext - RData []byte - Depth int - Err error - } - mock.lockCaptureState.RLock() - calls = mock.calls.CaptureState - mock.lockCaptureState.RUnlock() - return calls -} - -// CaptureTxEnd calls CaptureTxEndFunc. -func (mock *EVMLoggerMock) CaptureTxEnd(restGas uint64) { - if mock.CaptureTxEndFunc == nil { - panic("EVMLoggerMock.CaptureTxEndFunc: method is nil but EVMLogger.CaptureTxEnd was just called") - } - callInfo := struct { - RestGas uint64 - }{ - RestGas: restGas, - } - mock.lockCaptureTxEnd.Lock() - mock.calls.CaptureTxEnd = append(mock.calls.CaptureTxEnd, callInfo) - mock.lockCaptureTxEnd.Unlock() - mock.CaptureTxEndFunc(restGas) -} - -// CaptureTxEndCalls gets all the calls that were made to CaptureTxEnd. -// Check the length with: -// -// len(mockedEVMLogger.CaptureTxEndCalls()) -func (mock *EVMLoggerMock) CaptureTxEndCalls() []struct { - RestGas uint64 -} { - var calls []struct { - RestGas uint64 - } - mock.lockCaptureTxEnd.RLock() - calls = mock.calls.CaptureTxEnd - mock.lockCaptureTxEnd.RUnlock() - return calls -} - -// CaptureTxStart calls CaptureTxStartFunc. -func (mock *EVMLoggerMock) CaptureTxStart(gasLimit uint64) { - if mock.CaptureTxStartFunc == nil { - panic("EVMLoggerMock.CaptureTxStartFunc: method is nil but EVMLogger.CaptureTxStart was just called") - } - callInfo := struct { - GasLimit uint64 - }{ - GasLimit: gasLimit, - } - mock.lockCaptureTxStart.Lock() - mock.calls.CaptureTxStart = append(mock.calls.CaptureTxStart, callInfo) - mock.lockCaptureTxStart.Unlock() - mock.CaptureTxStartFunc(gasLimit) -} - -// CaptureTxStartCalls gets all the calls that were made to CaptureTxStart. -// Check the length with: -// -// len(mockedEVMLogger.CaptureTxStartCalls()) -func (mock *EVMLoggerMock) CaptureTxStartCalls() []struct { - GasLimit uint64 -} { - var calls []struct { - GasLimit uint64 - } - mock.lockCaptureTxStart.RLock() - calls = mock.calls.CaptureTxStart - mock.lockCaptureTxStart.RUnlock() - return calls -} diff --git a/eth/core/vm/mock/statedb.go b/eth/core/vm/mock/statedb.go index fc12baee80..e8f47858ea 100644 --- a/eth/core/vm/mock/statedb.go +++ b/eth/core/vm/mock/statedb.go @@ -29,11 +29,11 @@ import ( "pkg.berachain.dev/polaris/eth/core/types" ) -//go:generate moq -out ./statedb.mock.go -pkg mock ../ PolarisStateDB +//go:generate moq -out ./statedb.mock.go -pkg mock ../ PolarStateDB // NewEmptyStateDB creates a new `StateDBMock` instance. -func NewEmptyStateDB() *PolarisStateDBMock { - mockedPolarisStateDB := &PolarisStateDBMock{ +func NewEmptyStateDB() *PolarStateDBMock { + mockedPolarStateDB := &PolarStateDBMock{ AddAddressToAccessListFunc: func(addr common.Address) { }, @@ -132,12 +132,12 @@ func NewEmptyStateDB() *PolarisStateDBMock { SelfDestructFunc: func(address common.Address) { }, } - mockedPolarisStateDB.LogsFunc = func() []*types.Log { + mockedPolarStateDB.LogsFunc = func() []*types.Log { logs := []*types.Log{} - for _, l := range mockedPolarisStateDB.AddLogCalls() { + for _, l := range mockedPolarStateDB.AddLogCalls() { logs = append(logs, l.Log) } return logs } - return mockedPolarisStateDB + return mockedPolarStateDB } diff --git a/eth/core/vm/mock/statedb.mock.go b/eth/core/vm/mock/statedb.mock.go index 1b2a0a8392..48c805663a 100644 --- a/eth/core/vm/mock/statedb.mock.go +++ b/eth/core/vm/mock/statedb.mock.go @@ -14,16 +14,16 @@ import ( "sync" ) -// Ensure, that PolarisStateDBMock does implement vm.PolarisStateDB. +// Ensure, that PolarStateDBMock does implement vm.PolarStateDB. // If this is not the case, regenerate this file with moq. -var _ vm.PolarisStateDB = &PolarisStateDBMock{} +var _ vm.PolarStateDB = &PolarStateDBMock{} -// PolarisStateDBMock is a mock implementation of vm.PolarisStateDB. +// PolarStateDBMock is a mock implementation of vm.PolarStateDB. // -// func TestSomethingThatUsesPolarisStateDB(t *testing.T) { +// func TestSomethingThatUsesPolarStateDB(t *testing.T) { // -// // make and configure a mocked vm.PolarisStateDB -// mockedPolarisStateDB := &PolarisStateDBMock{ +// // make and configure a mocked vm.PolarStateDB +// mockedPolarStateDB := &PolarStateDBMock{ // AddAddressToAccessListFunc: func(addr common.Address) { // panic("mock out the AddAddressToAccessList method") // }, @@ -102,6 +102,9 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // GetOrNewStateObjectFunc: func(addr common.Address) *state.StateObject { // panic("mock out the GetOrNewStateObject method") // }, +// GetPrecompileManagerFunc: func() any { +// panic("mock out the GetPrecompileManager method") +// }, // GetRefundFunc: func() uint64 { // panic("mock out the GetRefund method") // }, @@ -188,11 +191,11 @@ var _ vm.PolarisStateDB = &PolarisStateDBMock{} // }, // } // -// // use mockedPolarisStateDB in code that requires vm.PolarisStateDB +// // use mockedPolarStateDB in code that requires vm.PolarStateDB // // and then make assertions. // // } -type PolarisStateDBMock struct { +type PolarStateDBMock struct { // AddAddressToAccessListFunc mocks the AddAddressToAccessList method. AddAddressToAccessListFunc func(addr common.Address) @@ -271,6 +274,9 @@ type PolarisStateDBMock struct { // GetOrNewStateObjectFunc mocks the GetOrNewStateObject method. GetOrNewStateObjectFunc func(addr common.Address) *state.StateObject + // GetPrecompileManagerFunc mocks the GetPrecompileManager method. + GetPrecompileManagerFunc func() any + // GetRefundFunc mocks the GetRefund method. GetRefundFunc func() uint64 @@ -495,6 +501,9 @@ type PolarisStateDBMock struct { // Addr is the addr argument value. Addr common.Address } + // GetPrecompileManager holds details about calls to the GetPrecompileManager method. + GetPrecompileManager []struct { + } // GetRefund holds details about calls to the GetRefund method. GetRefund []struct { } @@ -686,6 +695,7 @@ type PolarisStateDBMock struct { lockGetLogs sync.RWMutex lockGetNonce sync.RWMutex lockGetOrNewStateObject sync.RWMutex + lockGetPrecompileManager sync.RWMutex lockGetRefund sync.RWMutex lockGetState sync.RWMutex lockGetStorageRoot sync.RWMutex @@ -717,9 +727,9 @@ type PolarisStateDBMock struct { } // AddAddressToAccessList calls AddAddressToAccessListFunc. -func (mock *PolarisStateDBMock) AddAddressToAccessList(addr common.Address) { +func (mock *PolarStateDBMock) AddAddressToAccessList(addr common.Address) { if mock.AddAddressToAccessListFunc == nil { - panic("PolarisStateDBMock.AddAddressToAccessListFunc: method is nil but PolarisStateDB.AddAddressToAccessList was just called") + panic("PolarStateDBMock.AddAddressToAccessListFunc: method is nil but PolarStateDB.AddAddressToAccessList was just called") } callInfo := struct { Addr common.Address @@ -735,8 +745,8 @@ func (mock *PolarisStateDBMock) AddAddressToAccessList(addr common.Address) { // AddAddressToAccessListCalls gets all the calls that were made to AddAddressToAccessList. // Check the length with: // -// len(mockedPolarisStateDB.AddAddressToAccessListCalls()) -func (mock *PolarisStateDBMock) AddAddressToAccessListCalls() []struct { +// len(mockedPolarStateDB.AddAddressToAccessListCalls()) +func (mock *PolarStateDBMock) AddAddressToAccessListCalls() []struct { Addr common.Address } { var calls []struct { @@ -749,9 +759,9 @@ func (mock *PolarisStateDBMock) AddAddressToAccessListCalls() []struct { } // AddBalance calls AddBalanceFunc. -func (mock *PolarisStateDBMock) AddBalance(address common.Address, intMoqParam *big.Int) { +func (mock *PolarStateDBMock) AddBalance(address common.Address, intMoqParam *big.Int) { if mock.AddBalanceFunc == nil { - panic("PolarisStateDBMock.AddBalanceFunc: method is nil but PolarisStateDB.AddBalance was just called") + panic("PolarStateDBMock.AddBalanceFunc: method is nil but PolarStateDB.AddBalance was just called") } callInfo := struct { Address common.Address @@ -769,8 +779,8 @@ func (mock *PolarisStateDBMock) AddBalance(address common.Address, intMoqParam * // AddBalanceCalls gets all the calls that were made to AddBalance. // Check the length with: // -// len(mockedPolarisStateDB.AddBalanceCalls()) -func (mock *PolarisStateDBMock) AddBalanceCalls() []struct { +// len(mockedPolarStateDB.AddBalanceCalls()) +func (mock *PolarStateDBMock) AddBalanceCalls() []struct { Address common.Address IntMoqParam *big.Int } { @@ -785,9 +795,9 @@ func (mock *PolarisStateDBMock) AddBalanceCalls() []struct { } // AddLog calls AddLogFunc. -func (mock *PolarisStateDBMock) AddLog(log *types.Log) { +func (mock *PolarStateDBMock) AddLog(log *types.Log) { if mock.AddLogFunc == nil { - panic("PolarisStateDBMock.AddLogFunc: method is nil but PolarisStateDB.AddLog was just called") + panic("PolarStateDBMock.AddLogFunc: method is nil but PolarStateDB.AddLog was just called") } callInfo := struct { Log *types.Log @@ -803,8 +813,8 @@ func (mock *PolarisStateDBMock) AddLog(log *types.Log) { // AddLogCalls gets all the calls that were made to AddLog. // Check the length with: // -// len(mockedPolarisStateDB.AddLogCalls()) -func (mock *PolarisStateDBMock) AddLogCalls() []struct { +// len(mockedPolarStateDB.AddLogCalls()) +func (mock *PolarStateDBMock) AddLogCalls() []struct { Log *types.Log } { var calls []struct { @@ -817,9 +827,9 @@ func (mock *PolarisStateDBMock) AddLogCalls() []struct { } // AddPreimage calls AddPreimageFunc. -func (mock *PolarisStateDBMock) AddPreimage(hash common.Hash, bytes []byte) { +func (mock *PolarStateDBMock) AddPreimage(hash common.Hash, bytes []byte) { if mock.AddPreimageFunc == nil { - panic("PolarisStateDBMock.AddPreimageFunc: method is nil but PolarisStateDB.AddPreimage was just called") + panic("PolarStateDBMock.AddPreimageFunc: method is nil but PolarStateDB.AddPreimage was just called") } callInfo := struct { Hash common.Hash @@ -837,8 +847,8 @@ func (mock *PolarisStateDBMock) AddPreimage(hash common.Hash, bytes []byte) { // AddPreimageCalls gets all the calls that were made to AddPreimage. // Check the length with: // -// len(mockedPolarisStateDB.AddPreimageCalls()) -func (mock *PolarisStateDBMock) AddPreimageCalls() []struct { +// len(mockedPolarStateDB.AddPreimageCalls()) +func (mock *PolarStateDBMock) AddPreimageCalls() []struct { Hash common.Hash Bytes []byte } { @@ -853,9 +863,9 @@ func (mock *PolarisStateDBMock) AddPreimageCalls() []struct { } // AddRefund calls AddRefundFunc. -func (mock *PolarisStateDBMock) AddRefund(v uint64) { +func (mock *PolarStateDBMock) AddRefund(v uint64) { if mock.AddRefundFunc == nil { - panic("PolarisStateDBMock.AddRefundFunc: method is nil but PolarisStateDB.AddRefund was just called") + panic("PolarStateDBMock.AddRefundFunc: method is nil but PolarStateDB.AddRefund was just called") } callInfo := struct { V uint64 @@ -871,8 +881,8 @@ func (mock *PolarisStateDBMock) AddRefund(v uint64) { // AddRefundCalls gets all the calls that were made to AddRefund. // Check the length with: // -// len(mockedPolarisStateDB.AddRefundCalls()) -func (mock *PolarisStateDBMock) AddRefundCalls() []struct { +// len(mockedPolarStateDB.AddRefundCalls()) +func (mock *PolarStateDBMock) AddRefundCalls() []struct { V uint64 } { var calls []struct { @@ -885,9 +895,9 @@ func (mock *PolarisStateDBMock) AddRefundCalls() []struct { } // AddSlotToAccessList calls AddSlotToAccessListFunc. -func (mock *PolarisStateDBMock) AddSlotToAccessList(addr common.Address, slot common.Hash) { +func (mock *PolarStateDBMock) AddSlotToAccessList(addr common.Address, slot common.Hash) { if mock.AddSlotToAccessListFunc == nil { - panic("PolarisStateDBMock.AddSlotToAccessListFunc: method is nil but PolarisStateDB.AddSlotToAccessList was just called") + panic("PolarStateDBMock.AddSlotToAccessListFunc: method is nil but PolarStateDB.AddSlotToAccessList was just called") } callInfo := struct { Addr common.Address @@ -905,8 +915,8 @@ func (mock *PolarisStateDBMock) AddSlotToAccessList(addr common.Address, slot co // AddSlotToAccessListCalls gets all the calls that were made to AddSlotToAccessList. // Check the length with: // -// len(mockedPolarisStateDB.AddSlotToAccessListCalls()) -func (mock *PolarisStateDBMock) AddSlotToAccessListCalls() []struct { +// len(mockedPolarStateDB.AddSlotToAccessListCalls()) +func (mock *PolarStateDBMock) AddSlotToAccessListCalls() []struct { Addr common.Address Slot common.Hash } { @@ -921,9 +931,9 @@ func (mock *PolarisStateDBMock) AddSlotToAccessListCalls() []struct { } // AddressInAccessList calls AddressInAccessListFunc. -func (mock *PolarisStateDBMock) AddressInAccessList(addr common.Address) bool { +func (mock *PolarStateDBMock) AddressInAccessList(addr common.Address) bool { if mock.AddressInAccessListFunc == nil { - panic("PolarisStateDBMock.AddressInAccessListFunc: method is nil but PolarisStateDB.AddressInAccessList was just called") + panic("PolarStateDBMock.AddressInAccessListFunc: method is nil but PolarStateDB.AddressInAccessList was just called") } callInfo := struct { Addr common.Address @@ -939,8 +949,8 @@ func (mock *PolarisStateDBMock) AddressInAccessList(addr common.Address) bool { // AddressInAccessListCalls gets all the calls that were made to AddressInAccessList. // Check the length with: // -// len(mockedPolarisStateDB.AddressInAccessListCalls()) -func (mock *PolarisStateDBMock) AddressInAccessListCalls() []struct { +// len(mockedPolarStateDB.AddressInAccessListCalls()) +func (mock *PolarStateDBMock) AddressInAccessListCalls() []struct { Addr common.Address } { var calls []struct { @@ -953,9 +963,9 @@ func (mock *PolarisStateDBMock) AddressInAccessListCalls() []struct { } // Commit calls CommitFunc. -func (mock *PolarisStateDBMock) Commit(v uint64, b bool) (common.Hash, error) { +func (mock *PolarStateDBMock) Commit(v uint64, b bool) (common.Hash, error) { if mock.CommitFunc == nil { - panic("PolarisStateDBMock.CommitFunc: method is nil but PolarisStateDB.Commit was just called") + panic("PolarStateDBMock.CommitFunc: method is nil but PolarStateDB.Commit was just called") } callInfo := struct { V uint64 @@ -973,8 +983,8 @@ func (mock *PolarisStateDBMock) Commit(v uint64, b bool) (common.Hash, error) { // CommitCalls gets all the calls that were made to Commit. // Check the length with: // -// len(mockedPolarisStateDB.CommitCalls()) -func (mock *PolarisStateDBMock) CommitCalls() []struct { +// len(mockedPolarStateDB.CommitCalls()) +func (mock *PolarStateDBMock) CommitCalls() []struct { V uint64 B bool } { @@ -989,9 +999,9 @@ func (mock *PolarisStateDBMock) CommitCalls() []struct { } // Copy calls CopyFunc. -func (mock *PolarisStateDBMock) Copy() state.StateDBI { +func (mock *PolarStateDBMock) Copy() state.StateDBI { if mock.CopyFunc == nil { - panic("PolarisStateDBMock.CopyFunc: method is nil but PolarisStateDB.Copy was just called") + panic("PolarStateDBMock.CopyFunc: method is nil but PolarStateDB.Copy was just called") } callInfo := struct { }{} @@ -1004,8 +1014,8 @@ func (mock *PolarisStateDBMock) Copy() state.StateDBI { // CopyCalls gets all the calls that were made to Copy. // Check the length with: // -// len(mockedPolarisStateDB.CopyCalls()) -func (mock *PolarisStateDBMock) CopyCalls() []struct { +// len(mockedPolarStateDB.CopyCalls()) +func (mock *PolarStateDBMock) CopyCalls() []struct { } { var calls []struct { } @@ -1016,9 +1026,9 @@ func (mock *PolarisStateDBMock) CopyCalls() []struct { } // CreateAccount calls CreateAccountFunc. -func (mock *PolarisStateDBMock) CreateAccount(address common.Address) { +func (mock *PolarStateDBMock) CreateAccount(address common.Address) { if mock.CreateAccountFunc == nil { - panic("PolarisStateDBMock.CreateAccountFunc: method is nil but PolarisStateDB.CreateAccount was just called") + panic("PolarStateDBMock.CreateAccountFunc: method is nil but PolarStateDB.CreateAccount was just called") } callInfo := struct { Address common.Address @@ -1034,8 +1044,8 @@ func (mock *PolarisStateDBMock) CreateAccount(address common.Address) { // CreateAccountCalls gets all the calls that were made to CreateAccount. // Check the length with: // -// len(mockedPolarisStateDB.CreateAccountCalls()) -func (mock *PolarisStateDBMock) CreateAccountCalls() []struct { +// len(mockedPolarStateDB.CreateAccountCalls()) +func (mock *PolarStateDBMock) CreateAccountCalls() []struct { Address common.Address } { var calls []struct { @@ -1048,9 +1058,9 @@ func (mock *PolarisStateDBMock) CreateAccountCalls() []struct { } // Database calls DatabaseFunc. -func (mock *PolarisStateDBMock) Database() state.Database { +func (mock *PolarStateDBMock) Database() state.Database { if mock.DatabaseFunc == nil { - panic("PolarisStateDBMock.DatabaseFunc: method is nil but PolarisStateDB.Database was just called") + panic("PolarStateDBMock.DatabaseFunc: method is nil but PolarStateDB.Database was just called") } callInfo := struct { }{} @@ -1063,8 +1073,8 @@ func (mock *PolarisStateDBMock) Database() state.Database { // DatabaseCalls gets all the calls that were made to Database. // Check the length with: // -// len(mockedPolarisStateDB.DatabaseCalls()) -func (mock *PolarisStateDBMock) DatabaseCalls() []struct { +// len(mockedPolarStateDB.DatabaseCalls()) +func (mock *PolarStateDBMock) DatabaseCalls() []struct { } { var calls []struct { } @@ -1075,9 +1085,9 @@ func (mock *PolarisStateDBMock) DatabaseCalls() []struct { } // Dump calls DumpFunc. -func (mock *PolarisStateDBMock) Dump(opts *state.DumpConfig) []byte { +func (mock *PolarStateDBMock) Dump(opts *state.DumpConfig) []byte { if mock.DumpFunc == nil { - panic("PolarisStateDBMock.DumpFunc: method is nil but PolarisStateDB.Dump was just called") + panic("PolarStateDBMock.DumpFunc: method is nil but PolarStateDB.Dump was just called") } callInfo := struct { Opts *state.DumpConfig @@ -1093,8 +1103,8 @@ func (mock *PolarisStateDBMock) Dump(opts *state.DumpConfig) []byte { // DumpCalls gets all the calls that were made to Dump. // Check the length with: // -// len(mockedPolarisStateDB.DumpCalls()) -func (mock *PolarisStateDBMock) DumpCalls() []struct { +// len(mockedPolarStateDB.DumpCalls()) +func (mock *PolarStateDBMock) DumpCalls() []struct { Opts *state.DumpConfig } { var calls []struct { @@ -1107,9 +1117,9 @@ func (mock *PolarisStateDBMock) DumpCalls() []struct { } // DumpToCollector calls DumpToCollectorFunc. -func (mock *PolarisStateDBMock) DumpToCollector(c state.DumpCollector, conf *state.DumpConfig) []byte { +func (mock *PolarStateDBMock) DumpToCollector(c state.DumpCollector, conf *state.DumpConfig) []byte { if mock.DumpToCollectorFunc == nil { - panic("PolarisStateDBMock.DumpToCollectorFunc: method is nil but PolarisStateDB.DumpToCollector was just called") + panic("PolarStateDBMock.DumpToCollectorFunc: method is nil but PolarStateDB.DumpToCollector was just called") } callInfo := struct { C state.DumpCollector @@ -1127,8 +1137,8 @@ func (mock *PolarisStateDBMock) DumpToCollector(c state.DumpCollector, conf *sta // DumpToCollectorCalls gets all the calls that were made to DumpToCollector. // Check the length with: // -// len(mockedPolarisStateDB.DumpToCollectorCalls()) -func (mock *PolarisStateDBMock) DumpToCollectorCalls() []struct { +// len(mockedPolarStateDB.DumpToCollectorCalls()) +func (mock *PolarStateDBMock) DumpToCollectorCalls() []struct { C state.DumpCollector Conf *state.DumpConfig } { @@ -1143,9 +1153,9 @@ func (mock *PolarisStateDBMock) DumpToCollectorCalls() []struct { } // Empty calls EmptyFunc. -func (mock *PolarisStateDBMock) Empty(address common.Address) bool { +func (mock *PolarStateDBMock) Empty(address common.Address) bool { if mock.EmptyFunc == nil { - panic("PolarisStateDBMock.EmptyFunc: method is nil but PolarisStateDB.Empty was just called") + panic("PolarStateDBMock.EmptyFunc: method is nil but PolarStateDB.Empty was just called") } callInfo := struct { Address common.Address @@ -1161,8 +1171,8 @@ func (mock *PolarisStateDBMock) Empty(address common.Address) bool { // EmptyCalls gets all the calls that were made to Empty. // Check the length with: // -// len(mockedPolarisStateDB.EmptyCalls()) -func (mock *PolarisStateDBMock) EmptyCalls() []struct { +// len(mockedPolarStateDB.EmptyCalls()) +func (mock *PolarStateDBMock) EmptyCalls() []struct { Address common.Address } { var calls []struct { @@ -1175,9 +1185,9 @@ func (mock *PolarisStateDBMock) EmptyCalls() []struct { } // Error calls ErrorFunc. -func (mock *PolarisStateDBMock) Error() error { +func (mock *PolarStateDBMock) Error() error { if mock.ErrorFunc == nil { - panic("PolarisStateDBMock.ErrorFunc: method is nil but PolarisStateDB.Error was just called") + panic("PolarStateDBMock.ErrorFunc: method is nil but PolarStateDB.Error was just called") } callInfo := struct { }{} @@ -1190,8 +1200,8 @@ func (mock *PolarisStateDBMock) Error() error { // ErrorCalls gets all the calls that were made to Error. // Check the length with: // -// len(mockedPolarisStateDB.ErrorCalls()) -func (mock *PolarisStateDBMock) ErrorCalls() []struct { +// len(mockedPolarStateDB.ErrorCalls()) +func (mock *PolarStateDBMock) ErrorCalls() []struct { } { var calls []struct { } @@ -1202,9 +1212,9 @@ func (mock *PolarisStateDBMock) ErrorCalls() []struct { } // Exist calls ExistFunc. -func (mock *PolarisStateDBMock) Exist(address common.Address) bool { +func (mock *PolarStateDBMock) Exist(address common.Address) bool { if mock.ExistFunc == nil { - panic("PolarisStateDBMock.ExistFunc: method is nil but PolarisStateDB.Exist was just called") + panic("PolarStateDBMock.ExistFunc: method is nil but PolarStateDB.Exist was just called") } callInfo := struct { Address common.Address @@ -1220,8 +1230,8 @@ func (mock *PolarisStateDBMock) Exist(address common.Address) bool { // ExistCalls gets all the calls that were made to Exist. // Check the length with: // -// len(mockedPolarisStateDB.ExistCalls()) -func (mock *PolarisStateDBMock) ExistCalls() []struct { +// len(mockedPolarStateDB.ExistCalls()) +func (mock *PolarStateDBMock) ExistCalls() []struct { Address common.Address } { var calls []struct { @@ -1234,9 +1244,9 @@ func (mock *PolarisStateDBMock) ExistCalls() []struct { } // Finalise calls FinaliseFunc. -func (mock *PolarisStateDBMock) Finalise(deleteEmptyObjects bool) { +func (mock *PolarStateDBMock) Finalise(deleteEmptyObjects bool) { if mock.FinaliseFunc == nil { - panic("PolarisStateDBMock.FinaliseFunc: method is nil but PolarisStateDB.Finalise was just called") + panic("PolarStateDBMock.FinaliseFunc: method is nil but PolarStateDB.Finalise was just called") } callInfo := struct { DeleteEmptyObjects bool @@ -1252,8 +1262,8 @@ func (mock *PolarisStateDBMock) Finalise(deleteEmptyObjects bool) { // FinaliseCalls gets all the calls that were made to Finalise. // Check the length with: // -// len(mockedPolarisStateDB.FinaliseCalls()) -func (mock *PolarisStateDBMock) FinaliseCalls() []struct { +// len(mockedPolarStateDB.FinaliseCalls()) +func (mock *PolarStateDBMock) FinaliseCalls() []struct { DeleteEmptyObjects bool } { var calls []struct { @@ -1266,9 +1276,9 @@ func (mock *PolarisStateDBMock) FinaliseCalls() []struct { } // GetBalance calls GetBalanceFunc. -func (mock *PolarisStateDBMock) GetBalance(address common.Address) *big.Int { +func (mock *PolarStateDBMock) GetBalance(address common.Address) *big.Int { if mock.GetBalanceFunc == nil { - panic("PolarisStateDBMock.GetBalanceFunc: method is nil but PolarisStateDB.GetBalance was just called") + panic("PolarStateDBMock.GetBalanceFunc: method is nil but PolarStateDB.GetBalance was just called") } callInfo := struct { Address common.Address @@ -1284,8 +1294,8 @@ func (mock *PolarisStateDBMock) GetBalance(address common.Address) *big.Int { // GetBalanceCalls gets all the calls that were made to GetBalance. // Check the length with: // -// len(mockedPolarisStateDB.GetBalanceCalls()) -func (mock *PolarisStateDBMock) GetBalanceCalls() []struct { +// len(mockedPolarStateDB.GetBalanceCalls()) +func (mock *PolarStateDBMock) GetBalanceCalls() []struct { Address common.Address } { var calls []struct { @@ -1298,9 +1308,9 @@ func (mock *PolarisStateDBMock) GetBalanceCalls() []struct { } // GetCode calls GetCodeFunc. -func (mock *PolarisStateDBMock) GetCode(address common.Address) []byte { +func (mock *PolarStateDBMock) GetCode(address common.Address) []byte { if mock.GetCodeFunc == nil { - panic("PolarisStateDBMock.GetCodeFunc: method is nil but PolarisStateDB.GetCode was just called") + panic("PolarStateDBMock.GetCodeFunc: method is nil but PolarStateDB.GetCode was just called") } callInfo := struct { Address common.Address @@ -1316,8 +1326,8 @@ func (mock *PolarisStateDBMock) GetCode(address common.Address) []byte { // GetCodeCalls gets all the calls that were made to GetCode. // Check the length with: // -// len(mockedPolarisStateDB.GetCodeCalls()) -func (mock *PolarisStateDBMock) GetCodeCalls() []struct { +// len(mockedPolarStateDB.GetCodeCalls()) +func (mock *PolarStateDBMock) GetCodeCalls() []struct { Address common.Address } { var calls []struct { @@ -1330,9 +1340,9 @@ func (mock *PolarisStateDBMock) GetCodeCalls() []struct { } // GetCodeHash calls GetCodeHashFunc. -func (mock *PolarisStateDBMock) GetCodeHash(address common.Address) common.Hash { +func (mock *PolarStateDBMock) GetCodeHash(address common.Address) common.Hash { if mock.GetCodeHashFunc == nil { - panic("PolarisStateDBMock.GetCodeHashFunc: method is nil but PolarisStateDB.GetCodeHash was just called") + panic("PolarStateDBMock.GetCodeHashFunc: method is nil but PolarStateDB.GetCodeHash was just called") } callInfo := struct { Address common.Address @@ -1348,8 +1358,8 @@ func (mock *PolarisStateDBMock) GetCodeHash(address common.Address) common.Hash // GetCodeHashCalls gets all the calls that were made to GetCodeHash. // Check the length with: // -// len(mockedPolarisStateDB.GetCodeHashCalls()) -func (mock *PolarisStateDBMock) GetCodeHashCalls() []struct { +// len(mockedPolarStateDB.GetCodeHashCalls()) +func (mock *PolarStateDBMock) GetCodeHashCalls() []struct { Address common.Address } { var calls []struct { @@ -1362,9 +1372,9 @@ func (mock *PolarisStateDBMock) GetCodeHashCalls() []struct { } // GetCodeSize calls GetCodeSizeFunc. -func (mock *PolarisStateDBMock) GetCodeSize(address common.Address) int { +func (mock *PolarStateDBMock) GetCodeSize(address common.Address) int { if mock.GetCodeSizeFunc == nil { - panic("PolarisStateDBMock.GetCodeSizeFunc: method is nil but PolarisStateDB.GetCodeSize was just called") + panic("PolarStateDBMock.GetCodeSizeFunc: method is nil but PolarStateDB.GetCodeSize was just called") } callInfo := struct { Address common.Address @@ -1380,8 +1390,8 @@ func (mock *PolarisStateDBMock) GetCodeSize(address common.Address) int { // GetCodeSizeCalls gets all the calls that were made to GetCodeSize. // Check the length with: // -// len(mockedPolarisStateDB.GetCodeSizeCalls()) -func (mock *PolarisStateDBMock) GetCodeSizeCalls() []struct { +// len(mockedPolarStateDB.GetCodeSizeCalls()) +func (mock *PolarStateDBMock) GetCodeSizeCalls() []struct { Address common.Address } { var calls []struct { @@ -1394,9 +1404,9 @@ func (mock *PolarisStateDBMock) GetCodeSizeCalls() []struct { } // GetCommittedState calls GetCommittedStateFunc. -func (mock *PolarisStateDBMock) GetCommittedState(address common.Address, hash common.Hash) common.Hash { +func (mock *PolarStateDBMock) GetCommittedState(address common.Address, hash common.Hash) common.Hash { if mock.GetCommittedStateFunc == nil { - panic("PolarisStateDBMock.GetCommittedStateFunc: method is nil but PolarisStateDB.GetCommittedState was just called") + panic("PolarStateDBMock.GetCommittedStateFunc: method is nil but PolarStateDB.GetCommittedState was just called") } callInfo := struct { Address common.Address @@ -1414,8 +1424,8 @@ func (mock *PolarisStateDBMock) GetCommittedState(address common.Address, hash c // GetCommittedStateCalls gets all the calls that were made to GetCommittedState. // Check the length with: // -// len(mockedPolarisStateDB.GetCommittedStateCalls()) -func (mock *PolarisStateDBMock) GetCommittedStateCalls() []struct { +// len(mockedPolarStateDB.GetCommittedStateCalls()) +func (mock *PolarStateDBMock) GetCommittedStateCalls() []struct { Address common.Address Hash common.Hash } { @@ -1430,9 +1440,9 @@ func (mock *PolarisStateDBMock) GetCommittedStateCalls() []struct { } // GetContext calls GetContextFunc. -func (mock *PolarisStateDBMock) GetContext() context.Context { +func (mock *PolarStateDBMock) GetContext() context.Context { if mock.GetContextFunc == nil { - panic("PolarisStateDBMock.GetContextFunc: method is nil but PolarisStateDB.GetContext was just called") + panic("PolarStateDBMock.GetContextFunc: method is nil but PolarStateDB.GetContext was just called") } callInfo := struct { }{} @@ -1445,8 +1455,8 @@ func (mock *PolarisStateDBMock) GetContext() context.Context { // GetContextCalls gets all the calls that were made to GetContext. // Check the length with: // -// len(mockedPolarisStateDB.GetContextCalls()) -func (mock *PolarisStateDBMock) GetContextCalls() []struct { +// len(mockedPolarStateDB.GetContextCalls()) +func (mock *PolarStateDBMock) GetContextCalls() []struct { } { var calls []struct { } @@ -1457,9 +1467,9 @@ func (mock *PolarisStateDBMock) GetContextCalls() []struct { } // GetLogs calls GetLogsFunc. -func (mock *PolarisStateDBMock) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { +func (mock *PolarStateDBMock) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { if mock.GetLogsFunc == nil { - panic("PolarisStateDBMock.GetLogsFunc: method is nil but PolarisStateDB.GetLogs was just called") + panic("PolarStateDBMock.GetLogsFunc: method is nil but PolarStateDB.GetLogs was just called") } callInfo := struct { Hash common.Hash @@ -1479,8 +1489,8 @@ func (mock *PolarisStateDBMock) GetLogs(hash common.Hash, blockNumber uint64, bl // GetLogsCalls gets all the calls that were made to GetLogs. // Check the length with: // -// len(mockedPolarisStateDB.GetLogsCalls()) -func (mock *PolarisStateDBMock) GetLogsCalls() []struct { +// len(mockedPolarStateDB.GetLogsCalls()) +func (mock *PolarStateDBMock) GetLogsCalls() []struct { Hash common.Hash BlockNumber uint64 BlockHash common.Hash @@ -1497,9 +1507,9 @@ func (mock *PolarisStateDBMock) GetLogsCalls() []struct { } // GetNonce calls GetNonceFunc. -func (mock *PolarisStateDBMock) GetNonce(address common.Address) uint64 { +func (mock *PolarStateDBMock) GetNonce(address common.Address) uint64 { if mock.GetNonceFunc == nil { - panic("PolarisStateDBMock.GetNonceFunc: method is nil but PolarisStateDB.GetNonce was just called") + panic("PolarStateDBMock.GetNonceFunc: method is nil but PolarStateDB.GetNonce was just called") } callInfo := struct { Address common.Address @@ -1515,8 +1525,8 @@ func (mock *PolarisStateDBMock) GetNonce(address common.Address) uint64 { // GetNonceCalls gets all the calls that were made to GetNonce. // Check the length with: // -// len(mockedPolarisStateDB.GetNonceCalls()) -func (mock *PolarisStateDBMock) GetNonceCalls() []struct { +// len(mockedPolarStateDB.GetNonceCalls()) +func (mock *PolarStateDBMock) GetNonceCalls() []struct { Address common.Address } { var calls []struct { @@ -1529,9 +1539,9 @@ func (mock *PolarisStateDBMock) GetNonceCalls() []struct { } // GetOrNewStateObject calls GetOrNewStateObjectFunc. -func (mock *PolarisStateDBMock) GetOrNewStateObject(addr common.Address) *state.StateObject { +func (mock *PolarStateDBMock) GetOrNewStateObject(addr common.Address) *state.StateObject { if mock.GetOrNewStateObjectFunc == nil { - panic("PolarisStateDBMock.GetOrNewStateObjectFunc: method is nil but PolarisStateDB.GetOrNewStateObject was just called") + panic("PolarStateDBMock.GetOrNewStateObjectFunc: method is nil but PolarStateDB.GetOrNewStateObject was just called") } callInfo := struct { Addr common.Address @@ -1547,8 +1557,8 @@ func (mock *PolarisStateDBMock) GetOrNewStateObject(addr common.Address) *state. // GetOrNewStateObjectCalls gets all the calls that were made to GetOrNewStateObject. // Check the length with: // -// len(mockedPolarisStateDB.GetOrNewStateObjectCalls()) -func (mock *PolarisStateDBMock) GetOrNewStateObjectCalls() []struct { +// len(mockedPolarStateDB.GetOrNewStateObjectCalls()) +func (mock *PolarStateDBMock) GetOrNewStateObjectCalls() []struct { Addr common.Address } { var calls []struct { @@ -1560,10 +1570,37 @@ func (mock *PolarisStateDBMock) GetOrNewStateObjectCalls() []struct { return calls } +// GetPrecompileManager calls GetPrecompileManagerFunc. +func (mock *PolarStateDBMock) GetPrecompileManager() any { + if mock.GetPrecompileManagerFunc == nil { + panic("PolarStateDBMock.GetPrecompileManagerFunc: method is nil but PolarStateDB.GetPrecompileManager was just called") + } + callInfo := struct { + }{} + mock.lockGetPrecompileManager.Lock() + mock.calls.GetPrecompileManager = append(mock.calls.GetPrecompileManager, callInfo) + mock.lockGetPrecompileManager.Unlock() + return mock.GetPrecompileManagerFunc() +} + +// GetPrecompileManagerCalls gets all the calls that were made to GetPrecompileManager. +// Check the length with: +// +// len(mockedPolarStateDB.GetPrecompileManagerCalls()) +func (mock *PolarStateDBMock) GetPrecompileManagerCalls() []struct { +} { + var calls []struct { + } + mock.lockGetPrecompileManager.RLock() + calls = mock.calls.GetPrecompileManager + mock.lockGetPrecompileManager.RUnlock() + return calls +} + // GetRefund calls GetRefundFunc. -func (mock *PolarisStateDBMock) GetRefund() uint64 { +func (mock *PolarStateDBMock) GetRefund() uint64 { if mock.GetRefundFunc == nil { - panic("PolarisStateDBMock.GetRefundFunc: method is nil but PolarisStateDB.GetRefund was just called") + panic("PolarStateDBMock.GetRefundFunc: method is nil but PolarStateDB.GetRefund was just called") } callInfo := struct { }{} @@ -1576,8 +1613,8 @@ func (mock *PolarisStateDBMock) GetRefund() uint64 { // GetRefundCalls gets all the calls that were made to GetRefund. // Check the length with: // -// len(mockedPolarisStateDB.GetRefundCalls()) -func (mock *PolarisStateDBMock) GetRefundCalls() []struct { +// len(mockedPolarStateDB.GetRefundCalls()) +func (mock *PolarStateDBMock) GetRefundCalls() []struct { } { var calls []struct { } @@ -1588,9 +1625,9 @@ func (mock *PolarisStateDBMock) GetRefundCalls() []struct { } // GetState calls GetStateFunc. -func (mock *PolarisStateDBMock) GetState(address common.Address, hash common.Hash) common.Hash { +func (mock *PolarStateDBMock) GetState(address common.Address, hash common.Hash) common.Hash { if mock.GetStateFunc == nil { - panic("PolarisStateDBMock.GetStateFunc: method is nil but PolarisStateDB.GetState was just called") + panic("PolarStateDBMock.GetStateFunc: method is nil but PolarStateDB.GetState was just called") } callInfo := struct { Address common.Address @@ -1608,8 +1645,8 @@ func (mock *PolarisStateDBMock) GetState(address common.Address, hash common.Has // GetStateCalls gets all the calls that were made to GetState. // Check the length with: // -// len(mockedPolarisStateDB.GetStateCalls()) -func (mock *PolarisStateDBMock) GetStateCalls() []struct { +// len(mockedPolarStateDB.GetStateCalls()) +func (mock *PolarStateDBMock) GetStateCalls() []struct { Address common.Address Hash common.Hash } { @@ -1624,9 +1661,9 @@ func (mock *PolarisStateDBMock) GetStateCalls() []struct { } // GetStorageRoot calls GetStorageRootFunc. -func (mock *PolarisStateDBMock) GetStorageRoot(addr common.Address) common.Hash { +func (mock *PolarStateDBMock) GetStorageRoot(addr common.Address) common.Hash { if mock.GetStorageRootFunc == nil { - panic("PolarisStateDBMock.GetStorageRootFunc: method is nil but PolarisStateDB.GetStorageRoot was just called") + panic("PolarStateDBMock.GetStorageRootFunc: method is nil but PolarStateDB.GetStorageRoot was just called") } callInfo := struct { Addr common.Address @@ -1642,8 +1679,8 @@ func (mock *PolarisStateDBMock) GetStorageRoot(addr common.Address) common.Hash // GetStorageRootCalls gets all the calls that were made to GetStorageRoot. // Check the length with: // -// len(mockedPolarisStateDB.GetStorageRootCalls()) -func (mock *PolarisStateDBMock) GetStorageRootCalls() []struct { +// len(mockedPolarStateDB.GetStorageRootCalls()) +func (mock *PolarStateDBMock) GetStorageRootCalls() []struct { Addr common.Address } { var calls []struct { @@ -1656,9 +1693,9 @@ func (mock *PolarisStateDBMock) GetStorageRootCalls() []struct { } // GetTransientState calls GetTransientStateFunc. -func (mock *PolarisStateDBMock) GetTransientState(addr common.Address, key common.Hash) common.Hash { +func (mock *PolarStateDBMock) GetTransientState(addr common.Address, key common.Hash) common.Hash { if mock.GetTransientStateFunc == nil { - panic("PolarisStateDBMock.GetTransientStateFunc: method is nil but PolarisStateDB.GetTransientState was just called") + panic("PolarStateDBMock.GetTransientStateFunc: method is nil but PolarStateDB.GetTransientState was just called") } callInfo := struct { Addr common.Address @@ -1676,8 +1713,8 @@ func (mock *PolarisStateDBMock) GetTransientState(addr common.Address, key commo // GetTransientStateCalls gets all the calls that were made to GetTransientState. // Check the length with: // -// len(mockedPolarisStateDB.GetTransientStateCalls()) -func (mock *PolarisStateDBMock) GetTransientStateCalls() []struct { +// len(mockedPolarStateDB.GetTransientStateCalls()) +func (mock *PolarStateDBMock) GetTransientStateCalls() []struct { Addr common.Address Key common.Hash } { @@ -1692,9 +1729,9 @@ func (mock *PolarisStateDBMock) GetTransientStateCalls() []struct { } // HasSelfDestructed calls HasSelfDestructedFunc. -func (mock *PolarisStateDBMock) HasSelfDestructed(address common.Address) bool { +func (mock *PolarStateDBMock) HasSelfDestructed(address common.Address) bool { if mock.HasSelfDestructedFunc == nil { - panic("PolarisStateDBMock.HasSelfDestructedFunc: method is nil but PolarisStateDB.HasSelfDestructed was just called") + panic("PolarStateDBMock.HasSelfDestructedFunc: method is nil but PolarStateDB.HasSelfDestructed was just called") } callInfo := struct { Address common.Address @@ -1710,8 +1747,8 @@ func (mock *PolarisStateDBMock) HasSelfDestructed(address common.Address) bool { // HasSelfDestructedCalls gets all the calls that were made to HasSelfDestructed. // Check the length with: // -// len(mockedPolarisStateDB.HasSelfDestructedCalls()) -func (mock *PolarisStateDBMock) HasSelfDestructedCalls() []struct { +// len(mockedPolarStateDB.HasSelfDestructedCalls()) +func (mock *PolarStateDBMock) HasSelfDestructedCalls() []struct { Address common.Address } { var calls []struct { @@ -1724,9 +1761,9 @@ func (mock *PolarisStateDBMock) HasSelfDestructedCalls() []struct { } // IntermediateRoot calls IntermediateRootFunc. -func (mock *PolarisStateDBMock) IntermediateRoot(deleteEmptyObjects bool) common.Hash { +func (mock *PolarStateDBMock) IntermediateRoot(deleteEmptyObjects bool) common.Hash { if mock.IntermediateRootFunc == nil { - panic("PolarisStateDBMock.IntermediateRootFunc: method is nil but PolarisStateDB.IntermediateRoot was just called") + panic("PolarStateDBMock.IntermediateRootFunc: method is nil but PolarStateDB.IntermediateRoot was just called") } callInfo := struct { DeleteEmptyObjects bool @@ -1742,8 +1779,8 @@ func (mock *PolarisStateDBMock) IntermediateRoot(deleteEmptyObjects bool) common // IntermediateRootCalls gets all the calls that were made to IntermediateRoot. // Check the length with: // -// len(mockedPolarisStateDB.IntermediateRootCalls()) -func (mock *PolarisStateDBMock) IntermediateRootCalls() []struct { +// len(mockedPolarStateDB.IntermediateRootCalls()) +func (mock *PolarStateDBMock) IntermediateRootCalls() []struct { DeleteEmptyObjects bool } { var calls []struct { @@ -1756,9 +1793,9 @@ func (mock *PolarisStateDBMock) IntermediateRootCalls() []struct { } // IteratorDump calls IteratorDumpFunc. -func (mock *PolarisStateDBMock) IteratorDump(opts *state.DumpConfig) state.IteratorDump { +func (mock *PolarStateDBMock) IteratorDump(opts *state.DumpConfig) state.IteratorDump { if mock.IteratorDumpFunc == nil { - panic("PolarisStateDBMock.IteratorDumpFunc: method is nil but PolarisStateDB.IteratorDump was just called") + panic("PolarStateDBMock.IteratorDumpFunc: method is nil but PolarStateDB.IteratorDump was just called") } callInfo := struct { Opts *state.DumpConfig @@ -1774,8 +1811,8 @@ func (mock *PolarisStateDBMock) IteratorDump(opts *state.DumpConfig) state.Itera // IteratorDumpCalls gets all the calls that were made to IteratorDump. // Check the length with: // -// len(mockedPolarisStateDB.IteratorDumpCalls()) -func (mock *PolarisStateDBMock) IteratorDumpCalls() []struct { +// len(mockedPolarStateDB.IteratorDumpCalls()) +func (mock *PolarStateDBMock) IteratorDumpCalls() []struct { Opts *state.DumpConfig } { var calls []struct { @@ -1788,9 +1825,9 @@ func (mock *PolarisStateDBMock) IteratorDumpCalls() []struct { } // Logs calls LogsFunc. -func (mock *PolarisStateDBMock) Logs() []*types.Log { +func (mock *PolarStateDBMock) Logs() []*types.Log { if mock.LogsFunc == nil { - panic("PolarisStateDBMock.LogsFunc: method is nil but PolarisStateDB.Logs was just called") + panic("PolarStateDBMock.LogsFunc: method is nil but PolarStateDB.Logs was just called") } callInfo := struct { }{} @@ -1803,8 +1840,8 @@ func (mock *PolarisStateDBMock) Logs() []*types.Log { // LogsCalls gets all the calls that were made to Logs. // Check the length with: // -// len(mockedPolarisStateDB.LogsCalls()) -func (mock *PolarisStateDBMock) LogsCalls() []struct { +// len(mockedPolarStateDB.LogsCalls()) +func (mock *PolarStateDBMock) LogsCalls() []struct { } { var calls []struct { } @@ -1815,9 +1852,9 @@ func (mock *PolarisStateDBMock) LogsCalls() []struct { } // Preimages calls PreimagesFunc. -func (mock *PolarisStateDBMock) Preimages() map[common.Hash][]byte { +func (mock *PolarStateDBMock) Preimages() map[common.Hash][]byte { if mock.PreimagesFunc == nil { - panic("PolarisStateDBMock.PreimagesFunc: method is nil but PolarisStateDB.Preimages was just called") + panic("PolarStateDBMock.PreimagesFunc: method is nil but PolarStateDB.Preimages was just called") } callInfo := struct { }{} @@ -1830,8 +1867,8 @@ func (mock *PolarisStateDBMock) Preimages() map[common.Hash][]byte { // PreimagesCalls gets all the calls that were made to Preimages. // Check the length with: // -// len(mockedPolarisStateDB.PreimagesCalls()) -func (mock *PolarisStateDBMock) PreimagesCalls() []struct { +// len(mockedPolarStateDB.PreimagesCalls()) +func (mock *PolarStateDBMock) PreimagesCalls() []struct { } { var calls []struct { } @@ -1842,9 +1879,9 @@ func (mock *PolarisStateDBMock) PreimagesCalls() []struct { } // Prepare calls PrepareFunc. -func (mock *PolarisStateDBMock) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { +func (mock *PolarStateDBMock) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { if mock.PrepareFunc == nil { - panic("PolarisStateDBMock.PrepareFunc: method is nil but PolarisStateDB.Prepare was just called") + panic("PolarStateDBMock.PrepareFunc: method is nil but PolarStateDB.Prepare was just called") } callInfo := struct { Rules params.Rules @@ -1870,8 +1907,8 @@ func (mock *PolarisStateDBMock) Prepare(rules params.Rules, sender common.Addres // PrepareCalls gets all the calls that were made to Prepare. // Check the length with: // -// len(mockedPolarisStateDB.PrepareCalls()) -func (mock *PolarisStateDBMock) PrepareCalls() []struct { +// len(mockedPolarStateDB.PrepareCalls()) +func (mock *PolarStateDBMock) PrepareCalls() []struct { Rules params.Rules Sender common.Address Coinbase common.Address @@ -1894,9 +1931,9 @@ func (mock *PolarisStateDBMock) PrepareCalls() []struct { } // RawDump calls RawDumpFunc. -func (mock *PolarisStateDBMock) RawDump(opts *state.DumpConfig) state.Dump { +func (mock *PolarStateDBMock) RawDump(opts *state.DumpConfig) state.Dump { if mock.RawDumpFunc == nil { - panic("PolarisStateDBMock.RawDumpFunc: method is nil but PolarisStateDB.RawDump was just called") + panic("PolarStateDBMock.RawDumpFunc: method is nil but PolarStateDB.RawDump was just called") } callInfo := struct { Opts *state.DumpConfig @@ -1912,8 +1949,8 @@ func (mock *PolarisStateDBMock) RawDump(opts *state.DumpConfig) state.Dump { // RawDumpCalls gets all the calls that were made to RawDump. // Check the length with: // -// len(mockedPolarisStateDB.RawDumpCalls()) -func (mock *PolarisStateDBMock) RawDumpCalls() []struct { +// len(mockedPolarStateDB.RawDumpCalls()) +func (mock *PolarStateDBMock) RawDumpCalls() []struct { Opts *state.DumpConfig } { var calls []struct { @@ -1926,9 +1963,9 @@ func (mock *PolarisStateDBMock) RawDumpCalls() []struct { } // RevertToSnapshot calls RevertToSnapshotFunc. -func (mock *PolarisStateDBMock) RevertToSnapshot(n int) { +func (mock *PolarStateDBMock) RevertToSnapshot(n int) { if mock.RevertToSnapshotFunc == nil { - panic("PolarisStateDBMock.RevertToSnapshotFunc: method is nil but PolarisStateDB.RevertToSnapshot was just called") + panic("PolarStateDBMock.RevertToSnapshotFunc: method is nil but PolarStateDB.RevertToSnapshot was just called") } callInfo := struct { N int @@ -1944,8 +1981,8 @@ func (mock *PolarisStateDBMock) RevertToSnapshot(n int) { // RevertToSnapshotCalls gets all the calls that were made to RevertToSnapshot. // Check the length with: // -// len(mockedPolarisStateDB.RevertToSnapshotCalls()) -func (mock *PolarisStateDBMock) RevertToSnapshotCalls() []struct { +// len(mockedPolarStateDB.RevertToSnapshotCalls()) +func (mock *PolarStateDBMock) RevertToSnapshotCalls() []struct { N int } { var calls []struct { @@ -1958,9 +1995,9 @@ func (mock *PolarisStateDBMock) RevertToSnapshotCalls() []struct { } // SelfDestruct calls SelfDestructFunc. -func (mock *PolarisStateDBMock) SelfDestruct(address common.Address) { +func (mock *PolarStateDBMock) SelfDestruct(address common.Address) { if mock.SelfDestructFunc == nil { - panic("PolarisStateDBMock.SelfDestructFunc: method is nil but PolarisStateDB.SelfDestruct was just called") + panic("PolarStateDBMock.SelfDestructFunc: method is nil but PolarStateDB.SelfDestruct was just called") } callInfo := struct { Address common.Address @@ -1976,8 +2013,8 @@ func (mock *PolarisStateDBMock) SelfDestruct(address common.Address) { // SelfDestructCalls gets all the calls that were made to SelfDestruct. // Check the length with: // -// len(mockedPolarisStateDB.SelfDestructCalls()) -func (mock *PolarisStateDBMock) SelfDestructCalls() []struct { +// len(mockedPolarStateDB.SelfDestructCalls()) +func (mock *PolarStateDBMock) SelfDestructCalls() []struct { Address common.Address } { var calls []struct { @@ -1990,9 +2027,9 @@ func (mock *PolarisStateDBMock) SelfDestructCalls() []struct { } // Selfdestruct6780 calls Selfdestruct6780Func. -func (mock *PolarisStateDBMock) Selfdestruct6780(address common.Address) { +func (mock *PolarStateDBMock) Selfdestruct6780(address common.Address) { if mock.Selfdestruct6780Func == nil { - panic("PolarisStateDBMock.Selfdestruct6780Func: method is nil but PolarisStateDB.Selfdestruct6780 was just called") + panic("PolarStateDBMock.Selfdestruct6780Func: method is nil but PolarStateDB.Selfdestruct6780 was just called") } callInfo := struct { Address common.Address @@ -2008,8 +2045,8 @@ func (mock *PolarisStateDBMock) Selfdestruct6780(address common.Address) { // Selfdestruct6780Calls gets all the calls that were made to Selfdestruct6780. // Check the length with: // -// len(mockedPolarisStateDB.Selfdestruct6780Calls()) -func (mock *PolarisStateDBMock) Selfdestruct6780Calls() []struct { +// len(mockedPolarStateDB.Selfdestruct6780Calls()) +func (mock *PolarStateDBMock) Selfdestruct6780Calls() []struct { Address common.Address } { var calls []struct { @@ -2022,9 +2059,9 @@ func (mock *PolarisStateDBMock) Selfdestruct6780Calls() []struct { } // SetBalance calls SetBalanceFunc. -func (mock *PolarisStateDBMock) SetBalance(addr common.Address, amount *big.Int) { +func (mock *PolarStateDBMock) SetBalance(addr common.Address, amount *big.Int) { if mock.SetBalanceFunc == nil { - panic("PolarisStateDBMock.SetBalanceFunc: method is nil but PolarisStateDB.SetBalance was just called") + panic("PolarStateDBMock.SetBalanceFunc: method is nil but PolarStateDB.SetBalance was just called") } callInfo := struct { Addr common.Address @@ -2042,8 +2079,8 @@ func (mock *PolarisStateDBMock) SetBalance(addr common.Address, amount *big.Int) // SetBalanceCalls gets all the calls that were made to SetBalance. // Check the length with: // -// len(mockedPolarisStateDB.SetBalanceCalls()) -func (mock *PolarisStateDBMock) SetBalanceCalls() []struct { +// len(mockedPolarStateDB.SetBalanceCalls()) +func (mock *PolarStateDBMock) SetBalanceCalls() []struct { Addr common.Address Amount *big.Int } { @@ -2058,9 +2095,9 @@ func (mock *PolarisStateDBMock) SetBalanceCalls() []struct { } // SetCode calls SetCodeFunc. -func (mock *PolarisStateDBMock) SetCode(address common.Address, bytes []byte) { +func (mock *PolarStateDBMock) SetCode(address common.Address, bytes []byte) { if mock.SetCodeFunc == nil { - panic("PolarisStateDBMock.SetCodeFunc: method is nil but PolarisStateDB.SetCode was just called") + panic("PolarStateDBMock.SetCodeFunc: method is nil but PolarStateDB.SetCode was just called") } callInfo := struct { Address common.Address @@ -2078,8 +2115,8 @@ func (mock *PolarisStateDBMock) SetCode(address common.Address, bytes []byte) { // SetCodeCalls gets all the calls that were made to SetCode. // Check the length with: // -// len(mockedPolarisStateDB.SetCodeCalls()) -func (mock *PolarisStateDBMock) SetCodeCalls() []struct { +// len(mockedPolarStateDB.SetCodeCalls()) +func (mock *PolarStateDBMock) SetCodeCalls() []struct { Address common.Address Bytes []byte } { @@ -2094,9 +2131,9 @@ func (mock *PolarisStateDBMock) SetCodeCalls() []struct { } // SetNonce calls SetNonceFunc. -func (mock *PolarisStateDBMock) SetNonce(address common.Address, v uint64) { +func (mock *PolarStateDBMock) SetNonce(address common.Address, v uint64) { if mock.SetNonceFunc == nil { - panic("PolarisStateDBMock.SetNonceFunc: method is nil but PolarisStateDB.SetNonce was just called") + panic("PolarStateDBMock.SetNonceFunc: method is nil but PolarStateDB.SetNonce was just called") } callInfo := struct { Address common.Address @@ -2114,8 +2151,8 @@ func (mock *PolarisStateDBMock) SetNonce(address common.Address, v uint64) { // SetNonceCalls gets all the calls that were made to SetNonce. // Check the length with: // -// len(mockedPolarisStateDB.SetNonceCalls()) -func (mock *PolarisStateDBMock) SetNonceCalls() []struct { +// len(mockedPolarStateDB.SetNonceCalls()) +func (mock *PolarStateDBMock) SetNonceCalls() []struct { Address common.Address V uint64 } { @@ -2130,9 +2167,9 @@ func (mock *PolarisStateDBMock) SetNonceCalls() []struct { } // SetState calls SetStateFunc. -func (mock *PolarisStateDBMock) SetState(address common.Address, hash1 common.Hash, hash2 common.Hash) { +func (mock *PolarStateDBMock) SetState(address common.Address, hash1 common.Hash, hash2 common.Hash) { if mock.SetStateFunc == nil { - panic("PolarisStateDBMock.SetStateFunc: method is nil but PolarisStateDB.SetState was just called") + panic("PolarStateDBMock.SetStateFunc: method is nil but PolarStateDB.SetState was just called") } callInfo := struct { Address common.Address @@ -2152,8 +2189,8 @@ func (mock *PolarisStateDBMock) SetState(address common.Address, hash1 common.Ha // SetStateCalls gets all the calls that were made to SetState. // Check the length with: // -// len(mockedPolarisStateDB.SetStateCalls()) -func (mock *PolarisStateDBMock) SetStateCalls() []struct { +// len(mockedPolarStateDB.SetStateCalls()) +func (mock *PolarStateDBMock) SetStateCalls() []struct { Address common.Address Hash1 common.Hash Hash2 common.Hash @@ -2170,9 +2207,9 @@ func (mock *PolarisStateDBMock) SetStateCalls() []struct { } // SetStorage calls SetStorageFunc. -func (mock *PolarisStateDBMock) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { +func (mock *PolarStateDBMock) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { if mock.SetStorageFunc == nil { - panic("PolarisStateDBMock.SetStorageFunc: method is nil but PolarisStateDB.SetStorage was just called") + panic("PolarStateDBMock.SetStorageFunc: method is nil but PolarStateDB.SetStorage was just called") } callInfo := struct { Addr common.Address @@ -2190,8 +2227,8 @@ func (mock *PolarisStateDBMock) SetStorage(addr common.Address, storage map[comm // SetStorageCalls gets all the calls that were made to SetStorage. // Check the length with: // -// len(mockedPolarisStateDB.SetStorageCalls()) -func (mock *PolarisStateDBMock) SetStorageCalls() []struct { +// len(mockedPolarStateDB.SetStorageCalls()) +func (mock *PolarStateDBMock) SetStorageCalls() []struct { Addr common.Address Storage map[common.Hash]common.Hash } { @@ -2206,9 +2243,9 @@ func (mock *PolarisStateDBMock) SetStorageCalls() []struct { } // SetTransientState calls SetTransientStateFunc. -func (mock *PolarisStateDBMock) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { +func (mock *PolarStateDBMock) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { if mock.SetTransientStateFunc == nil { - panic("PolarisStateDBMock.SetTransientStateFunc: method is nil but PolarisStateDB.SetTransientState was just called") + panic("PolarStateDBMock.SetTransientStateFunc: method is nil but PolarStateDB.SetTransientState was just called") } callInfo := struct { Addr common.Address @@ -2228,8 +2265,8 @@ func (mock *PolarisStateDBMock) SetTransientState(addr common.Address, key commo // SetTransientStateCalls gets all the calls that were made to SetTransientState. // Check the length with: // -// len(mockedPolarisStateDB.SetTransientStateCalls()) -func (mock *PolarisStateDBMock) SetTransientStateCalls() []struct { +// len(mockedPolarStateDB.SetTransientStateCalls()) +func (mock *PolarStateDBMock) SetTransientStateCalls() []struct { Addr common.Address Key common.Hash Value common.Hash @@ -2246,9 +2283,9 @@ func (mock *PolarisStateDBMock) SetTransientStateCalls() []struct { } // SetTxContext calls SetTxContextFunc. -func (mock *PolarisStateDBMock) SetTxContext(thash common.Hash, ti int) { +func (mock *PolarStateDBMock) SetTxContext(thash common.Hash, ti int) { if mock.SetTxContextFunc == nil { - panic("PolarisStateDBMock.SetTxContextFunc: method is nil but PolarisStateDB.SetTxContext was just called") + panic("PolarStateDBMock.SetTxContextFunc: method is nil but PolarStateDB.SetTxContext was just called") } callInfo := struct { Thash common.Hash @@ -2266,8 +2303,8 @@ func (mock *PolarisStateDBMock) SetTxContext(thash common.Hash, ti int) { // SetTxContextCalls gets all the calls that were made to SetTxContext. // Check the length with: // -// len(mockedPolarisStateDB.SetTxContextCalls()) -func (mock *PolarisStateDBMock) SetTxContextCalls() []struct { +// len(mockedPolarStateDB.SetTxContextCalls()) +func (mock *PolarStateDBMock) SetTxContextCalls() []struct { Thash common.Hash Ti int } { @@ -2282,9 +2319,9 @@ func (mock *PolarisStateDBMock) SetTxContextCalls() []struct { } // SlotInAccessList calls SlotInAccessListFunc. -func (mock *PolarisStateDBMock) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { +func (mock *PolarStateDBMock) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { if mock.SlotInAccessListFunc == nil { - panic("PolarisStateDBMock.SlotInAccessListFunc: method is nil but PolarisStateDB.SlotInAccessList was just called") + panic("PolarStateDBMock.SlotInAccessListFunc: method is nil but PolarStateDB.SlotInAccessList was just called") } callInfo := struct { Addr common.Address @@ -2302,8 +2339,8 @@ func (mock *PolarisStateDBMock) SlotInAccessList(addr common.Address, slot commo // SlotInAccessListCalls gets all the calls that were made to SlotInAccessList. // Check the length with: // -// len(mockedPolarisStateDB.SlotInAccessListCalls()) -func (mock *PolarisStateDBMock) SlotInAccessListCalls() []struct { +// len(mockedPolarStateDB.SlotInAccessListCalls()) +func (mock *PolarStateDBMock) SlotInAccessListCalls() []struct { Addr common.Address Slot common.Hash } { @@ -2318,9 +2355,9 @@ func (mock *PolarisStateDBMock) SlotInAccessListCalls() []struct { } // Snapshot calls SnapshotFunc. -func (mock *PolarisStateDBMock) Snapshot() int { +func (mock *PolarStateDBMock) Snapshot() int { if mock.SnapshotFunc == nil { - panic("PolarisStateDBMock.SnapshotFunc: method is nil but PolarisStateDB.Snapshot was just called") + panic("PolarStateDBMock.SnapshotFunc: method is nil but PolarStateDB.Snapshot was just called") } callInfo := struct { }{} @@ -2333,8 +2370,8 @@ func (mock *PolarisStateDBMock) Snapshot() int { // SnapshotCalls gets all the calls that were made to Snapshot. // Check the length with: // -// len(mockedPolarisStateDB.SnapshotCalls()) -func (mock *PolarisStateDBMock) SnapshotCalls() []struct { +// len(mockedPolarStateDB.SnapshotCalls()) +func (mock *PolarStateDBMock) SnapshotCalls() []struct { } { var calls []struct { } @@ -2345,9 +2382,9 @@ func (mock *PolarisStateDBMock) SnapshotCalls() []struct { } // StartPrefetcher calls StartPrefetcherFunc. -func (mock *PolarisStateDBMock) StartPrefetcher(namespace string) { +func (mock *PolarStateDBMock) StartPrefetcher(namespace string) { if mock.StartPrefetcherFunc == nil { - panic("PolarisStateDBMock.StartPrefetcherFunc: method is nil but PolarisStateDB.StartPrefetcher was just called") + panic("PolarStateDBMock.StartPrefetcherFunc: method is nil but PolarStateDB.StartPrefetcher was just called") } callInfo := struct { Namespace string @@ -2363,8 +2400,8 @@ func (mock *PolarisStateDBMock) StartPrefetcher(namespace string) { // StartPrefetcherCalls gets all the calls that were made to StartPrefetcher. // Check the length with: // -// len(mockedPolarisStateDB.StartPrefetcherCalls()) -func (mock *PolarisStateDBMock) StartPrefetcherCalls() []struct { +// len(mockedPolarStateDB.StartPrefetcherCalls()) +func (mock *PolarStateDBMock) StartPrefetcherCalls() []struct { Namespace string } { var calls []struct { @@ -2377,9 +2414,9 @@ func (mock *PolarisStateDBMock) StartPrefetcherCalls() []struct { } // StopPrefetcher calls StopPrefetcherFunc. -func (mock *PolarisStateDBMock) StopPrefetcher() { +func (mock *PolarStateDBMock) StopPrefetcher() { if mock.StopPrefetcherFunc == nil { - panic("PolarisStateDBMock.StopPrefetcherFunc: method is nil but PolarisStateDB.StopPrefetcher was just called") + panic("PolarStateDBMock.StopPrefetcherFunc: method is nil but PolarStateDB.StopPrefetcher was just called") } callInfo := struct { }{} @@ -2392,8 +2429,8 @@ func (mock *PolarisStateDBMock) StopPrefetcher() { // StopPrefetcherCalls gets all the calls that were made to StopPrefetcher. // Check the length with: // -// len(mockedPolarisStateDB.StopPrefetcherCalls()) -func (mock *PolarisStateDBMock) StopPrefetcherCalls() []struct { +// len(mockedPolarStateDB.StopPrefetcherCalls()) +func (mock *PolarStateDBMock) StopPrefetcherCalls() []struct { } { var calls []struct { } @@ -2404,9 +2441,9 @@ func (mock *PolarisStateDBMock) StopPrefetcherCalls() []struct { } // SubBalance calls SubBalanceFunc. -func (mock *PolarisStateDBMock) SubBalance(address common.Address, intMoqParam *big.Int) { +func (mock *PolarStateDBMock) SubBalance(address common.Address, intMoqParam *big.Int) { if mock.SubBalanceFunc == nil { - panic("PolarisStateDBMock.SubBalanceFunc: method is nil but PolarisStateDB.SubBalance was just called") + panic("PolarStateDBMock.SubBalanceFunc: method is nil but PolarStateDB.SubBalance was just called") } callInfo := struct { Address common.Address @@ -2424,8 +2461,8 @@ func (mock *PolarisStateDBMock) SubBalance(address common.Address, intMoqParam * // SubBalanceCalls gets all the calls that were made to SubBalance. // Check the length with: // -// len(mockedPolarisStateDB.SubBalanceCalls()) -func (mock *PolarisStateDBMock) SubBalanceCalls() []struct { +// len(mockedPolarStateDB.SubBalanceCalls()) +func (mock *PolarStateDBMock) SubBalanceCalls() []struct { Address common.Address IntMoqParam *big.Int } { @@ -2440,9 +2477,9 @@ func (mock *PolarisStateDBMock) SubBalanceCalls() []struct { } // SubRefund calls SubRefundFunc. -func (mock *PolarisStateDBMock) SubRefund(v uint64) { +func (mock *PolarStateDBMock) SubRefund(v uint64) { if mock.SubRefundFunc == nil { - panic("PolarisStateDBMock.SubRefundFunc: method is nil but PolarisStateDB.SubRefund was just called") + panic("PolarStateDBMock.SubRefundFunc: method is nil but PolarStateDB.SubRefund was just called") } callInfo := struct { V uint64 @@ -2458,8 +2495,8 @@ func (mock *PolarisStateDBMock) SubRefund(v uint64) { // SubRefundCalls gets all the calls that were made to SubRefund. // Check the length with: // -// len(mockedPolarisStateDB.SubRefundCalls()) -func (mock *PolarisStateDBMock) SubRefundCalls() []struct { +// len(mockedPolarStateDB.SubRefundCalls()) +func (mock *PolarStateDBMock) SubRefundCalls() []struct { V uint64 } { var calls []struct { @@ -2472,9 +2509,9 @@ func (mock *PolarisStateDBMock) SubRefundCalls() []struct { } // TxIndex calls TxIndexFunc. -func (mock *PolarisStateDBMock) TxIndex() int { +func (mock *PolarStateDBMock) TxIndex() int { if mock.TxIndexFunc == nil { - panic("PolarisStateDBMock.TxIndexFunc: method is nil but PolarisStateDB.TxIndex was just called") + panic("PolarStateDBMock.TxIndexFunc: method is nil but PolarStateDB.TxIndex was just called") } callInfo := struct { }{} @@ -2487,8 +2524,8 @@ func (mock *PolarisStateDBMock) TxIndex() int { // TxIndexCalls gets all the calls that were made to TxIndex. // Check the length with: // -// len(mockedPolarisStateDB.TxIndexCalls()) -func (mock *PolarisStateDBMock) TxIndexCalls() []struct { +// len(mockedPolarStateDB.TxIndexCalls()) +func (mock *PolarStateDBMock) TxIndexCalls() []struct { } { var calls []struct { } diff --git a/eth/go.mod b/eth/go.mod index 23f58f9ca9..fc89a05ce0 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 require ( github.com/ethereum/go-ethereum v1.13.1 diff --git a/eth/go.sum b/eth/go.sum index d49ee896e0..0355afeced 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -12,8 +12,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f h1:GMdBm1AyuJo352zHWJLSgQzgJ+DTQ42S3F8pdYkCDrc= -github.com/berachain/polaris-geth v0.0.0-20230928023220-89db795f378f/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= diff --git a/eth/miner/miner.go b/eth/miner/miner.go index 58bc799b4b..d0586aea29 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -77,7 +77,7 @@ type miner struct { sp core.StatePlugin logger log.Logger vmConfig vm.Config - statedb vm.PolarisStateDB + statedb state.PolarStateDB // TODO: historical plugin has no purpose here in the miner. // Should be handled async via channel @@ -204,17 +204,8 @@ func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { m.processor = core.NewStateProcessor( m.cp, m.pp, m.statedb, &m.vmConfig, ) - var ( - // TODO: we are hardcoding author to coinbase, this may be incorrect. - // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. - context = core.NewEVMBlockContext(m.pendingHeader, m.chain, &m.pendingHeader.Coinbase) - vmenv = vm.NewGethEVMWithPrecompiles(context, - vm.TxContext{}, m.statedb, chainConfig, m.vmConfig, m.pp, - ) - ) m.processor.Prepare( - vmenv, m.pendingHeader, ) return m.pendingHeader @@ -240,7 +231,7 @@ func (m *miner) ProcessTransaction( panic("gas consumed mismatch") } - receipt, err := m.processor.ProcessTransaction(ctx, m.gasPool, tx) + receipt, err := m.processor.ProcessTransaction(ctx, m.chain, m.gasPool, tx) if err != nil { return nil, errorslib.Wrapf( err, "could not process transaction [%s]", tx.Hash().Hex(), diff --git a/eth/polar/backend.go b/eth/polar/backend.go index a7de2f94d5..2ffe6a7cc0 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -296,7 +296,7 @@ func (b *backend) BlockByNumberOrHash( func (b *backend) StateAndHeaderByNumber( ctx context.Context, number rpc.BlockNumber, -) (state.StateDBI, *types.Header, error) { +) (state.StateDB, *types.Header, error) { // TODO: handling pending better // // Pending state is only known by the miner // if number == rpc.PendingBlockNumber { @@ -328,7 +328,7 @@ func (b *backend) StateAndHeaderByNumber( func (b *backend) StateAndHeaderByNumberOrHash( ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, -) (state.StateDBI, *types.Header, error) { +) (state.StateDB, *types.Header, error) { if blockNr, ok := blockNrOrHash.Number(); ok { return b.StateAndHeaderByNumber(ctx, blockNr) } @@ -408,9 +408,9 @@ func (b *backend) GetTd(_ context.Context, hash common.Hash) *big.Int { } // GetEVM returns a new EVM to be used for simulating a transaction, estimating gas etc. -func (b *backend) GetEVM(_ context.Context, msg *core.Message, state state.StateDBI, +func (b *backend) GetEVM(_ context.Context, msg *core.Message, state state.StateDB, header *types.Header, vmConfig *vm.Config, blockCtx *vm.BlockContext, -) (*vm.GethEVM, func() error) { +) (*vm.EVM, func() error) { if vmConfig == nil { vmConfig = b.polar.blockchain.GetVMConfig() } @@ -423,8 +423,8 @@ func (b *backend) GetEVM(_ context.Context, msg *core.Message, state state.State // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. context = core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) } - return vm.NewGethEVMWithPrecompiles(context, txContext, state, b.polar.blockchain.Config(), - *vmConfig, b.polar.Host().GetPrecompilePlugin()), state.Error + return vm.NewEVM(context, txContext, state, b.polar.blockchain.Config(), + *vmConfig), state.Error } // GetBlockContext returns a new block context to be used by a EVM. diff --git a/go.work.sum b/go.work.sum index 2903c5e39c..f0a96d9b16 100644 --- a/go.work.sum +++ b/go.work.sum @@ -302,78 +302,213 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= +github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/cloudflare/circl v1.3.1 h1:4OVCZRL62ijwEwxnF6I7hLwxvIYi3VaZt8TflkqtrtA= github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= +github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= +github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= +github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= +github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= +github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= +github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= +github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= +github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= +github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= +github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= +github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= +github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= @@ -384,14 +519,24 @@ github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojt github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db h1:gb2Z18BhTPJPpLQWj4T+rfKHYCHxRHCtRxhKKjRidVw= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0= @@ -401,6 +546,8 @@ github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BH github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= @@ -409,56 +556,202 @@ github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHs github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= +github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= +github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/hydrogen18/memlistener v1.0.0 h1:JR7eDj8HD6eXrc5fWLbSUnfcQFL06PYvCc0DKQnWfaU= @@ -467,6 +760,10 @@ github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/informalsystems/tm-load-test v1.3.0 h1:FGjKy7vBw6mXNakt+wmNWKggQZRsKkEYpaFk/zR64VA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= @@ -477,20 +774,35 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= @@ -512,12 +824,20 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= @@ -530,78 +850,161 @@ github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= +github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76 h1:0xuRacu/Zr+jX+KyLLPPktbwXqyOvnOPUQmMLzX1jxU= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= +github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3 h1:hUmXhbljNFtrH5hzV9kiRoddZ5nfPTq3K0Sb2hYYiqE= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= @@ -610,33 +1013,61 @@ github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR github.com/pointlander/peg v1.0.1 h1:mgA/GQE8TeS9MdkU6Xn6iEzBmQUQCNuWD7rHCK6Mjs0= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5 h1:CvqZS4QYHBRvx7AeFdimd16HCbLlYsvQMcKDACpJW/c= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96 h1:J8J/cgLDRuqXJnwIrRDBvtl+LLsdg7De74znW/BRRq4= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e h1:eTWZyPUnHcuGRDiryS/l2I7FfKjbU3IBx3IjqHPxuKU= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= @@ -644,29 +1075,67 @@ github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +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/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= @@ -677,7 +1146,9 @@ github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/V github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -693,11 +1164,21 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= +github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= +github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= @@ -708,37 +1189,331 @@ go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= +google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230928142528-23cc5f141354/go.mod h1:9aoV2M/XfS/kryhjpJWNjhGMDsZe28k5g8uLBsMB7aA= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:TZhwmadAUlnyf450t7suO5sN3AGRNE3qziXldP58rUs= +pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= +pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 910618d5f2dbc6e23f4daded13c599ac2255d07e Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 5 Oct 2023 23:08:29 -0400 Subject: [PATCH 066/122] fix(linter): ran on generated files --- .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- cosmos/config/mocks/app_options.go | 6 +- cosmos/txpool/mocks/geth_tx_pool.go | 16 +- cosmos/txpool/mocks/lifecycle.go | 14 +- cosmos/txpool/mocks/sdk_tx.go | 14 +- cosmos/txpool/mocks/subscription.go | 14 +- cosmos/txpool/mocks/tx_broadcaster.go | 6 +- cosmos/txpool/mocks/tx_serializer.go | 10 +- cosmos/txpool/mocks/tx_sub_provider.go | 6 +- eth/core/state/journal/mocks/accesslist.go | 46 +- eth/core/state/journal/mocks/log.go | 54 +- eth/core/state/journal/mocks/refund.go | 44 +- .../mocks/self_destruct_state_plugin.go | 14 +- .../state/journal/mocks/self_destructs.go | 48 +- .../state/journal/mocks/transient_storage.go | 38 +- eth/core/state/mocks/plugin.go | 122 +- eth/core/state/mocks/polar_state_db.go | 2221 +++++++++++++++++ eth/core/state/mocks/precompile_plugin.go | 26 +- 24 files changed, 2467 insertions(+), 246 deletions(-) create mode 100644 eth/core/state/mocks/polar_state_db.go diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index 376297b70d..14f70f9e4e 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -59,7 +59,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063050cea7c1461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220880f5489e49453362eeb55c21b28be9c028d9623e18b1acd73c94dc970ebbda164736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063050cea7c1461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220b24960b7384ca1abf8290dc87cefbb7f835f93af11afbf266c837880cf6cd57064736f6c63430008150033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index 3ed97e890f..7f38d198c2 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220d55ff6e47540c6013ff6f852d1f50dafdad161b2c9b5cc3e82260979ddd5d45864736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index 0876afbd46..109a788534 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212202e1468a72b27fde3d83a5309aa68fcf25206f0279af0dc51103f58e3bb5d376464736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220ab851443f7dbbdb8ff6ac1cdc960be254e43dfab414b10faa6d010e5aa77683f64736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index f6f2a2fd4f..7fad93d2b6 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -80,7 +80,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea26469706673582212203c7ce1b3f709dc4c2e7e6f7800d71758030d260c1778831901b5344c3f8e3cb964736f6c63430008150033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea2646970667358221220614f855df71fb0dcaa073fb7cf6fe4c48e6b4b6079b271afe8dcf9d2994b768664736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 84b67f7400..93edbbb45f 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220a6f566912966ed2968e320c805107684b738a4f13f93fe7f2f4fcd6e5dcab93664736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220a95be8fcf27bad0ecf864e34943144209da0a3001ad28554839a5f08d46bea2864736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index 7af11dac26..0ca17e0e43 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220081db97a7a754fb8487d8a3532e79ee0ebf63b3ea4349133dc6951386f7e6d6064736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220375eb2d2c8922549992938778c24612176f4fc0c735c5b703ff757b1e3dde82064736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index 10953f09ae..ee50028de0 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212202e51cf7fd61df0464d3a27dd6535d12e463c0bf3246e7a15387d926c38d7288764736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go index 330ea20b3a..4a23fb8ab4 100644 --- a/cosmos/config/mocks/app_options.go +++ b/cosmos/config/mocks/app_options.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// AppOptions is an autogenerated mock type for the AppOptions type. +// AppOptions is an autogenerated mock type for the AppOptions type type AppOptions struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *AppOptions) EXPECT() *AppOptions_Expecter { return &AppOptions_Expecter{mock: &_m.Mock} } -// Get provides a mock function with given fields: _a0. +// Get provides a mock function with given fields: _a0 func (_m *AppOptions) Get(_a0 string) interface{} { ret := _m.Called(_a0) @@ -33,7 +33,7 @@ func (_m *AppOptions) Get(_a0 string) interface{} { return r0 } -// AppOptions_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get'. +// AppOptions_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' type AppOptions_Get_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index e08484b46f..5bd365e04a 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -11,7 +11,7 @@ import ( types "github.com/ethereum/go-ethereum/core/types" ) -// GethTxPool is an autogenerated mock type for the GethTxPool type. +// GethTxPool is an autogenerated mock type for the GethTxPool type type GethTxPool struct { mock.Mock } @@ -24,7 +24,7 @@ func (_m *GethTxPool) EXPECT() *GethTxPool_Expecter { return &GethTxPool_Expecter{mock: &_m.Mock} } -// Add provides a mock function with given fields: _a0, _a1, _a2. +// Add provides a mock function with given fields: _a0, _a1, _a2 func (_m *GethTxPool) Add(_a0 []*types.Transaction, _a1 bool, _a2 bool) []error { ret := _m.Called(_a0, _a1, _a2) @@ -40,7 +40,7 @@ func (_m *GethTxPool) Add(_a0 []*types.Transaction, _a1 bool, _a2 bool) []error return r0 } -// GethTxPool_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add'. +// GethTxPool_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' type GethTxPool_Add_Call struct { *mock.Call } @@ -70,7 +70,7 @@ func (_c *GethTxPool_Add_Call) RunAndReturn(run func([]*types.Transaction, bool, return _c } -// Stats provides a mock function with given fields:. +// Stats provides a mock function with given fields: func (_m *GethTxPool) Stats() (int, int) { ret := _m.Called() @@ -94,12 +94,12 @@ func (_m *GethTxPool) Stats() (int, int) { return r0, r1 } -// GethTxPool_Stats_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stats'. +// GethTxPool_Stats_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stats' type GethTxPool_Stats_Call struct { *mock.Call } -// Stats is a helper method to define mock.On call. +// Stats is a helper method to define mock.On call func (_e *GethTxPool_Expecter) Stats() *GethTxPool_Stats_Call { return &GethTxPool_Stats_Call{Call: _e.mock.On("Stats")} } @@ -121,7 +121,7 @@ func (_c *GethTxPool_Stats_Call) RunAndReturn(run func() (int, int)) *GethTxPool return _c } -// SubscribeNewTxsEvent provides a mock function with given fields: _a0. +// SubscribeNewTxsEvent provides a mock function with given fields: _a0 func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Subscription { ret := _m.Called(_a0) @@ -137,7 +137,7 @@ func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Su return r0 } -// GethTxPool_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent'. +// GethTxPool_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent' type GethTxPool_SubscribeNewTxsEvent_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index 070e1cd017..406f3c5ffc 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// Lifecycle is an autogenerated mock type for the Lifecycle type. +// Lifecycle is an autogenerated mock type for the Lifecycle type type Lifecycle struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *Lifecycle) EXPECT() *Lifecycle_Expecter { return &Lifecycle_Expecter{mock: &_m.Mock} } -// Start provides a mock function with given fields:. +// Start provides a mock function with given fields: func (_m *Lifecycle) Start() error { ret := _m.Called() @@ -31,12 +31,12 @@ func (_m *Lifecycle) Start() error { return r0 } -// Lifecycle_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'. +// Lifecycle_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' type Lifecycle_Start_Call struct { *mock.Call } -// Start is a helper method to define mock.On call. +// Start is a helper method to define mock.On call func (_e *Lifecycle_Expecter) Start() *Lifecycle_Start_Call { return &Lifecycle_Start_Call{Call: _e.mock.On("Start")} } @@ -58,7 +58,7 @@ func (_c *Lifecycle_Start_Call) RunAndReturn(run func() error) *Lifecycle_Start_ return _c } -// Stop provides a mock function with given fields:. +// Stop provides a mock function with given fields: func (_m *Lifecycle) Stop() error { ret := _m.Called() @@ -72,12 +72,12 @@ func (_m *Lifecycle) Stop() error { return r0 } -// Lifecycle_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop'. +// Lifecycle_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' type Lifecycle_Stop_Call struct { *mock.Call } -// Stop is a helper method to define mock.On call. +// Stop is a helper method to define mock.On call func (_e *Lifecycle_Expecter) Stop() *Lifecycle_Stop_Call { return &Lifecycle_Stop_Call{Call: _e.mock.On("Stop")} } diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index e30574591e..87d77fbee7 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -9,7 +9,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" ) -// SdkTx is an autogenerated mock type for the SdkTx type. +// SdkTx is an autogenerated mock type for the SdkTx type type SdkTx struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *SdkTx) EXPECT() *SdkTx_Expecter { return &SdkTx_Expecter{mock: &_m.Mock} } -// GetMsgs provides a mock function with given fields:. +// GetMsgs provides a mock function with given fields: func (_m *SdkTx) GetMsgs() []proto.Message { ret := _m.Called() @@ -38,12 +38,12 @@ func (_m *SdkTx) GetMsgs() []proto.Message { return r0 } -// SdkTx_GetMsgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgs'. +// SdkTx_GetMsgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgs' type SdkTx_GetMsgs_Call struct { *mock.Call } -// GetMsgs is a helper method to define mock.On call. +// GetMsgs is a helper method to define mock.On call func (_e *SdkTx_Expecter) GetMsgs() *SdkTx_GetMsgs_Call { return &SdkTx_GetMsgs_Call{Call: _e.mock.On("GetMsgs")} } @@ -65,7 +65,7 @@ func (_c *SdkTx_GetMsgs_Call) RunAndReturn(run func() []proto.Message) *SdkTx_Ge return _c } -// GetMsgsV2 provides a mock function with given fields:. +// GetMsgsV2 provides a mock function with given fields: func (_m *SdkTx) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { ret := _m.Called() @@ -91,12 +91,12 @@ func (_m *SdkTx) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { return r0, r1 } -// SdkTx_GetMsgsV2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgsV2'. +// SdkTx_GetMsgsV2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetMsgsV2' type SdkTx_GetMsgsV2_Call struct { *mock.Call } -// GetMsgsV2 is a helper method to define mock.On call. +// GetMsgsV2 is a helper method to define mock.On call func (_e *SdkTx_Expecter) GetMsgsV2() *SdkTx_GetMsgsV2_Call { return &SdkTx_GetMsgsV2_Call{Call: _e.mock.On("GetMsgsV2")} } diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index ded31dd88d..134e480af0 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -4,7 +4,7 @@ package mocks import mock "github.com/stretchr/testify/mock" -// Subscription is an autogenerated mock type for the Subscription type. +// Subscription is an autogenerated mock type for the Subscription type type Subscription struct { mock.Mock } @@ -17,7 +17,7 @@ func (_m *Subscription) EXPECT() *Subscription_Expecter { return &Subscription_Expecter{mock: &_m.Mock} } -// Err provides a mock function with given fields:. +// Err provides a mock function with given fields: func (_m *Subscription) Err() <-chan error { ret := _m.Called() @@ -33,12 +33,12 @@ func (_m *Subscription) Err() <-chan error { return r0 } -// Subscription_Err_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Err'. +// Subscription_Err_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Err' type Subscription_Err_Call struct { *mock.Call } -// Err is a helper method to define mock.On call. +// Err is a helper method to define mock.On call func (_e *Subscription_Expecter) Err() *Subscription_Err_Call { return &Subscription_Err_Call{Call: _e.mock.On("Err")} } @@ -60,17 +60,17 @@ func (_c *Subscription_Err_Call) RunAndReturn(run func() <-chan error) *Subscrip return _c } -// Unsubscribe provides a mock function with given fields:. +// Unsubscribe provides a mock function with given fields: func (_m *Subscription) Unsubscribe() { _m.Called() } -// Subscription_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe'. +// Subscription_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe' type Subscription_Unsubscribe_Call struct { *mock.Call } -// Unsubscribe is a helper method to define mock.On call. +// Unsubscribe is a helper method to define mock.On call func (_e *Subscription_Expecter) Unsubscribe() *Subscription_Unsubscribe_Call { return &Subscription_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe")} } diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index 246250b3cd..f6798fa323 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -8,7 +8,7 @@ import ( types "github.com/cosmos/cosmos-sdk/types" ) -// TxBroadcaster is an autogenerated mock type for the TxBroadcaster type. +// TxBroadcaster is an autogenerated mock type for the TxBroadcaster type type TxBroadcaster struct { mock.Mock } @@ -21,7 +21,7 @@ func (_m *TxBroadcaster) EXPECT() *TxBroadcaster_Expecter { return &TxBroadcaster_Expecter{mock: &_m.Mock} } -// BroadcastTxSync provides a mock function with given fields: txBytes. +// BroadcastTxSync provides a mock function with given fields: txBytes func (_m *TxBroadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, error) { ret := _m.Called(txBytes) @@ -47,7 +47,7 @@ func (_m *TxBroadcaster) BroadcastTxSync(txBytes []byte) (*types.TxResponse, err return r0, r1 } -// TxBroadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync'. +// TxBroadcaster_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync' type TxBroadcaster_BroadcastTxSync_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 2ec15c0e0b..6a8449633a 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -9,7 +9,7 @@ import ( types "github.com/ethereum/go-ethereum/core/types" ) -// TxSerializer is an autogenerated mock type for the TxSerializer type. +// TxSerializer is an autogenerated mock type for the TxSerializer type type TxSerializer struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *TxSerializer) EXPECT() *TxSerializer_Expecter { return &TxSerializer_Expecter{mock: &_m.Mock} } -// SerializeToBytes provides a mock function with given fields: signedTx. +// SerializeToBytes provides a mock function with given fields: signedTx func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, error) { ret := _m.Called(signedTx) @@ -48,7 +48,7 @@ func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, e return r0, r1 } -// TxSerializer_SerializeToBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToBytes'. +// TxSerializer_SerializeToBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToBytes' type TxSerializer_SerializeToBytes_Call struct { *mock.Call } @@ -76,7 +76,7 @@ func (_c *TxSerializer_SerializeToBytes_Call) RunAndReturn(run func(*types.Trans return _c } -// SerializeToSdkTx provides a mock function with given fields: signedTx. +// SerializeToSdkTx provides a mock function with given fields: signedTx func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sdktypes.Tx, error) { ret := _m.Called(signedTx) @@ -102,7 +102,7 @@ func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sd return r0, r1 } -// TxSerializer_SerializeToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToSdkTx'. +// TxSerializer_SerializeToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToSdkTx' type TxSerializer_SerializeToSdkTx_Call struct { *mock.Call } diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index 6ed1da64ad..ec684dd312 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// TxSubProvider is an autogenerated mock type for the TxSubProvider type. +// TxSubProvider is an autogenerated mock type for the TxSubProvider type type TxSubProvider struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *TxSubProvider) EXPECT() *TxSubProvider_Expecter { return &TxSubProvider_Expecter{mock: &_m.Mock} } -// SubscribeNewTxsEvent provides a mock function with given fields: ch. +// SubscribeNewTxsEvent provides a mock function with given fields: ch func (_m *TxSubProvider) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { ret := _m.Called(ch) @@ -38,7 +38,7 @@ func (_m *TxSubProvider) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event. return r0 } -// TxSubProvider_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent'. +// TxSubProvider_SubscribeNewTxsEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewTxsEvent' type TxSubProvider_SubscribeNewTxsEvent_Call struct { *mock.Call } diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 6821066c60..257ab722b4 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// Accesslist is an autogenerated mock type for the Accesslist type. +// Accesslist is an autogenerated mock type for the Accesslist type type Accesslist struct { mock.Mock } @@ -22,12 +22,12 @@ func (_m *Accesslist) EXPECT() *Accesslist_Expecter { return &Accesslist_Expecter{mock: &_m.Mock} } -// AddAddressToAccessList provides a mock function with given fields: _a0. +// AddAddressToAccessList provides a mock function with given fields: _a0 func (_m *Accesslist) AddAddressToAccessList(_a0 common.Address) { _m.Called(_a0) } -// Accesslist_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList'. +// Accesslist_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList' type Accesslist_AddAddressToAccessList_Call struct { *mock.Call } @@ -55,12 +55,12 @@ func (_c *Accesslist_AddAddressToAccessList_Call) RunAndReturn(run func(common.A return _c } -// AddSlotToAccessList provides a mock function with given fields: _a0, _a1. +// AddSlotToAccessList provides a mock function with given fields: _a0, _a1 func (_m *Accesslist) AddSlotToAccessList(_a0 common.Address, _a1 common.Hash) { _m.Called(_a0, _a1) } -// Accesslist_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList'. +// Accesslist_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList' type Accesslist_AddSlotToAccessList_Call struct { *mock.Call } @@ -89,7 +89,7 @@ func (_c *Accesslist_AddSlotToAccessList_Call) RunAndReturn(run func(common.Addr return _c } -// AddressInAccessList provides a mock function with given fields: _a0. +// AddressInAccessList provides a mock function with given fields: _a0 func (_m *Accesslist) AddressInAccessList(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -103,7 +103,7 @@ func (_m *Accesslist) AddressInAccessList(_a0 common.Address) bool { return r0 } -// Accesslist_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList'. +// Accesslist_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList' type Accesslist_AddressInAccessList_Call struct { *mock.Call } @@ -131,7 +131,7 @@ func (_c *Accesslist_AddressInAccessList_Call) RunAndReturn(run func(common.Addr return _c } -// Clone provides a mock function with given fields:. +// Clone provides a mock function with given fields: func (_m *Accesslist) Clone() journal.Accesslist { ret := _m.Called() @@ -147,12 +147,12 @@ func (_m *Accesslist) Clone() journal.Accesslist { return r0 } -// Accesslist_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. +// Accesslist_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' type Accesslist_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call. +// Clone is a helper method to define mock.On call func (_e *Accesslist_Expecter) Clone() *Accesslist_Clone_Call { return &Accesslist_Clone_Call{Call: _e.mock.On("Clone")} } @@ -174,17 +174,17 @@ func (_c *Accesslist_Clone_Call) RunAndReturn(run func() journal.Accesslist) *Ac return _c } -// Finalize provides a mock function with given fields:. +// Finalize provides a mock function with given fields: func (_m *Accesslist) Finalize() { _m.Called() } -// Accesslist_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. +// Accesslist_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' type Accesslist_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call. +// Finalize is a helper method to define mock.On call func (_e *Accesslist_Expecter) Finalize() *Accesslist_Finalize_Call { return &Accesslist_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -206,7 +206,7 @@ func (_c *Accesslist_Finalize_Call) RunAndReturn(run func()) *Accesslist_Finaliz return _c } -// RegistryKey provides a mock function with given fields:. +// RegistryKey provides a mock function with given fields: func (_m *Accesslist) RegistryKey() string { ret := _m.Called() @@ -220,12 +220,12 @@ func (_m *Accesslist) RegistryKey() string { return r0 } -// Accesslist_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. +// Accesslist_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' type Accesslist_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call. +// RegistryKey is a helper method to define mock.On call func (_e *Accesslist_Expecter) RegistryKey() *Accesslist_RegistryKey_Call { return &Accesslist_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -247,12 +247,12 @@ func (_c *Accesslist_RegistryKey_Call) RunAndReturn(run func() string) *Accessli return _c } -// RevertToSnapshot provides a mock function with given fields: _a0. +// RevertToSnapshot provides a mock function with given fields: _a0 func (_m *Accesslist) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Accesslist_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +// Accesslist_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' type Accesslist_RevertToSnapshot_Call struct { *mock.Call } @@ -280,7 +280,7 @@ func (_c *Accesslist_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Accessl return _c } -// SlotInAccessList provides a mock function with given fields: _a0, _a1. +// SlotInAccessList provides a mock function with given fields: _a0, _a1 func (_m *Accesslist) SlotInAccessList(_a0 common.Address, _a1 common.Hash) (bool, bool) { ret := _m.Called(_a0, _a1) @@ -304,7 +304,7 @@ func (_m *Accesslist) SlotInAccessList(_a0 common.Address, _a1 common.Hash) (boo return r0, r1 } -// Accesslist_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList'. +// Accesslist_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList' type Accesslist_SlotInAccessList_Call struct { *mock.Call } @@ -333,7 +333,7 @@ func (_c *Accesslist_SlotInAccessList_Call) RunAndReturn(run func(common.Address return _c } -// Snapshot provides a mock function with given fields:. +// Snapshot provides a mock function with given fields: func (_m *Accesslist) Snapshot() int { ret := _m.Called() @@ -347,12 +347,12 @@ func (_m *Accesslist) Snapshot() int { return r0 } -// Accesslist_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +// Accesslist_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' type Accesslist_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call. +// Snapshot is a helper method to define mock.On call func (_e *Accesslist_Expecter) Snapshot() *Accesslist_Snapshot_Call { return &Accesslist_Snapshot_Call{Call: _e.mock.On("Snapshot")} } diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index a78ba40092..ae16a6e5e0 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -11,7 +11,7 @@ import ( types "github.com/ethereum/go-ethereum/core/types" ) -// Log is an autogenerated mock type for the Log type. +// Log is an autogenerated mock type for the Log type type Log struct { mock.Mock } @@ -24,12 +24,12 @@ func (_m *Log) EXPECT() *Log_Expecter { return &Log_Expecter{mock: &_m.Mock} } -// AddLog provides a mock function with given fields: _a0. +// AddLog provides a mock function with given fields: _a0 func (_m *Log) AddLog(_a0 *types.Log) { _m.Called(_a0) } -// Log_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog'. +// Log_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog' type Log_AddLog_Call struct { *mock.Call } @@ -57,7 +57,7 @@ func (_c *Log_AddLog_Call) RunAndReturn(run func(*types.Log)) *Log_AddLog_Call { return _c } -// Clone provides a mock function with given fields:. +// Clone provides a mock function with given fields: func (_m *Log) Clone() journal.Log { ret := _m.Called() @@ -73,12 +73,12 @@ func (_m *Log) Clone() journal.Log { return r0 } -// Log_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. +// Log_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' type Log_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call. +// Clone is a helper method to define mock.On call func (_e *Log_Expecter) Clone() *Log_Clone_Call { return &Log_Clone_Call{Call: _e.mock.On("Clone")} } @@ -100,17 +100,17 @@ func (_c *Log_Clone_Call) RunAndReturn(run func() journal.Log) *Log_Clone_Call { return _c } -// Finalize provides a mock function with given fields:. +// Finalize provides a mock function with given fields: func (_m *Log) Finalize() { _m.Called() } -// Log_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. +// Log_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' type Log_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call. +// Finalize is a helper method to define mock.On call func (_e *Log_Expecter) Finalize() *Log_Finalize_Call { return &Log_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -132,7 +132,7 @@ func (_c *Log_Finalize_Call) RunAndReturn(run func()) *Log_Finalize_Call { return _c } -// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash. +// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash func (_m *Log) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { ret := _m.Called(hash, blockNumber, blockHash) @@ -148,7 +148,7 @@ func (_m *Log) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Ha return r0 } -// Log_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs'. +// Log_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs' type Log_GetLogs_Call struct { *mock.Call } @@ -178,7 +178,7 @@ func (_c *Log_GetLogs_Call) RunAndReturn(run func(common.Hash, uint64, common.Ha return _c } -// Logs provides a mock function with given fields:. +// Logs provides a mock function with given fields: func (_m *Log) Logs() []*types.Log { ret := _m.Called() @@ -194,12 +194,12 @@ func (_m *Log) Logs() []*types.Log { return r0 } -// Log_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs'. +// Log_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs' type Log_Logs_Call struct { *mock.Call } -// Logs is a helper method to define mock.On call. +// Logs is a helper method to define mock.On call func (_e *Log_Expecter) Logs() *Log_Logs_Call { return &Log_Logs_Call{Call: _e.mock.On("Logs")} } @@ -221,7 +221,7 @@ func (_c *Log_Logs_Call) RunAndReturn(run func() []*types.Log) *Log_Logs_Call { return _c } -// RegistryKey provides a mock function with given fields:. +// RegistryKey provides a mock function with given fields: func (_m *Log) RegistryKey() string { ret := _m.Called() @@ -235,12 +235,12 @@ func (_m *Log) RegistryKey() string { return r0 } -// Log_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. +// Log_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' type Log_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call. +// RegistryKey is a helper method to define mock.On call func (_e *Log_Expecter) RegistryKey() *Log_RegistryKey_Call { return &Log_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -262,12 +262,12 @@ func (_c *Log_RegistryKey_Call) RunAndReturn(run func() string) *Log_RegistryKey return _c } -// RevertToSnapshot provides a mock function with given fields: _a0. +// RevertToSnapshot provides a mock function with given fields: _a0 func (_m *Log) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Log_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +// Log_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' type Log_RevertToSnapshot_Call struct { *mock.Call } @@ -295,12 +295,12 @@ func (_c *Log_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Log_RevertToSn return _c } -// SetTxContext provides a mock function with given fields: thash, ti. +// SetTxContext provides a mock function with given fields: thash, ti func (_m *Log) SetTxContext(thash common.Hash, ti int) { _m.Called(thash, ti) } -// Log_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext'. +// Log_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext' type Log_SetTxContext_Call struct { *mock.Call } @@ -329,7 +329,7 @@ func (_c *Log_SetTxContext_Call) RunAndReturn(run func(common.Hash, int)) *Log_S return _c } -// Snapshot provides a mock function with given fields:. +// Snapshot provides a mock function with given fields: func (_m *Log) Snapshot() int { ret := _m.Called() @@ -343,12 +343,12 @@ func (_m *Log) Snapshot() int { return r0 } -// Log_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +// Log_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' type Log_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call. +// Snapshot is a helper method to define mock.On call func (_e *Log_Expecter) Snapshot() *Log_Snapshot_Call { return &Log_Snapshot_Call{Call: _e.mock.On("Snapshot")} } @@ -370,7 +370,7 @@ func (_c *Log_Snapshot_Call) RunAndReturn(run func() int) *Log_Snapshot_Call { return _c } -// TxIndex provides a mock function with given fields:. +// TxIndex provides a mock function with given fields: func (_m *Log) TxIndex() int { ret := _m.Called() @@ -384,12 +384,12 @@ func (_m *Log) TxIndex() int { return r0 } -// Log_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex'. +// Log_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex' type Log_TxIndex_Call struct { *mock.Call } -// TxIndex is a helper method to define mock.On call. +// TxIndex is a helper method to define mock.On call func (_e *Log_Expecter) TxIndex() *Log_TxIndex_Call { return &Log_TxIndex_Call{Call: _e.mock.On("TxIndex")} } diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index e2d21b0268..a1799e851f 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -7,7 +7,7 @@ import ( journal "pkg.berachain.dev/polaris/eth/core/state/journal" ) -// Refund is an autogenerated mock type for the Refund type. +// Refund is an autogenerated mock type for the Refund type type Refund struct { mock.Mock } @@ -20,12 +20,12 @@ func (_m *Refund) EXPECT() *Refund_Expecter { return &Refund_Expecter{mock: &_m.Mock} } -// AddRefund provides a mock function with given fields: gas. +// AddRefund provides a mock function with given fields: gas func (_m *Refund) AddRefund(gas uint64) { _m.Called(gas) } -// Refund_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund'. +// Refund_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund' type Refund_AddRefund_Call struct { *mock.Call } @@ -53,7 +53,7 @@ func (_c *Refund_AddRefund_Call) RunAndReturn(run func(uint64)) *Refund_AddRefun return _c } -// Clone provides a mock function with given fields:. +// Clone provides a mock function with given fields: func (_m *Refund) Clone() journal.Refund { ret := _m.Called() @@ -69,12 +69,12 @@ func (_m *Refund) Clone() journal.Refund { return r0 } -// Refund_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. +// Refund_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' type Refund_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call. +// Clone is a helper method to define mock.On call func (_e *Refund_Expecter) Clone() *Refund_Clone_Call { return &Refund_Clone_Call{Call: _e.mock.On("Clone")} } @@ -96,17 +96,17 @@ func (_c *Refund_Clone_Call) RunAndReturn(run func() journal.Refund) *Refund_Clo return _c } -// Finalize provides a mock function with given fields:. +// Finalize provides a mock function with given fields: func (_m *Refund) Finalize() { _m.Called() } -// Refund_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. +// Refund_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' type Refund_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call. +// Finalize is a helper method to define mock.On call func (_e *Refund_Expecter) Finalize() *Refund_Finalize_Call { return &Refund_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -128,7 +128,7 @@ func (_c *Refund_Finalize_Call) RunAndReturn(run func()) *Refund_Finalize_Call { return _c } -// GetRefund provides a mock function with given fields:. +// GetRefund provides a mock function with given fields: func (_m *Refund) GetRefund() uint64 { ret := _m.Called() @@ -142,12 +142,12 @@ func (_m *Refund) GetRefund() uint64 { return r0 } -// Refund_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund'. +// Refund_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund' type Refund_GetRefund_Call struct { *mock.Call } -// GetRefund is a helper method to define mock.On call. +// GetRefund is a helper method to define mock.On call func (_e *Refund_Expecter) GetRefund() *Refund_GetRefund_Call { return &Refund_GetRefund_Call{Call: _e.mock.On("GetRefund")} } @@ -169,7 +169,7 @@ func (_c *Refund_GetRefund_Call) RunAndReturn(run func() uint64) *Refund_GetRefu return _c } -// RegistryKey provides a mock function with given fields:. +// RegistryKey provides a mock function with given fields: func (_m *Refund) RegistryKey() string { ret := _m.Called() @@ -183,12 +183,12 @@ func (_m *Refund) RegistryKey() string { return r0 } -// Refund_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. +// Refund_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' type Refund_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call. +// RegistryKey is a helper method to define mock.On call func (_e *Refund_Expecter) RegistryKey() *Refund_RegistryKey_Call { return &Refund_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -210,12 +210,12 @@ func (_c *Refund_RegistryKey_Call) RunAndReturn(run func() string) *Refund_Regis return _c } -// RevertToSnapshot provides a mock function with given fields: _a0. +// RevertToSnapshot provides a mock function with given fields: _a0 func (_m *Refund) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Refund_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +// Refund_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' type Refund_RevertToSnapshot_Call struct { *mock.Call } @@ -243,7 +243,7 @@ func (_c *Refund_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Refund_Reve return _c } -// Snapshot provides a mock function with given fields:. +// Snapshot provides a mock function with given fields: func (_m *Refund) Snapshot() int { ret := _m.Called() @@ -257,12 +257,12 @@ func (_m *Refund) Snapshot() int { return r0 } -// Refund_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +// Refund_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' type Refund_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call. +// Snapshot is a helper method to define mock.On call func (_e *Refund_Expecter) Snapshot() *Refund_Snapshot_Call { return &Refund_Snapshot_Call{Call: _e.mock.On("Snapshot")} } @@ -284,12 +284,12 @@ func (_c *Refund_Snapshot_Call) RunAndReturn(run func() int) *Refund_Snapshot_Ca return _c } -// SubRefund provides a mock function with given fields: gas. +// SubRefund provides a mock function with given fields: gas func (_m *Refund) SubRefund(gas uint64) { _m.Called(gas) } -// Refund_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund'. +// Refund_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund' type Refund_SubRefund_Call struct { *mock.Call } diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index f69480ddc4..5633c28620 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -10,7 +10,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// SelfDestructStatePlugin is an autogenerated mock type for the selfDestructStatePlugin type. +// SelfDestructStatePlugin is an autogenerated mock type for the selfDestructStatePlugin type type SelfDestructStatePlugin struct { mock.Mock } @@ -23,7 +23,7 @@ func (_m *SelfDestructStatePlugin) EXPECT() *SelfDestructStatePlugin_Expecter { return &SelfDestructStatePlugin_Expecter{mock: &_m.Mock} } -// GetBalance provides a mock function with given fields: _a0. +// GetBalance provides a mock function with given fields: _a0 func (_m *SelfDestructStatePlugin) GetBalance(_a0 common.Address) *big.Int { ret := _m.Called(_a0) @@ -39,7 +39,7 @@ func (_m *SelfDestructStatePlugin) GetBalance(_a0 common.Address) *big.Int { return r0 } -// SelfDestructStatePlugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance'. +// SelfDestructStatePlugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' type SelfDestructStatePlugin_GetBalance_Call struct { *mock.Call } @@ -67,7 +67,7 @@ func (_c *SelfDestructStatePlugin_GetBalance_Call) RunAndReturn(run func(common. return _c } -// GetCodeHash provides a mock function with given fields: _a0. +// GetCodeHash provides a mock function with given fields: _a0 func (_m *SelfDestructStatePlugin) GetCodeHash(_a0 common.Address) common.Hash { ret := _m.Called(_a0) @@ -83,7 +83,7 @@ func (_m *SelfDestructStatePlugin) GetCodeHash(_a0 common.Address) common.Hash { return r0 } -// SelfDestructStatePlugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash'. +// SelfDestructStatePlugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' type SelfDestructStatePlugin_GetCodeHash_Call struct { *mock.Call } @@ -111,12 +111,12 @@ func (_c *SelfDestructStatePlugin_GetCodeHash_Call) RunAndReturn(run func(common return _c } -// SubBalance provides a mock function with given fields: _a0, _a1. +// SubBalance provides a mock function with given fields: _a0, _a1 func (_m *SelfDestructStatePlugin) SubBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// SelfDestructStatePlugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance'. +// SelfDestructStatePlugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' type SelfDestructStatePlugin_SubBalance_Call struct { *mock.Call } diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index fdcc14a551..4f657c938f 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// SelfDestructs is an autogenerated mock type for the SelfDestructs type. +// SelfDestructs is an autogenerated mock type for the SelfDestructs type type SelfDestructs struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *SelfDestructs) EXPECT() *SelfDestructs_Expecter { return &SelfDestructs_Expecter{mock: &_m.Mock} } -// Clone provides a mock function with given fields:. +// Clone provides a mock function with given fields: func (_m *SelfDestructs) Clone() journal.SelfDestructs { ret := _m.Called() @@ -38,12 +38,12 @@ func (_m *SelfDestructs) Clone() journal.SelfDestructs { return r0 } -// SelfDestructs_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. +// SelfDestructs_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' type SelfDestructs_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call. +// Clone is a helper method to define mock.On call func (_e *SelfDestructs_Expecter) Clone() *SelfDestructs_Clone_Call { return &SelfDestructs_Clone_Call{Call: _e.mock.On("Clone")} } @@ -65,17 +65,17 @@ func (_c *SelfDestructs_Clone_Call) RunAndReturn(run func() journal.SelfDestruct return _c } -// Finalize provides a mock function with given fields:. +// Finalize provides a mock function with given fields: func (_m *SelfDestructs) Finalize() { _m.Called() } -// SelfDestructs_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. +// SelfDestructs_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' type SelfDestructs_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call. +// Finalize is a helper method to define mock.On call func (_e *SelfDestructs_Expecter) Finalize() *SelfDestructs_Finalize_Call { return &SelfDestructs_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -97,7 +97,7 @@ func (_c *SelfDestructs_Finalize_Call) RunAndReturn(run func()) *SelfDestructs_F return _c } -// GetSelfDestructs provides a mock function with given fields:. +// GetSelfDestructs provides a mock function with given fields: func (_m *SelfDestructs) GetSelfDestructs() []common.Address { ret := _m.Called() @@ -113,12 +113,12 @@ func (_m *SelfDestructs) GetSelfDestructs() []common.Address { return r0 } -// SelfDestructs_GetSelfDestructs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSelfDestructs'. +// SelfDestructs_GetSelfDestructs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSelfDestructs' type SelfDestructs_GetSelfDestructs_Call struct { *mock.Call } -// GetSelfDestructs is a helper method to define mock.On call. +// GetSelfDestructs is a helper method to define mock.On call func (_e *SelfDestructs_Expecter) GetSelfDestructs() *SelfDestructs_GetSelfDestructs_Call { return &SelfDestructs_GetSelfDestructs_Call{Call: _e.mock.On("GetSelfDestructs")} } @@ -140,7 +140,7 @@ func (_c *SelfDestructs_GetSelfDestructs_Call) RunAndReturn(run func() []common. return _c } -// HasSelfDestructed provides a mock function with given fields: _a0. +// HasSelfDestructed provides a mock function with given fields: _a0 func (_m *SelfDestructs) HasSelfDestructed(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -154,7 +154,7 @@ func (_m *SelfDestructs) HasSelfDestructed(_a0 common.Address) bool { return r0 } -// SelfDestructs_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed'. +// SelfDestructs_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed' type SelfDestructs_HasSelfDestructed_Call struct { *mock.Call } @@ -182,7 +182,7 @@ func (_c *SelfDestructs_HasSelfDestructed_Call) RunAndReturn(run func(common.Add return _c } -// RegistryKey provides a mock function with given fields:. +// RegistryKey provides a mock function with given fields: func (_m *SelfDestructs) RegistryKey() string { ret := _m.Called() @@ -196,12 +196,12 @@ func (_m *SelfDestructs) RegistryKey() string { return r0 } -// SelfDestructs_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. +// SelfDestructs_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' type SelfDestructs_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call. +// RegistryKey is a helper method to define mock.On call func (_e *SelfDestructs_Expecter) RegistryKey() *SelfDestructs_RegistryKey_Call { return &SelfDestructs_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -223,12 +223,12 @@ func (_c *SelfDestructs_RegistryKey_Call) RunAndReturn(run func() string) *SelfD return _c } -// RevertToSnapshot provides a mock function with given fields: _a0. +// RevertToSnapshot provides a mock function with given fields: _a0 func (_m *SelfDestructs) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// SelfDestructs_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +// SelfDestructs_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' type SelfDestructs_RevertToSnapshot_Call struct { *mock.Call } @@ -256,12 +256,12 @@ func (_c *SelfDestructs_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Self return _c } -// SelfDestruct provides a mock function with given fields: _a0. +// SelfDestruct provides a mock function with given fields: _a0 func (_m *SelfDestructs) SelfDestruct(_a0 common.Address) { _m.Called(_a0) } -// SelfDestructs_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct'. +// SelfDestructs_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct' type SelfDestructs_SelfDestruct_Call struct { *mock.Call } @@ -289,12 +289,12 @@ func (_c *SelfDestructs_SelfDestruct_Call) RunAndReturn(run func(common.Address) return _c } -// Selfdestruct6780 provides a mock function with given fields: _a0. +// Selfdestruct6780 provides a mock function with given fields: _a0 func (_m *SelfDestructs) Selfdestruct6780(_a0 common.Address) { _m.Called(_a0) } -// SelfDestructs_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780'. +// SelfDestructs_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780' type SelfDestructs_Selfdestruct6780_Call struct { *mock.Call } @@ -322,7 +322,7 @@ func (_c *SelfDestructs_Selfdestruct6780_Call) RunAndReturn(run func(common.Addr return _c } -// Snapshot provides a mock function with given fields:. +// Snapshot provides a mock function with given fields: func (_m *SelfDestructs) Snapshot() int { ret := _m.Called() @@ -336,12 +336,12 @@ func (_m *SelfDestructs) Snapshot() int { return r0 } -// SelfDestructs_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +// SelfDestructs_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' type SelfDestructs_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call. +// Snapshot is a helper method to define mock.On call func (_e *SelfDestructs_Expecter) Snapshot() *SelfDestructs_Snapshot_Call { return &SelfDestructs_Snapshot_Call{Call: _e.mock.On("Snapshot")} } diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index bb011530a5..40f35c8cbb 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" ) -// TransientStorage is an autogenerated mock type for the TransientStorage type. +// TransientStorage is an autogenerated mock type for the TransientStorage type type TransientStorage struct { mock.Mock } @@ -22,7 +22,7 @@ func (_m *TransientStorage) EXPECT() *TransientStorage_Expecter { return &TransientStorage_Expecter{mock: &_m.Mock} } -// Clone provides a mock function with given fields:. +// Clone provides a mock function with given fields: func (_m *TransientStorage) Clone() journal.TransientStorage { ret := _m.Called() @@ -38,12 +38,12 @@ func (_m *TransientStorage) Clone() journal.TransientStorage { return r0 } -// TransientStorage_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. +// TransientStorage_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' type TransientStorage_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call. +// Clone is a helper method to define mock.On call func (_e *TransientStorage_Expecter) Clone() *TransientStorage_Clone_Call { return &TransientStorage_Clone_Call{Call: _e.mock.On("Clone")} } @@ -65,17 +65,17 @@ func (_c *TransientStorage_Clone_Call) RunAndReturn(run func() journal.Transient return _c } -// Finalize provides a mock function with given fields:. +// Finalize provides a mock function with given fields: func (_m *TransientStorage) Finalize() { _m.Called() } -// TransientStorage_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. +// TransientStorage_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' type TransientStorage_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call. +// Finalize is a helper method to define mock.On call func (_e *TransientStorage_Expecter) Finalize() *TransientStorage_Finalize_Call { return &TransientStorage_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -97,7 +97,7 @@ func (_c *TransientStorage_Finalize_Call) RunAndReturn(run func()) *TransientSto return _c } -// GetTransientState provides a mock function with given fields: addr, key. +// GetTransientState provides a mock function with given fields: addr, key func (_m *TransientStorage) GetTransientState(addr common.Address, key common.Hash) common.Hash { ret := _m.Called(addr, key) @@ -113,7 +113,7 @@ func (_m *TransientStorage) GetTransientState(addr common.Address, key common.Ha return r0 } -// TransientStorage_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState'. +// TransientStorage_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState' type TransientStorage_GetTransientState_Call struct { *mock.Call } @@ -142,7 +142,7 @@ func (_c *TransientStorage_GetTransientState_Call) RunAndReturn(run func(common. return _c } -// RegistryKey provides a mock function with given fields:. +// RegistryKey provides a mock function with given fields: func (_m *TransientStorage) RegistryKey() string { ret := _m.Called() @@ -156,12 +156,12 @@ func (_m *TransientStorage) RegistryKey() string { return r0 } -// TransientStorage_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. +// TransientStorage_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' type TransientStorage_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call. +// RegistryKey is a helper method to define mock.On call func (_e *TransientStorage_Expecter) RegistryKey() *TransientStorage_RegistryKey_Call { return &TransientStorage_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -183,12 +183,12 @@ func (_c *TransientStorage_RegistryKey_Call) RunAndReturn(run func() string) *Tr return _c } -// RevertToSnapshot provides a mock function with given fields: _a0. +// RevertToSnapshot provides a mock function with given fields: _a0 func (_m *TransientStorage) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// TransientStorage_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +// TransientStorage_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' type TransientStorage_RevertToSnapshot_Call struct { *mock.Call } @@ -216,12 +216,12 @@ func (_c *TransientStorage_RevertToSnapshot_Call) RunAndReturn(run func(int)) *T return _c } -// SetTransientState provides a mock function with given fields: addr, key, value. +// SetTransientState provides a mock function with given fields: addr, key, value func (_m *TransientStorage) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { _m.Called(addr, key, value) } -// TransientStorage_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState'. +// TransientStorage_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState' type TransientStorage_SetTransientState_Call struct { *mock.Call } @@ -251,7 +251,7 @@ func (_c *TransientStorage_SetTransientState_Call) RunAndReturn(run func(common. return _c } -// Snapshot provides a mock function with given fields:. +// Snapshot provides a mock function with given fields: func (_m *TransientStorage) Snapshot() int { ret := _m.Called() @@ -265,12 +265,12 @@ func (_m *TransientStorage) Snapshot() int { return r0 } -// TransientStorage_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +// TransientStorage_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' type TransientStorage_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call. +// Snapshot is a helper method to define mock.On call func (_e *TransientStorage_Expecter) Snapshot() *TransientStorage_Snapshot_Call { return &TransientStorage_Snapshot_Call{Call: _e.mock.On("Snapshot")} } diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index 7e111ba69f..0b295c7f7b 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -13,7 +13,7 @@ import ( state "pkg.berachain.dev/polaris/eth/core/state" ) -// Plugin is an autogenerated mock type for the Plugin type. +// Plugin is an autogenerated mock type for the Plugin type type Plugin struct { mock.Mock } @@ -26,12 +26,12 @@ func (_m *Plugin) EXPECT() *Plugin_Expecter { return &Plugin_Expecter{mock: &_m.Mock} } -// AddBalance provides a mock function with given fields: _a0, _a1. +// AddBalance provides a mock function with given fields: _a0, _a1 func (_m *Plugin) AddBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// Plugin_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance'. +// Plugin_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance' type Plugin_AddBalance_Call struct { *mock.Call } @@ -60,7 +60,7 @@ func (_c *Plugin_AddBalance_Call) RunAndReturn(run func(common.Address, *big.Int return _c } -// Clone provides a mock function with given fields:. +// Clone provides a mock function with given fields: func (_m *Plugin) Clone() state.Plugin { ret := _m.Called() @@ -76,12 +76,12 @@ func (_m *Plugin) Clone() state.Plugin { return r0 } -// Plugin_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone'. +// Plugin_Clone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Clone' type Plugin_Clone_Call struct { *mock.Call } -// Clone is a helper method to define mock.On call. +// Clone is a helper method to define mock.On call func (_e *Plugin_Expecter) Clone() *Plugin_Clone_Call { return &Plugin_Clone_Call{Call: _e.mock.On("Clone")} } @@ -103,12 +103,12 @@ func (_c *Plugin_Clone_Call) RunAndReturn(run func() state.Plugin) *Plugin_Clone return _c } -// CreateAccount provides a mock function with given fields: _a0. +// CreateAccount provides a mock function with given fields: _a0 func (_m *Plugin) CreateAccount(_a0 common.Address) { _m.Called(_a0) } -// Plugin_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount'. +// Plugin_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount' type Plugin_CreateAccount_Call struct { *mock.Call } @@ -136,12 +136,12 @@ func (_c *Plugin_CreateAccount_Call) RunAndReturn(run func(common.Address)) *Plu return _c } -// DeleteAccounts provides a mock function with given fields: _a0. +// DeleteAccounts provides a mock function with given fields: _a0 func (_m *Plugin) DeleteAccounts(_a0 []common.Address) { _m.Called(_a0) } -// Plugin_DeleteAccounts_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccounts'. +// Plugin_DeleteAccounts_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAccounts' type Plugin_DeleteAccounts_Call struct { *mock.Call } @@ -169,7 +169,7 @@ func (_c *Plugin_DeleteAccounts_Call) RunAndReturn(run func([]common.Address)) * return _c } -// Empty provides a mock function with given fields: _a0. +// Empty provides a mock function with given fields: _a0 func (_m *Plugin) Empty(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -183,7 +183,7 @@ func (_m *Plugin) Empty(_a0 common.Address) bool { return r0 } -// Plugin_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty'. +// Plugin_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty' type Plugin_Empty_Call struct { *mock.Call } @@ -211,7 +211,7 @@ func (_c *Plugin_Empty_Call) RunAndReturn(run func(common.Address) bool) *Plugin return _c } -// Error provides a mock function with given fields:. +// Error provides a mock function with given fields: func (_m *Plugin) Error() error { ret := _m.Called() @@ -225,12 +225,12 @@ func (_m *Plugin) Error() error { return r0 } -// Plugin_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error'. +// Plugin_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' type Plugin_Error_Call struct { *mock.Call } -// Error is a helper method to define mock.On call. +// Error is a helper method to define mock.On call func (_e *Plugin_Expecter) Error() *Plugin_Error_Call { return &Plugin_Error_Call{Call: _e.mock.On("Error")} } @@ -252,7 +252,7 @@ func (_c *Plugin_Error_Call) RunAndReturn(run func() error) *Plugin_Error_Call { return _c } -// Exist provides a mock function with given fields: _a0. +// Exist provides a mock function with given fields: _a0 func (_m *Plugin) Exist(_a0 common.Address) bool { ret := _m.Called(_a0) @@ -266,7 +266,7 @@ func (_m *Plugin) Exist(_a0 common.Address) bool { return r0 } -// Plugin_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist'. +// Plugin_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist' type Plugin_Exist_Call struct { *mock.Call } @@ -294,17 +294,17 @@ func (_c *Plugin_Exist_Call) RunAndReturn(run func(common.Address) bool) *Plugin return _c } -// Finalize provides a mock function with given fields:. +// Finalize provides a mock function with given fields: func (_m *Plugin) Finalize() { _m.Called() } -// Plugin_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize'. +// Plugin_Finalize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalize' type Plugin_Finalize_Call struct { *mock.Call } -// Finalize is a helper method to define mock.On call. +// Finalize is a helper method to define mock.On call func (_e *Plugin_Expecter) Finalize() *Plugin_Finalize_Call { return &Plugin_Finalize_Call{Call: _e.mock.On("Finalize")} } @@ -326,7 +326,7 @@ func (_c *Plugin_Finalize_Call) RunAndReturn(run func()) *Plugin_Finalize_Call { return _c } -// ForEachStorage provides a mock function with given fields: _a0, _a1. +// ForEachStorage provides a mock function with given fields: _a0, _a1 func (_m *Plugin) ForEachStorage(_a0 common.Address, _a1 func(common.Hash, common.Hash) bool) error { ret := _m.Called(_a0, _a1) @@ -340,7 +340,7 @@ func (_m *Plugin) ForEachStorage(_a0 common.Address, _a1 func(common.Hash, commo return r0 } -// Plugin_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage'. +// Plugin_ForEachStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ForEachStorage' type Plugin_ForEachStorage_Call struct { *mock.Call } @@ -369,7 +369,7 @@ func (_c *Plugin_ForEachStorage_Call) RunAndReturn(run func(common.Address, func return _c } -// GetBalance provides a mock function with given fields: _a0. +// GetBalance provides a mock function with given fields: _a0 func (_m *Plugin) GetBalance(_a0 common.Address) *big.Int { ret := _m.Called(_a0) @@ -385,7 +385,7 @@ func (_m *Plugin) GetBalance(_a0 common.Address) *big.Int { return r0 } -// Plugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance'. +// Plugin_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' type Plugin_GetBalance_Call struct { *mock.Call } @@ -413,7 +413,7 @@ func (_c *Plugin_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int return _c } -// GetCode provides a mock function with given fields: _a0. +// GetCode provides a mock function with given fields: _a0 func (_m *Plugin) GetCode(_a0 common.Address) []byte { ret := _m.Called(_a0) @@ -429,7 +429,7 @@ func (_m *Plugin) GetCode(_a0 common.Address) []byte { return r0 } -// Plugin_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode'. +// Plugin_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode' type Plugin_GetCode_Call struct { *mock.Call } @@ -457,7 +457,7 @@ func (_c *Plugin_GetCode_Call) RunAndReturn(run func(common.Address) []byte) *Pl return _c } -// GetCodeHash provides a mock function with given fields: _a0. +// GetCodeHash provides a mock function with given fields: _a0 func (_m *Plugin) GetCodeHash(_a0 common.Address) common.Hash { ret := _m.Called(_a0) @@ -473,7 +473,7 @@ func (_m *Plugin) GetCodeHash(_a0 common.Address) common.Hash { return r0 } -// Plugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash'. +// Plugin_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' type Plugin_GetCodeHash_Call struct { *mock.Call } @@ -501,7 +501,7 @@ func (_c *Plugin_GetCodeHash_Call) RunAndReturn(run func(common.Address) common. return _c } -// GetCommittedState provides a mock function with given fields: _a0, _a1. +// GetCommittedState provides a mock function with given fields: _a0, _a1 func (_m *Plugin) GetCommittedState(_a0 common.Address, _a1 common.Hash) common.Hash { ret := _m.Called(_a0, _a1) @@ -517,7 +517,7 @@ func (_m *Plugin) GetCommittedState(_a0 common.Address, _a1 common.Hash) common. return r0 } -// Plugin_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState'. +// Plugin_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState' type Plugin_GetCommittedState_Call struct { *mock.Call } @@ -546,7 +546,7 @@ func (_c *Plugin_GetCommittedState_Call) RunAndReturn(run func(common.Address, c return _c } -// GetContext provides a mock function with given fields:. +// GetContext provides a mock function with given fields: func (_m *Plugin) GetContext() context.Context { ret := _m.Called() @@ -562,12 +562,12 @@ func (_m *Plugin) GetContext() context.Context { return r0 } -// Plugin_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext'. +// Plugin_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext' type Plugin_GetContext_Call struct { *mock.Call } -// GetContext is a helper method to define mock.On call. +// GetContext is a helper method to define mock.On call func (_e *Plugin_Expecter) GetContext() *Plugin_GetContext_Call { return &Plugin_GetContext_Call{Call: _e.mock.On("GetContext")} } @@ -589,7 +589,7 @@ func (_c *Plugin_GetContext_Call) RunAndReturn(run func() context.Context) *Plug return _c } -// GetNonce provides a mock function with given fields: _a0. +// GetNonce provides a mock function with given fields: _a0 func (_m *Plugin) GetNonce(_a0 common.Address) uint64 { ret := _m.Called(_a0) @@ -603,7 +603,7 @@ func (_m *Plugin) GetNonce(_a0 common.Address) uint64 { return r0 } -// Plugin_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce'. +// Plugin_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce' type Plugin_GetNonce_Call struct { *mock.Call } @@ -631,7 +631,7 @@ func (_c *Plugin_GetNonce_Call) RunAndReturn(run func(common.Address) uint64) *P return _c } -// GetState provides a mock function with given fields: _a0, _a1. +// GetState provides a mock function with given fields: _a0, _a1 func (_m *Plugin) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { ret := _m.Called(_a0, _a1) @@ -647,7 +647,7 @@ func (_m *Plugin) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { return r0 } -// Plugin_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState'. +// Plugin_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState' type Plugin_GetState_Call struct { *mock.Call } @@ -676,12 +676,12 @@ func (_c *Plugin_GetState_Call) RunAndReturn(run func(common.Address, common.Has return _c } -// Prepare provides a mock function with given fields: _a0. +// Prepare provides a mock function with given fields: _a0 func (_m *Plugin) Prepare(_a0 context.Context) { _m.Called(_a0) } -// Plugin_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare'. +// Plugin_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare' type Plugin_Prepare_Call struct { *mock.Call } @@ -709,7 +709,7 @@ func (_c *Plugin_Prepare_Call) RunAndReturn(run func(context.Context)) *Plugin_P return _c } -// RegistryKey provides a mock function with given fields:. +// RegistryKey provides a mock function with given fields: func (_m *Plugin) RegistryKey() string { ret := _m.Called() @@ -723,12 +723,12 @@ func (_m *Plugin) RegistryKey() string { return r0 } -// Plugin_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey'. +// Plugin_RegistryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegistryKey' type Plugin_RegistryKey_Call struct { *mock.Call } -// RegistryKey is a helper method to define mock.On call. +// RegistryKey is a helper method to define mock.On call func (_e *Plugin_Expecter) RegistryKey() *Plugin_RegistryKey_Call { return &Plugin_RegistryKey_Call{Call: _e.mock.On("RegistryKey")} } @@ -750,12 +750,12 @@ func (_c *Plugin_RegistryKey_Call) RunAndReturn(run func() string) *Plugin_Regis return _c } -// Reset provides a mock function with given fields: _a0. +// Reset provides a mock function with given fields: _a0 func (_m *Plugin) Reset(_a0 context.Context) { _m.Called(_a0) } -// Plugin_Reset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reset'. +// Plugin_Reset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reset' type Plugin_Reset_Call struct { *mock.Call } @@ -783,12 +783,12 @@ func (_c *Plugin_Reset_Call) RunAndReturn(run func(context.Context)) *Plugin_Res return _c } -// RevertToSnapshot provides a mock function with given fields: _a0. +// RevertToSnapshot provides a mock function with given fields: _a0 func (_m *Plugin) RevertToSnapshot(_a0 int) { _m.Called(_a0) } -// Plugin_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. +// Plugin_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' type Plugin_RevertToSnapshot_Call struct { *mock.Call } @@ -816,12 +816,12 @@ func (_c *Plugin_RevertToSnapshot_Call) RunAndReturn(run func(int)) *Plugin_Reve return _c } -// SetBalance provides a mock function with given fields: _a0, _a1. +// SetBalance provides a mock function with given fields: _a0, _a1 func (_m *Plugin) SetBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// Plugin_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance'. +// Plugin_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance' type Plugin_SetBalance_Call struct { *mock.Call } @@ -850,12 +850,12 @@ func (_c *Plugin_SetBalance_Call) RunAndReturn(run func(common.Address, *big.Int return _c } -// SetCode provides a mock function with given fields: _a0, _a1. +// SetCode provides a mock function with given fields: _a0, _a1 func (_m *Plugin) SetCode(_a0 common.Address, _a1 []byte) { _m.Called(_a0, _a1) } -// Plugin_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode'. +// Plugin_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode' type Plugin_SetCode_Call struct { *mock.Call } @@ -884,12 +884,12 @@ func (_c *Plugin_SetCode_Call) RunAndReturn(run func(common.Address, []byte)) *P return _c } -// SetNonce provides a mock function with given fields: _a0, _a1. +// SetNonce provides a mock function with given fields: _a0, _a1 func (_m *Plugin) SetNonce(_a0 common.Address, _a1 uint64) { _m.Called(_a0, _a1) } -// Plugin_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce'. +// Plugin_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce' type Plugin_SetNonce_Call struct { *mock.Call } @@ -918,12 +918,12 @@ func (_c *Plugin_SetNonce_Call) RunAndReturn(run func(common.Address, uint64)) * return _c } -// SetState provides a mock function with given fields: _a0, _a1, _a2. +// SetState provides a mock function with given fields: _a0, _a1, _a2 func (_m *Plugin) SetState(_a0 common.Address, _a1 common.Hash, _a2 common.Hash) { _m.Called(_a0, _a1, _a2) } -// Plugin_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState'. +// Plugin_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState' type Plugin_SetState_Call struct { *mock.Call } @@ -953,12 +953,12 @@ func (_c *Plugin_SetState_Call) RunAndReturn(run func(common.Address, common.Has return _c } -// SetStorage provides a mock function with given fields: addr, storage. +// SetStorage provides a mock function with given fields: addr, storage func (_m *Plugin) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { _m.Called(addr, storage) } -// Plugin_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage'. +// Plugin_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage' type Plugin_SetStorage_Call struct { *mock.Call } @@ -987,7 +987,7 @@ func (_c *Plugin_SetStorage_Call) RunAndReturn(run func(common.Address, map[comm return _c } -// Snapshot provides a mock function with given fields:. +// Snapshot provides a mock function with given fields: func (_m *Plugin) Snapshot() int { ret := _m.Called() @@ -1001,12 +1001,12 @@ func (_m *Plugin) Snapshot() int { return r0 } -// Plugin_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. +// Plugin_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' type Plugin_Snapshot_Call struct { *mock.Call } -// Snapshot is a helper method to define mock.On call. +// Snapshot is a helper method to define mock.On call func (_e *Plugin_Expecter) Snapshot() *Plugin_Snapshot_Call { return &Plugin_Snapshot_Call{Call: _e.mock.On("Snapshot")} } @@ -1028,12 +1028,12 @@ func (_c *Plugin_Snapshot_Call) RunAndReturn(run func() int) *Plugin_Snapshot_Ca return _c } -// SubBalance provides a mock function with given fields: _a0, _a1. +// SubBalance provides a mock function with given fields: _a0, _a1 func (_m *Plugin) SubBalance(_a0 common.Address, _a1 *big.Int) { _m.Called(_a0, _a1) } -// Plugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance'. +// Plugin_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' type Plugin_SubBalance_Call struct { *mock.Call } diff --git a/eth/core/state/mocks/polar_state_db.go b/eth/core/state/mocks/polar_state_db.go new file mode 100644 index 0000000000..5fdcf96287 --- /dev/null +++ b/eth/core/state/mocks/polar_state_db.go @@ -0,0 +1,2221 @@ +// Code generated by mockery v2.35.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + corestate "github.com/ethereum/go-ethereum/core/state" + + mock "github.com/stretchr/testify/mock" + + params "github.com/ethereum/go-ethereum/params" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// PolarStateDB is an autogenerated mock type for the PolarStateDB type +type PolarStateDB struct { + mock.Mock +} + +type PolarStateDB_Expecter struct { + mock *mock.Mock +} + +func (_m *PolarStateDB) EXPECT() *PolarStateDB_Expecter { + return &PolarStateDB_Expecter{mock: &_m.Mock} +} + +// AddAddressToAccessList provides a mock function with given fields: addr +func (_m *PolarStateDB) AddAddressToAccessList(addr common.Address) { + _m.Called(addr) +} + +// PolarStateDB_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList' +type PolarStateDB_AddAddressToAccessList_Call struct { + *mock.Call +} + +// AddAddressToAccessList is a helper method to define mock.On call +// - addr common.Address +func (_e *PolarStateDB_Expecter) AddAddressToAccessList(addr interface{}) *PolarStateDB_AddAddressToAccessList_Call { + return &PolarStateDB_AddAddressToAccessList_Call{Call: _e.mock.On("AddAddressToAccessList", addr)} +} + +func (_c *PolarStateDB_AddAddressToAccessList_Call) Run(run func(addr common.Address)) *PolarStateDB_AddAddressToAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_AddAddressToAccessList_Call) Return() *PolarStateDB_AddAddressToAccessList_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_AddAddressToAccessList_Call) RunAndReturn(run func(common.Address)) *PolarStateDB_AddAddressToAccessList_Call { + _c.Call.Return(run) + return _c +} + +// AddBalance provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) AddBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// PolarStateDB_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance' +type PolarStateDB_AddBalance_Call struct { + *mock.Call +} + +// AddBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *PolarStateDB_Expecter) AddBalance(_a0 interface{}, _a1 interface{}) *PolarStateDB_AddBalance_Call { + return &PolarStateDB_AddBalance_Call{Call: _e.mock.On("AddBalance", _a0, _a1)} +} + +func (_c *PolarStateDB_AddBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *PolarStateDB_AddBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *PolarStateDB_AddBalance_Call) Return() *PolarStateDB_AddBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_AddBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *PolarStateDB_AddBalance_Call { + _c.Call.Return(run) + return _c +} + +// AddLog provides a mock function with given fields: _a0 +func (_m *PolarStateDB) AddLog(_a0 *types.Log) { + _m.Called(_a0) +} + +// PolarStateDB_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog' +type PolarStateDB_AddLog_Call struct { + *mock.Call +} + +// AddLog is a helper method to define mock.On call +// - _a0 *types.Log +func (_e *PolarStateDB_Expecter) AddLog(_a0 interface{}) *PolarStateDB_AddLog_Call { + return &PolarStateDB_AddLog_Call{Call: _e.mock.On("AddLog", _a0)} +} + +func (_c *PolarStateDB_AddLog_Call) Run(run func(_a0 *types.Log)) *PolarStateDB_AddLog_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*types.Log)) + }) + return _c +} + +func (_c *PolarStateDB_AddLog_Call) Return() *PolarStateDB_AddLog_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_AddLog_Call) RunAndReturn(run func(*types.Log)) *PolarStateDB_AddLog_Call { + _c.Call.Return(run) + return _c +} + +// AddPreimage provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) AddPreimage(_a0 common.Hash, _a1 []byte) { + _m.Called(_a0, _a1) +} + +// PolarStateDB_AddPreimage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPreimage' +type PolarStateDB_AddPreimage_Call struct { + *mock.Call +} + +// AddPreimage is a helper method to define mock.On call +// - _a0 common.Hash +// - _a1 []byte +func (_e *PolarStateDB_Expecter) AddPreimage(_a0 interface{}, _a1 interface{}) *PolarStateDB_AddPreimage_Call { + return &PolarStateDB_AddPreimage_Call{Call: _e.mock.On("AddPreimage", _a0, _a1)} +} + +func (_c *PolarStateDB_AddPreimage_Call) Run(run func(_a0 common.Hash, _a1 []byte)) *PolarStateDB_AddPreimage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].([]byte)) + }) + return _c +} + +func (_c *PolarStateDB_AddPreimage_Call) Return() *PolarStateDB_AddPreimage_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_AddPreimage_Call) RunAndReturn(run func(common.Hash, []byte)) *PolarStateDB_AddPreimage_Call { + _c.Call.Return(run) + return _c +} + +// AddRefund provides a mock function with given fields: _a0 +func (_m *PolarStateDB) AddRefund(_a0 uint64) { + _m.Called(_a0) +} + +// PolarStateDB_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund' +type PolarStateDB_AddRefund_Call struct { + *mock.Call +} + +// AddRefund is a helper method to define mock.On call +// - _a0 uint64 +func (_e *PolarStateDB_Expecter) AddRefund(_a0 interface{}) *PolarStateDB_AddRefund_Call { + return &PolarStateDB_AddRefund_Call{Call: _e.mock.On("AddRefund", _a0)} +} + +func (_c *PolarStateDB_AddRefund_Call) Run(run func(_a0 uint64)) *PolarStateDB_AddRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *PolarStateDB_AddRefund_Call) Return() *PolarStateDB_AddRefund_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_AddRefund_Call) RunAndReturn(run func(uint64)) *PolarStateDB_AddRefund_Call { + _c.Call.Return(run) + return _c +} + +// AddSlotToAccessList provides a mock function with given fields: addr, slot +func (_m *PolarStateDB) AddSlotToAccessList(addr common.Address, slot common.Hash) { + _m.Called(addr, slot) +} + +// PolarStateDB_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList' +type PolarStateDB_AddSlotToAccessList_Call struct { + *mock.Call +} + +// AddSlotToAccessList is a helper method to define mock.On call +// - addr common.Address +// - slot common.Hash +func (_e *PolarStateDB_Expecter) AddSlotToAccessList(addr interface{}, slot interface{}) *PolarStateDB_AddSlotToAccessList_Call { + return &PolarStateDB_AddSlotToAccessList_Call{Call: _e.mock.On("AddSlotToAccessList", addr, slot)} +} + +func (_c *PolarStateDB_AddSlotToAccessList_Call) Run(run func(addr common.Address, slot common.Hash)) *PolarStateDB_AddSlotToAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_AddSlotToAccessList_Call) Return() *PolarStateDB_AddSlotToAccessList_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_AddSlotToAccessList_Call) RunAndReturn(run func(common.Address, common.Hash)) *PolarStateDB_AddSlotToAccessList_Call { + _c.Call.Return(run) + return _c +} + +// AddressInAccessList provides a mock function with given fields: addr +func (_m *PolarStateDB) AddressInAccessList(addr common.Address) bool { + ret := _m.Called(addr) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(addr) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// PolarStateDB_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList' +type PolarStateDB_AddressInAccessList_Call struct { + *mock.Call +} + +// AddressInAccessList is a helper method to define mock.On call +// - addr common.Address +func (_e *PolarStateDB_Expecter) AddressInAccessList(addr interface{}) *PolarStateDB_AddressInAccessList_Call { + return &PolarStateDB_AddressInAccessList_Call{Call: _e.mock.On("AddressInAccessList", addr)} +} + +func (_c *PolarStateDB_AddressInAccessList_Call) Run(run func(addr common.Address)) *PolarStateDB_AddressInAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_AddressInAccessList_Call) Return(_a0 bool) *PolarStateDB_AddressInAccessList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_AddressInAccessList_Call) RunAndReturn(run func(common.Address) bool) *PolarStateDB_AddressInAccessList_Call { + _c.Call.Return(run) + return _c +} + +// Commit provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) Commit(_a0 uint64, _a1 bool) (common.Hash, error) { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(uint64, bool) (common.Hash, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(uint64, bool) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(uint64, bool) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolarStateDB_Commit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Commit' +type PolarStateDB_Commit_Call struct { + *mock.Call +} + +// Commit is a helper method to define mock.On call +// - _a0 uint64 +// - _a1 bool +func (_e *PolarStateDB_Expecter) Commit(_a0 interface{}, _a1 interface{}) *PolarStateDB_Commit_Call { + return &PolarStateDB_Commit_Call{Call: _e.mock.On("Commit", _a0, _a1)} +} + +func (_c *PolarStateDB_Commit_Call) Run(run func(_a0 uint64, _a1 bool)) *PolarStateDB_Commit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64), args[1].(bool)) + }) + return _c +} + +func (_c *PolarStateDB_Commit_Call) Return(_a0 common.Hash, _a1 error) *PolarStateDB_Commit_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolarStateDB_Commit_Call) RunAndReturn(run func(uint64, bool) (common.Hash, error)) *PolarStateDB_Commit_Call { + _c.Call.Return(run) + return _c +} + +// Copy provides a mock function with given fields: +func (_m *PolarStateDB) Copy() corestate.StateDBI { + ret := _m.Called() + + var r0 corestate.StateDBI + if rf, ok := ret.Get(0).(func() corestate.StateDBI); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(corestate.StateDBI) + } + } + + return r0 +} + +// PolarStateDB_Copy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Copy' +type PolarStateDB_Copy_Call struct { + *mock.Call +} + +// Copy is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) Copy() *PolarStateDB_Copy_Call { + return &PolarStateDB_Copy_Call{Call: _e.mock.On("Copy")} +} + +func (_c *PolarStateDB_Copy_Call) Run(run func()) *PolarStateDB_Copy_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_Copy_Call) Return(_a0 corestate.StateDBI) *PolarStateDB_Copy_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Copy_Call) RunAndReturn(run func() corestate.StateDBI) *PolarStateDB_Copy_Call { + _c.Call.Return(run) + return _c +} + +// CreateAccount provides a mock function with given fields: _a0 +func (_m *PolarStateDB) CreateAccount(_a0 common.Address) { + _m.Called(_a0) +} + +// PolarStateDB_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount' +type PolarStateDB_CreateAccount_Call struct { + *mock.Call +} + +// CreateAccount is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) CreateAccount(_a0 interface{}) *PolarStateDB_CreateAccount_Call { + return &PolarStateDB_CreateAccount_Call{Call: _e.mock.On("CreateAccount", _a0)} +} + +func (_c *PolarStateDB_CreateAccount_Call) Run(run func(_a0 common.Address)) *PolarStateDB_CreateAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_CreateAccount_Call) Return() *PolarStateDB_CreateAccount_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_CreateAccount_Call) RunAndReturn(run func(common.Address)) *PolarStateDB_CreateAccount_Call { + _c.Call.Return(run) + return _c +} + +// Database provides a mock function with given fields: +func (_m *PolarStateDB) Database() corestate.Database { + ret := _m.Called() + + var r0 corestate.Database + if rf, ok := ret.Get(0).(func() corestate.Database); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(corestate.Database) + } + } + + return r0 +} + +// PolarStateDB_Database_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Database' +type PolarStateDB_Database_Call struct { + *mock.Call +} + +// Database is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) Database() *PolarStateDB_Database_Call { + return &PolarStateDB_Database_Call{Call: _e.mock.On("Database")} +} + +func (_c *PolarStateDB_Database_Call) Run(run func()) *PolarStateDB_Database_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_Database_Call) Return(_a0 corestate.Database) *PolarStateDB_Database_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Database_Call) RunAndReturn(run func() corestate.Database) *PolarStateDB_Database_Call { + _c.Call.Return(run) + return _c +} + +// Dump provides a mock function with given fields: opts +func (_m *PolarStateDB) Dump(opts *corestate.DumpConfig) []byte { + ret := _m.Called(opts) + + var r0 []byte + if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) []byte); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// PolarStateDB_Dump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Dump' +type PolarStateDB_Dump_Call struct { + *mock.Call +} + +// Dump is a helper method to define mock.On call +// - opts *corestate.DumpConfig +func (_e *PolarStateDB_Expecter) Dump(opts interface{}) *PolarStateDB_Dump_Call { + return &PolarStateDB_Dump_Call{Call: _e.mock.On("Dump", opts)} +} + +func (_c *PolarStateDB_Dump_Call) Run(run func(opts *corestate.DumpConfig)) *PolarStateDB_Dump_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *PolarStateDB_Dump_Call) Return(_a0 []byte) *PolarStateDB_Dump_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Dump_Call) RunAndReturn(run func(*corestate.DumpConfig) []byte) *PolarStateDB_Dump_Call { + _c.Call.Return(run) + return _c +} + +// DumpToCollector provides a mock function with given fields: c, conf +func (_m *PolarStateDB) DumpToCollector(c corestate.DumpCollector, conf *corestate.DumpConfig) []byte { + ret := _m.Called(c, conf) + + var r0 []byte + if rf, ok := ret.Get(0).(func(corestate.DumpCollector, *corestate.DumpConfig) []byte); ok { + r0 = rf(c, conf) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// PolarStateDB_DumpToCollector_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DumpToCollector' +type PolarStateDB_DumpToCollector_Call struct { + *mock.Call +} + +// DumpToCollector is a helper method to define mock.On call +// - c corestate.DumpCollector +// - conf *corestate.DumpConfig +func (_e *PolarStateDB_Expecter) DumpToCollector(c interface{}, conf interface{}) *PolarStateDB_DumpToCollector_Call { + return &PolarStateDB_DumpToCollector_Call{Call: _e.mock.On("DumpToCollector", c, conf)} +} + +func (_c *PolarStateDB_DumpToCollector_Call) Run(run func(c corestate.DumpCollector, conf *corestate.DumpConfig)) *PolarStateDB_DumpToCollector_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(corestate.DumpCollector), args[1].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *PolarStateDB_DumpToCollector_Call) Return(nextKey []byte) *PolarStateDB_DumpToCollector_Call { + _c.Call.Return(nextKey) + return _c +} + +func (_c *PolarStateDB_DumpToCollector_Call) RunAndReturn(run func(corestate.DumpCollector, *corestate.DumpConfig) []byte) *PolarStateDB_DumpToCollector_Call { + _c.Call.Return(run) + return _c +} + +// Empty provides a mock function with given fields: _a0 +func (_m *PolarStateDB) Empty(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// PolarStateDB_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty' +type PolarStateDB_Empty_Call struct { + *mock.Call +} + +// Empty is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) Empty(_a0 interface{}) *PolarStateDB_Empty_Call { + return &PolarStateDB_Empty_Call{Call: _e.mock.On("Empty", _a0)} +} + +func (_c *PolarStateDB_Empty_Call) Run(run func(_a0 common.Address)) *PolarStateDB_Empty_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_Empty_Call) Return(_a0 bool) *PolarStateDB_Empty_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Empty_Call) RunAndReturn(run func(common.Address) bool) *PolarStateDB_Empty_Call { + _c.Call.Return(run) + return _c +} + +// Error provides a mock function with given fields: +func (_m *PolarStateDB) Error() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// PolarStateDB_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' +type PolarStateDB_Error_Call struct { + *mock.Call +} + +// Error is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) Error() *PolarStateDB_Error_Call { + return &PolarStateDB_Error_Call{Call: _e.mock.On("Error")} +} + +func (_c *PolarStateDB_Error_Call) Run(run func()) *PolarStateDB_Error_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_Error_Call) Return(_a0 error) *PolarStateDB_Error_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Error_Call) RunAndReturn(run func() error) *PolarStateDB_Error_Call { + _c.Call.Return(run) + return _c +} + +// Exist provides a mock function with given fields: _a0 +func (_m *PolarStateDB) Exist(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// PolarStateDB_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist' +type PolarStateDB_Exist_Call struct { + *mock.Call +} + +// Exist is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) Exist(_a0 interface{}) *PolarStateDB_Exist_Call { + return &PolarStateDB_Exist_Call{Call: _e.mock.On("Exist", _a0)} +} + +func (_c *PolarStateDB_Exist_Call) Run(run func(_a0 common.Address)) *PolarStateDB_Exist_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_Exist_Call) Return(_a0 bool) *PolarStateDB_Exist_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Exist_Call) RunAndReturn(run func(common.Address) bool) *PolarStateDB_Exist_Call { + _c.Call.Return(run) + return _c +} + +// Finalise provides a mock function with given fields: deleteEmptyObjects +func (_m *PolarStateDB) Finalise(deleteEmptyObjects bool) { + _m.Called(deleteEmptyObjects) +} + +// PolarStateDB_Finalise_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalise' +type PolarStateDB_Finalise_Call struct { + *mock.Call +} + +// Finalise is a helper method to define mock.On call +// - deleteEmptyObjects bool +func (_e *PolarStateDB_Expecter) Finalise(deleteEmptyObjects interface{}) *PolarStateDB_Finalise_Call { + return &PolarStateDB_Finalise_Call{Call: _e.mock.On("Finalise", deleteEmptyObjects)} +} + +func (_c *PolarStateDB_Finalise_Call) Run(run func(deleteEmptyObjects bool)) *PolarStateDB_Finalise_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(bool)) + }) + return _c +} + +func (_c *PolarStateDB_Finalise_Call) Return() *PolarStateDB_Finalise_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_Finalise_Call) RunAndReturn(run func(bool)) *PolarStateDB_Finalise_Call { + _c.Call.Return(run) + return _c +} + +// GetBalance provides a mock function with given fields: _a0 +func (_m *PolarStateDB) GetBalance(_a0 common.Address) *big.Int { + ret := _m.Called(_a0) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(common.Address) *big.Int); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + return r0 +} + +// PolarStateDB_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance' +type PolarStateDB_GetBalance_Call struct { + *mock.Call +} + +// GetBalance is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) GetBalance(_a0 interface{}) *PolarStateDB_GetBalance_Call { + return &PolarStateDB_GetBalance_Call{Call: _e.mock.On("GetBalance", _a0)} +} + +func (_c *PolarStateDB_GetBalance_Call) Run(run func(_a0 common.Address)) *PolarStateDB_GetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetBalance_Call) Return(_a0 *big.Int) *PolarStateDB_GetBalance_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int) *PolarStateDB_GetBalance_Call { + _c.Call.Return(run) + return _c +} + +// GetCode provides a mock function with given fields: _a0 +func (_m *PolarStateDB) GetCode(_a0 common.Address) []byte { + ret := _m.Called(_a0) + + var r0 []byte + if rf, ok := ret.Get(0).(func(common.Address) []byte); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// PolarStateDB_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode' +type PolarStateDB_GetCode_Call struct { + *mock.Call +} + +// GetCode is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) GetCode(_a0 interface{}) *PolarStateDB_GetCode_Call { + return &PolarStateDB_GetCode_Call{Call: _e.mock.On("GetCode", _a0)} +} + +func (_c *PolarStateDB_GetCode_Call) Run(run func(_a0 common.Address)) *PolarStateDB_GetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetCode_Call) Return(_a0 []byte) *PolarStateDB_GetCode_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetCode_Call) RunAndReturn(run func(common.Address) []byte) *PolarStateDB_GetCode_Call { + _c.Call.Return(run) + return _c +} + +// GetCodeHash provides a mock function with given fields: _a0 +func (_m *PolarStateDB) GetCodeHash(_a0 common.Address) common.Hash { + ret := _m.Called(_a0) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// PolarStateDB_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash' +type PolarStateDB_GetCodeHash_Call struct { + *mock.Call +} + +// GetCodeHash is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) GetCodeHash(_a0 interface{}) *PolarStateDB_GetCodeHash_Call { + return &PolarStateDB_GetCodeHash_Call{Call: _e.mock.On("GetCodeHash", _a0)} +} + +func (_c *PolarStateDB_GetCodeHash_Call) Run(run func(_a0 common.Address)) *PolarStateDB_GetCodeHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetCodeHash_Call) Return(_a0 common.Hash) *PolarStateDB_GetCodeHash_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetCodeHash_Call) RunAndReturn(run func(common.Address) common.Hash) *PolarStateDB_GetCodeHash_Call { + _c.Call.Return(run) + return _c +} + +// GetCodeSize provides a mock function with given fields: _a0 +func (_m *PolarStateDB) GetCodeSize(_a0 common.Address) int { + ret := _m.Called(_a0) + + var r0 int + if rf, ok := ret.Get(0).(func(common.Address) int); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// PolarStateDB_GetCodeSize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeSize' +type PolarStateDB_GetCodeSize_Call struct { + *mock.Call +} + +// GetCodeSize is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) GetCodeSize(_a0 interface{}) *PolarStateDB_GetCodeSize_Call { + return &PolarStateDB_GetCodeSize_Call{Call: _e.mock.On("GetCodeSize", _a0)} +} + +func (_c *PolarStateDB_GetCodeSize_Call) Run(run func(_a0 common.Address)) *PolarStateDB_GetCodeSize_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetCodeSize_Call) Return(_a0 int) *PolarStateDB_GetCodeSize_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetCodeSize_Call) RunAndReturn(run func(common.Address) int) *PolarStateDB_GetCodeSize_Call { + _c.Call.Return(run) + return _c +} + +// GetCommittedState provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) GetCommittedState(_a0 common.Address, _a1 common.Hash) common.Hash { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// PolarStateDB_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState' +type PolarStateDB_GetCommittedState_Call struct { + *mock.Call +} + +// GetCommittedState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *PolarStateDB_Expecter) GetCommittedState(_a0 interface{}, _a1 interface{}) *PolarStateDB_GetCommittedState_Call { + return &PolarStateDB_GetCommittedState_Call{Call: _e.mock.On("GetCommittedState", _a0, _a1)} +} + +func (_c *PolarStateDB_GetCommittedState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *PolarStateDB_GetCommittedState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_GetCommittedState_Call) Return(_a0 common.Hash) *PolarStateDB_GetCommittedState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetCommittedState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *PolarStateDB_GetCommittedState_Call { + _c.Call.Return(run) + return _c +} + +// GetContext provides a mock function with given fields: +func (_m *PolarStateDB) GetContext() context.Context { + ret := _m.Called() + + var r0 context.Context + if rf, ok := ret.Get(0).(func() context.Context); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(context.Context) + } + } + + return r0 +} + +// PolarStateDB_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext' +type PolarStateDB_GetContext_Call struct { + *mock.Call +} + +// GetContext is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) GetContext() *PolarStateDB_GetContext_Call { + return &PolarStateDB_GetContext_Call{Call: _e.mock.On("GetContext")} +} + +func (_c *PolarStateDB_GetContext_Call) Run(run func()) *PolarStateDB_GetContext_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_GetContext_Call) Return(_a0 context.Context) *PolarStateDB_GetContext_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetContext_Call) RunAndReturn(run func() context.Context) *PolarStateDB_GetContext_Call { + _c.Call.Return(run) + return _c +} + +// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash +func (_m *PolarStateDB) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { + ret := _m.Called(hash, blockNumber, blockHash) + + var r0 []*types.Log + if rf, ok := ret.Get(0).(func(common.Hash, uint64, common.Hash) []*types.Log); ok { + r0 = rf(hash, blockNumber, blockHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Log) + } + } + + return r0 +} + +// PolarStateDB_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs' +type PolarStateDB_GetLogs_Call struct { + *mock.Call +} + +// GetLogs is a helper method to define mock.On call +// - hash common.Hash +// - blockNumber uint64 +// - blockHash common.Hash +func (_e *PolarStateDB_Expecter) GetLogs(hash interface{}, blockNumber interface{}, blockHash interface{}) *PolarStateDB_GetLogs_Call { + return &PolarStateDB_GetLogs_Call{Call: _e.mock.On("GetLogs", hash, blockNumber, blockHash)} +} + +func (_c *PolarStateDB_GetLogs_Call) Run(run func(hash common.Hash, blockNumber uint64, blockHash common.Hash)) *PolarStateDB_GetLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(uint64), args[2].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_GetLogs_Call) Return(_a0 []*types.Log) *PolarStateDB_GetLogs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetLogs_Call) RunAndReturn(run func(common.Hash, uint64, common.Hash) []*types.Log) *PolarStateDB_GetLogs_Call { + _c.Call.Return(run) + return _c +} + +// GetNonce provides a mock function with given fields: _a0 +func (_m *PolarStateDB) GetNonce(_a0 common.Address) uint64 { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(common.Address) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// PolarStateDB_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce' +type PolarStateDB_GetNonce_Call struct { + *mock.Call +} + +// GetNonce is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) GetNonce(_a0 interface{}) *PolarStateDB_GetNonce_Call { + return &PolarStateDB_GetNonce_Call{Call: _e.mock.On("GetNonce", _a0)} +} + +func (_c *PolarStateDB_GetNonce_Call) Run(run func(_a0 common.Address)) *PolarStateDB_GetNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetNonce_Call) Return(_a0 uint64) *PolarStateDB_GetNonce_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetNonce_Call) RunAndReturn(run func(common.Address) uint64) *PolarStateDB_GetNonce_Call { + _c.Call.Return(run) + return _c +} + +// GetOrNewStateObject provides a mock function with given fields: addr +func (_m *PolarStateDB) GetOrNewStateObject(addr common.Address) *corestate.StateObject { + ret := _m.Called(addr) + + var r0 *corestate.StateObject + if rf, ok := ret.Get(0).(func(common.Address) *corestate.StateObject); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*corestate.StateObject) + } + } + + return r0 +} + +// PolarStateDB_GetOrNewStateObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOrNewStateObject' +type PolarStateDB_GetOrNewStateObject_Call struct { + *mock.Call +} + +// GetOrNewStateObject is a helper method to define mock.On call +// - addr common.Address +func (_e *PolarStateDB_Expecter) GetOrNewStateObject(addr interface{}) *PolarStateDB_GetOrNewStateObject_Call { + return &PolarStateDB_GetOrNewStateObject_Call{Call: _e.mock.On("GetOrNewStateObject", addr)} +} + +func (_c *PolarStateDB_GetOrNewStateObject_Call) Run(run func(addr common.Address)) *PolarStateDB_GetOrNewStateObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetOrNewStateObject_Call) Return(_a0 *corestate.StateObject) *PolarStateDB_GetOrNewStateObject_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetOrNewStateObject_Call) RunAndReturn(run func(common.Address) *corestate.StateObject) *PolarStateDB_GetOrNewStateObject_Call { + _c.Call.Return(run) + return _c +} + +// GetPrecompileManager provides a mock function with given fields: +func (_m *PolarStateDB) GetPrecompileManager() interface{} { + ret := _m.Called() + + var r0 interface{} + if rf, ok := ret.Get(0).(func() interface{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + return r0 +} + +// PolarStateDB_GetPrecompileManager_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPrecompileManager' +type PolarStateDB_GetPrecompileManager_Call struct { + *mock.Call +} + +// GetPrecompileManager is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) GetPrecompileManager() *PolarStateDB_GetPrecompileManager_Call { + return &PolarStateDB_GetPrecompileManager_Call{Call: _e.mock.On("GetPrecompileManager")} +} + +func (_c *PolarStateDB_GetPrecompileManager_Call) Run(run func()) *PolarStateDB_GetPrecompileManager_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_GetPrecompileManager_Call) Return(_a0 interface{}) *PolarStateDB_GetPrecompileManager_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetPrecompileManager_Call) RunAndReturn(run func() interface{}) *PolarStateDB_GetPrecompileManager_Call { + _c.Call.Return(run) + return _c +} + +// GetRefund provides a mock function with given fields: +func (_m *PolarStateDB) GetRefund() uint64 { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// PolarStateDB_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund' +type PolarStateDB_GetRefund_Call struct { + *mock.Call +} + +// GetRefund is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) GetRefund() *PolarStateDB_GetRefund_Call { + return &PolarStateDB_GetRefund_Call{Call: _e.mock.On("GetRefund")} +} + +func (_c *PolarStateDB_GetRefund_Call) Run(run func()) *PolarStateDB_GetRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_GetRefund_Call) Return(_a0 uint64) *PolarStateDB_GetRefund_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetRefund_Call) RunAndReturn(run func() uint64) *PolarStateDB_GetRefund_Call { + _c.Call.Return(run) + return _c +} + +// GetState provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { + ret := _m.Called(_a0, _a1) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// PolarStateDB_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState' +type PolarStateDB_GetState_Call struct { + *mock.Call +} + +// GetState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +func (_e *PolarStateDB_Expecter) GetState(_a0 interface{}, _a1 interface{}) *PolarStateDB_GetState_Call { + return &PolarStateDB_GetState_Call{Call: _e.mock.On("GetState", _a0, _a1)} +} + +func (_c *PolarStateDB_GetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *PolarStateDB_GetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_GetState_Call) Return(_a0 common.Hash) *PolarStateDB_GetState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *PolarStateDB_GetState_Call { + _c.Call.Return(run) + return _c +} + +// GetStorageRoot provides a mock function with given fields: addr +func (_m *PolarStateDB) GetStorageRoot(addr common.Address) common.Hash { + ret := _m.Called(addr) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// PolarStateDB_GetStorageRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetStorageRoot' +type PolarStateDB_GetStorageRoot_Call struct { + *mock.Call +} + +// GetStorageRoot is a helper method to define mock.On call +// - addr common.Address +func (_e *PolarStateDB_Expecter) GetStorageRoot(addr interface{}) *PolarStateDB_GetStorageRoot_Call { + return &PolarStateDB_GetStorageRoot_Call{Call: _e.mock.On("GetStorageRoot", addr)} +} + +func (_c *PolarStateDB_GetStorageRoot_Call) Run(run func(addr common.Address)) *PolarStateDB_GetStorageRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_GetStorageRoot_Call) Return(_a0 common.Hash) *PolarStateDB_GetStorageRoot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetStorageRoot_Call) RunAndReturn(run func(common.Address) common.Hash) *PolarStateDB_GetStorageRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetTransientState provides a mock function with given fields: addr, key +func (_m *PolarStateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash { + ret := _m.Called(addr, key) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { + r0 = rf(addr, key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// PolarStateDB_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState' +type PolarStateDB_GetTransientState_Call struct { + *mock.Call +} + +// GetTransientState is a helper method to define mock.On call +// - addr common.Address +// - key common.Hash +func (_e *PolarStateDB_Expecter) GetTransientState(addr interface{}, key interface{}) *PolarStateDB_GetTransientState_Call { + return &PolarStateDB_GetTransientState_Call{Call: _e.mock.On("GetTransientState", addr, key)} +} + +func (_c *PolarStateDB_GetTransientState_Call) Run(run func(addr common.Address, key common.Hash)) *PolarStateDB_GetTransientState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_GetTransientState_Call) Return(_a0 common.Hash) *PolarStateDB_GetTransientState_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_GetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *PolarStateDB_GetTransientState_Call { + _c.Call.Return(run) + return _c +} + +// HasSelfDestructed provides a mock function with given fields: _a0 +func (_m *PolarStateDB) HasSelfDestructed(_a0 common.Address) bool { + ret := _m.Called(_a0) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Address) bool); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// PolarStateDB_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed' +type PolarStateDB_HasSelfDestructed_Call struct { + *mock.Call +} + +// HasSelfDestructed is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) HasSelfDestructed(_a0 interface{}) *PolarStateDB_HasSelfDestructed_Call { + return &PolarStateDB_HasSelfDestructed_Call{Call: _e.mock.On("HasSelfDestructed", _a0)} +} + +func (_c *PolarStateDB_HasSelfDestructed_Call) Run(run func(_a0 common.Address)) *PolarStateDB_HasSelfDestructed_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_HasSelfDestructed_Call) Return(_a0 bool) *PolarStateDB_HasSelfDestructed_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_HasSelfDestructed_Call) RunAndReturn(run func(common.Address) bool) *PolarStateDB_HasSelfDestructed_Call { + _c.Call.Return(run) + return _c +} + +// IntermediateRoot provides a mock function with given fields: deleteEmptyObjects +func (_m *PolarStateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { + ret := _m.Called(deleteEmptyObjects) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(bool) common.Hash); ok { + r0 = rf(deleteEmptyObjects) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + return r0 +} + +// PolarStateDB_IntermediateRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IntermediateRoot' +type PolarStateDB_IntermediateRoot_Call struct { + *mock.Call +} + +// IntermediateRoot is a helper method to define mock.On call +// - deleteEmptyObjects bool +func (_e *PolarStateDB_Expecter) IntermediateRoot(deleteEmptyObjects interface{}) *PolarStateDB_IntermediateRoot_Call { + return &PolarStateDB_IntermediateRoot_Call{Call: _e.mock.On("IntermediateRoot", deleteEmptyObjects)} +} + +func (_c *PolarStateDB_IntermediateRoot_Call) Run(run func(deleteEmptyObjects bool)) *PolarStateDB_IntermediateRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(bool)) + }) + return _c +} + +func (_c *PolarStateDB_IntermediateRoot_Call) Return(_a0 common.Hash) *PolarStateDB_IntermediateRoot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_IntermediateRoot_Call) RunAndReturn(run func(bool) common.Hash) *PolarStateDB_IntermediateRoot_Call { + _c.Call.Return(run) + return _c +} + +// IteratorDump provides a mock function with given fields: opts +func (_m *PolarStateDB) IteratorDump(opts *corestate.DumpConfig) corestate.IteratorDump { + ret := _m.Called(opts) + + var r0 corestate.IteratorDump + if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) corestate.IteratorDump); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(corestate.IteratorDump) + } + + return r0 +} + +// PolarStateDB_IteratorDump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IteratorDump' +type PolarStateDB_IteratorDump_Call struct { + *mock.Call +} + +// IteratorDump is a helper method to define mock.On call +// - opts *corestate.DumpConfig +func (_e *PolarStateDB_Expecter) IteratorDump(opts interface{}) *PolarStateDB_IteratorDump_Call { + return &PolarStateDB_IteratorDump_Call{Call: _e.mock.On("IteratorDump", opts)} +} + +func (_c *PolarStateDB_IteratorDump_Call) Run(run func(opts *corestate.DumpConfig)) *PolarStateDB_IteratorDump_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *PolarStateDB_IteratorDump_Call) Return(_a0 corestate.IteratorDump) *PolarStateDB_IteratorDump_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_IteratorDump_Call) RunAndReturn(run func(*corestate.DumpConfig) corestate.IteratorDump) *PolarStateDB_IteratorDump_Call { + _c.Call.Return(run) + return _c +} + +// Logs provides a mock function with given fields: +func (_m *PolarStateDB) Logs() []*types.Log { + ret := _m.Called() + + var r0 []*types.Log + if rf, ok := ret.Get(0).(func() []*types.Log); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Log) + } + } + + return r0 +} + +// PolarStateDB_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs' +type PolarStateDB_Logs_Call struct { + *mock.Call +} + +// Logs is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) Logs() *PolarStateDB_Logs_Call { + return &PolarStateDB_Logs_Call{Call: _e.mock.On("Logs")} +} + +func (_c *PolarStateDB_Logs_Call) Run(run func()) *PolarStateDB_Logs_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_Logs_Call) Return(_a0 []*types.Log) *PolarStateDB_Logs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Logs_Call) RunAndReturn(run func() []*types.Log) *PolarStateDB_Logs_Call { + _c.Call.Return(run) + return _c +} + +// Preimages provides a mock function with given fields: +func (_m *PolarStateDB) Preimages() map[common.Hash][]byte { + ret := _m.Called() + + var r0 map[common.Hash][]byte + if rf, ok := ret.Get(0).(func() map[common.Hash][]byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[common.Hash][]byte) + } + } + + return r0 +} + +// PolarStateDB_Preimages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Preimages' +type PolarStateDB_Preimages_Call struct { + *mock.Call +} + +// Preimages is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) Preimages() *PolarStateDB_Preimages_Call { + return &PolarStateDB_Preimages_Call{Call: _e.mock.On("Preimages")} +} + +func (_c *PolarStateDB_Preimages_Call) Run(run func()) *PolarStateDB_Preimages_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_Preimages_Call) Return(_a0 map[common.Hash][]byte) *PolarStateDB_Preimages_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Preimages_Call) RunAndReturn(run func() map[common.Hash][]byte) *PolarStateDB_Preimages_Call { + _c.Call.Return(run) + return _c +} + +// Prepare provides a mock function with given fields: rules, sender, coinbase, dest, precompiles, txAccesses +func (_m *PolarStateDB) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { + _m.Called(rules, sender, coinbase, dest, precompiles, txAccesses) +} + +// PolarStateDB_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare' +type PolarStateDB_Prepare_Call struct { + *mock.Call +} + +// Prepare is a helper method to define mock.On call +// - rules params.Rules +// - sender common.Address +// - coinbase common.Address +// - dest *common.Address +// - precompiles []common.Address +// - txAccesses types.AccessList +func (_e *PolarStateDB_Expecter) Prepare(rules interface{}, sender interface{}, coinbase interface{}, dest interface{}, precompiles interface{}, txAccesses interface{}) *PolarStateDB_Prepare_Call { + return &PolarStateDB_Prepare_Call{Call: _e.mock.On("Prepare", rules, sender, coinbase, dest, precompiles, txAccesses)} +} + +func (_c *PolarStateDB_Prepare_Call) Run(run func(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList)) *PolarStateDB_Prepare_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(params.Rules), args[1].(common.Address), args[2].(common.Address), args[3].(*common.Address), args[4].([]common.Address), args[5].(types.AccessList)) + }) + return _c +} + +func (_c *PolarStateDB_Prepare_Call) Return() *PolarStateDB_Prepare_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_Prepare_Call) RunAndReturn(run func(params.Rules, common.Address, common.Address, *common.Address, []common.Address, types.AccessList)) *PolarStateDB_Prepare_Call { + _c.Call.Return(run) + return _c +} + +// RawDump provides a mock function with given fields: opts +func (_m *PolarStateDB) RawDump(opts *corestate.DumpConfig) corestate.Dump { + ret := _m.Called(opts) + + var r0 corestate.Dump + if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) corestate.Dump); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(corestate.Dump) + } + + return r0 +} + +// PolarStateDB_RawDump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RawDump' +type PolarStateDB_RawDump_Call struct { + *mock.Call +} + +// RawDump is a helper method to define mock.On call +// - opts *corestate.DumpConfig +func (_e *PolarStateDB_Expecter) RawDump(opts interface{}) *PolarStateDB_RawDump_Call { + return &PolarStateDB_RawDump_Call{Call: _e.mock.On("RawDump", opts)} +} + +func (_c *PolarStateDB_RawDump_Call) Run(run func(opts *corestate.DumpConfig)) *PolarStateDB_RawDump_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*corestate.DumpConfig)) + }) + return _c +} + +func (_c *PolarStateDB_RawDump_Call) Return(_a0 corestate.Dump) *PolarStateDB_RawDump_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_RawDump_Call) RunAndReturn(run func(*corestate.DumpConfig) corestate.Dump) *PolarStateDB_RawDump_Call { + _c.Call.Return(run) + return _c +} + +// RevertToSnapshot provides a mock function with given fields: _a0 +func (_m *PolarStateDB) RevertToSnapshot(_a0 int) { + _m.Called(_a0) +} + +// PolarStateDB_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot' +type PolarStateDB_RevertToSnapshot_Call struct { + *mock.Call +} + +// RevertToSnapshot is a helper method to define mock.On call +// - _a0 int +func (_e *PolarStateDB_Expecter) RevertToSnapshot(_a0 interface{}) *PolarStateDB_RevertToSnapshot_Call { + return &PolarStateDB_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} +} + +func (_c *PolarStateDB_RevertToSnapshot_Call) Run(run func(_a0 int)) *PolarStateDB_RevertToSnapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(int)) + }) + return _c +} + +func (_c *PolarStateDB_RevertToSnapshot_Call) Return() *PolarStateDB_RevertToSnapshot_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_RevertToSnapshot_Call) RunAndReturn(run func(int)) *PolarStateDB_RevertToSnapshot_Call { + _c.Call.Return(run) + return _c +} + +// SelfDestruct provides a mock function with given fields: _a0 +func (_m *PolarStateDB) SelfDestruct(_a0 common.Address) { + _m.Called(_a0) +} + +// PolarStateDB_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct' +type PolarStateDB_SelfDestruct_Call struct { + *mock.Call +} + +// SelfDestruct is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) SelfDestruct(_a0 interface{}) *PolarStateDB_SelfDestruct_Call { + return &PolarStateDB_SelfDestruct_Call{Call: _e.mock.On("SelfDestruct", _a0)} +} + +func (_c *PolarStateDB_SelfDestruct_Call) Run(run func(_a0 common.Address)) *PolarStateDB_SelfDestruct_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_SelfDestruct_Call) Return() *PolarStateDB_SelfDestruct_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SelfDestruct_Call) RunAndReturn(run func(common.Address)) *PolarStateDB_SelfDestruct_Call { + _c.Call.Return(run) + return _c +} + +// Selfdestruct6780 provides a mock function with given fields: _a0 +func (_m *PolarStateDB) Selfdestruct6780(_a0 common.Address) { + _m.Called(_a0) +} + +// PolarStateDB_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780' +type PolarStateDB_Selfdestruct6780_Call struct { + *mock.Call +} + +// Selfdestruct6780 is a helper method to define mock.On call +// - _a0 common.Address +func (_e *PolarStateDB_Expecter) Selfdestruct6780(_a0 interface{}) *PolarStateDB_Selfdestruct6780_Call { + return &PolarStateDB_Selfdestruct6780_Call{Call: _e.mock.On("Selfdestruct6780", _a0)} +} + +func (_c *PolarStateDB_Selfdestruct6780_Call) Run(run func(_a0 common.Address)) *PolarStateDB_Selfdestruct6780_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address)) + }) + return _c +} + +func (_c *PolarStateDB_Selfdestruct6780_Call) Return() *PolarStateDB_Selfdestruct6780_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_Selfdestruct6780_Call) RunAndReturn(run func(common.Address)) *PolarStateDB_Selfdestruct6780_Call { + _c.Call.Return(run) + return _c +} + +// SetBalance provides a mock function with given fields: addr, amount +func (_m *PolarStateDB) SetBalance(addr common.Address, amount *big.Int) { + _m.Called(addr, amount) +} + +// PolarStateDB_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance' +type PolarStateDB_SetBalance_Call struct { + *mock.Call +} + +// SetBalance is a helper method to define mock.On call +// - addr common.Address +// - amount *big.Int +func (_e *PolarStateDB_Expecter) SetBalance(addr interface{}, amount interface{}) *PolarStateDB_SetBalance_Call { + return &PolarStateDB_SetBalance_Call{Call: _e.mock.On("SetBalance", addr, amount)} +} + +func (_c *PolarStateDB_SetBalance_Call) Run(run func(addr common.Address, amount *big.Int)) *PolarStateDB_SetBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *PolarStateDB_SetBalance_Call) Return() *PolarStateDB_SetBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *PolarStateDB_SetBalance_Call { + _c.Call.Return(run) + return _c +} + +// SetCode provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) SetCode(_a0 common.Address, _a1 []byte) { + _m.Called(_a0, _a1) +} + +// PolarStateDB_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode' +type PolarStateDB_SetCode_Call struct { + *mock.Call +} + +// SetCode is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 []byte +func (_e *PolarStateDB_Expecter) SetCode(_a0 interface{}, _a1 interface{}) *PolarStateDB_SetCode_Call { + return &PolarStateDB_SetCode_Call{Call: _e.mock.On("SetCode", _a0, _a1)} +} + +func (_c *PolarStateDB_SetCode_Call) Run(run func(_a0 common.Address, _a1 []byte)) *PolarStateDB_SetCode_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].([]byte)) + }) + return _c +} + +func (_c *PolarStateDB_SetCode_Call) Return() *PolarStateDB_SetCode_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetCode_Call) RunAndReturn(run func(common.Address, []byte)) *PolarStateDB_SetCode_Call { + _c.Call.Return(run) + return _c +} + +// SetNonce provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) SetNonce(_a0 common.Address, _a1 uint64) { + _m.Called(_a0, _a1) +} + +// PolarStateDB_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce' +type PolarStateDB_SetNonce_Call struct { + *mock.Call +} + +// SetNonce is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 uint64 +func (_e *PolarStateDB_Expecter) SetNonce(_a0 interface{}, _a1 interface{}) *PolarStateDB_SetNonce_Call { + return &PolarStateDB_SetNonce_Call{Call: _e.mock.On("SetNonce", _a0, _a1)} +} + +func (_c *PolarStateDB_SetNonce_Call) Run(run func(_a0 common.Address, _a1 uint64)) *PolarStateDB_SetNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(uint64)) + }) + return _c +} + +func (_c *PolarStateDB_SetNonce_Call) Return() *PolarStateDB_SetNonce_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetNonce_Call) RunAndReturn(run func(common.Address, uint64)) *PolarStateDB_SetNonce_Call { + _c.Call.Return(run) + return _c +} + +// SetState provides a mock function with given fields: _a0, _a1, _a2 +func (_m *PolarStateDB) SetState(_a0 common.Address, _a1 common.Hash, _a2 common.Hash) { + _m.Called(_a0, _a1, _a2) +} + +// PolarStateDB_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState' +type PolarStateDB_SetState_Call struct { + *mock.Call +} + +// SetState is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 common.Hash +// - _a2 common.Hash +func (_e *PolarStateDB_Expecter) SetState(_a0 interface{}, _a1 interface{}, _a2 interface{}) *PolarStateDB_SetState_Call { + return &PolarStateDB_SetState_Call{Call: _e.mock.On("SetState", _a0, _a1, _a2)} +} + +func (_c *PolarStateDB_SetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash, _a2 common.Hash)) *PolarStateDB_SetState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_SetState_Call) Return() *PolarStateDB_SetState_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *PolarStateDB_SetState_Call { + _c.Call.Return(run) + return _c +} + +// SetStorage provides a mock function with given fields: addr, storage +func (_m *PolarStateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { + _m.Called(addr, storage) +} + +// PolarStateDB_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage' +type PolarStateDB_SetStorage_Call struct { + *mock.Call +} + +// SetStorage is a helper method to define mock.On call +// - addr common.Address +// - storage map[common.Hash]common.Hash +func (_e *PolarStateDB_Expecter) SetStorage(addr interface{}, storage interface{}) *PolarStateDB_SetStorage_Call { + return &PolarStateDB_SetStorage_Call{Call: _e.mock.On("SetStorage", addr, storage)} +} + +func (_c *PolarStateDB_SetStorage_Call) Run(run func(addr common.Address, storage map[common.Hash]common.Hash)) *PolarStateDB_SetStorage_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(map[common.Hash]common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_SetStorage_Call) Return() *PolarStateDB_SetStorage_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetStorage_Call) RunAndReturn(run func(common.Address, map[common.Hash]common.Hash)) *PolarStateDB_SetStorage_Call { + _c.Call.Return(run) + return _c +} + +// SetTransientState provides a mock function with given fields: addr, key, value +func (_m *PolarStateDB) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { + _m.Called(addr, key, value) +} + +// PolarStateDB_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState' +type PolarStateDB_SetTransientState_Call struct { + *mock.Call +} + +// SetTransientState is a helper method to define mock.On call +// - addr common.Address +// - key common.Hash +// - value common.Hash +func (_e *PolarStateDB_Expecter) SetTransientState(addr interface{}, key interface{}, value interface{}) *PolarStateDB_SetTransientState_Call { + return &PolarStateDB_SetTransientState_Call{Call: _e.mock.On("SetTransientState", addr, key, value)} +} + +func (_c *PolarStateDB_SetTransientState_Call) Run(run func(addr common.Address, key common.Hash, value common.Hash)) *PolarStateDB_SetTransientState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_SetTransientState_Call) Return() *PolarStateDB_SetTransientState_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *PolarStateDB_SetTransientState_Call { + _c.Call.Return(run) + return _c +} + +// SetTxContext provides a mock function with given fields: thash, ti +func (_m *PolarStateDB) SetTxContext(thash common.Hash, ti int) { + _m.Called(thash, ti) +} + +// PolarStateDB_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext' +type PolarStateDB_SetTxContext_Call struct { + *mock.Call +} + +// SetTxContext is a helper method to define mock.On call +// - thash common.Hash +// - ti int +func (_e *PolarStateDB_Expecter) SetTxContext(thash interface{}, ti interface{}) *PolarStateDB_SetTxContext_Call { + return &PolarStateDB_SetTxContext_Call{Call: _e.mock.On("SetTxContext", thash, ti)} +} + +func (_c *PolarStateDB_SetTxContext_Call) Run(run func(thash common.Hash, ti int)) *PolarStateDB_SetTxContext_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(int)) + }) + return _c +} + +func (_c *PolarStateDB_SetTxContext_Call) Return() *PolarStateDB_SetTxContext_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SetTxContext_Call) RunAndReturn(run func(common.Hash, int)) *PolarStateDB_SetTxContext_Call { + _c.Call.Return(run) + return _c +} + +// SlotInAccessList provides a mock function with given fields: addr, slot +func (_m *PolarStateDB) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { + ret := _m.Called(addr, slot) + + var r0 bool + var r1 bool + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) (bool, bool)); ok { + return rf(addr, slot) + } + if rf, ok := ret.Get(0).(func(common.Address, common.Hash) bool); ok { + r0 = rf(addr, slot) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(common.Address, common.Hash) bool); ok { + r1 = rf(addr, slot) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// PolarStateDB_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList' +type PolarStateDB_SlotInAccessList_Call struct { + *mock.Call +} + +// SlotInAccessList is a helper method to define mock.On call +// - addr common.Address +// - slot common.Hash +func (_e *PolarStateDB_Expecter) SlotInAccessList(addr interface{}, slot interface{}) *PolarStateDB_SlotInAccessList_Call { + return &PolarStateDB_SlotInAccessList_Call{Call: _e.mock.On("SlotInAccessList", addr, slot)} +} + +func (_c *PolarStateDB_SlotInAccessList_Call) Run(run func(addr common.Address, slot common.Hash)) *PolarStateDB_SlotInAccessList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(common.Hash)) + }) + return _c +} + +func (_c *PolarStateDB_SlotInAccessList_Call) Return(addressOk bool, slotOk bool) *PolarStateDB_SlotInAccessList_Call { + _c.Call.Return(addressOk, slotOk) + return _c +} + +func (_c *PolarStateDB_SlotInAccessList_Call) RunAndReturn(run func(common.Address, common.Hash) (bool, bool)) *PolarStateDB_SlotInAccessList_Call { + _c.Call.Return(run) + return _c +} + +// Snapshot provides a mock function with given fields: +func (_m *PolarStateDB) Snapshot() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// PolarStateDB_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot' +type PolarStateDB_Snapshot_Call struct { + *mock.Call +} + +// Snapshot is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) Snapshot() *PolarStateDB_Snapshot_Call { + return &PolarStateDB_Snapshot_Call{Call: _e.mock.On("Snapshot")} +} + +func (_c *PolarStateDB_Snapshot_Call) Run(run func()) *PolarStateDB_Snapshot_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_Snapshot_Call) Return(_a0 int) *PolarStateDB_Snapshot_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_Snapshot_Call) RunAndReturn(run func() int) *PolarStateDB_Snapshot_Call { + _c.Call.Return(run) + return _c +} + +// StartPrefetcher provides a mock function with given fields: namespace +func (_m *PolarStateDB) StartPrefetcher(namespace string) { + _m.Called(namespace) +} + +// PolarStateDB_StartPrefetcher_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StartPrefetcher' +type PolarStateDB_StartPrefetcher_Call struct { + *mock.Call +} + +// StartPrefetcher is a helper method to define mock.On call +// - namespace string +func (_e *PolarStateDB_Expecter) StartPrefetcher(namespace interface{}) *PolarStateDB_StartPrefetcher_Call { + return &PolarStateDB_StartPrefetcher_Call{Call: _e.mock.On("StartPrefetcher", namespace)} +} + +func (_c *PolarStateDB_StartPrefetcher_Call) Run(run func(namespace string)) *PolarStateDB_StartPrefetcher_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *PolarStateDB_StartPrefetcher_Call) Return() *PolarStateDB_StartPrefetcher_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_StartPrefetcher_Call) RunAndReturn(run func(string)) *PolarStateDB_StartPrefetcher_Call { + _c.Call.Return(run) + return _c +} + +// StopPrefetcher provides a mock function with given fields: +func (_m *PolarStateDB) StopPrefetcher() { + _m.Called() +} + +// PolarStateDB_StopPrefetcher_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StopPrefetcher' +type PolarStateDB_StopPrefetcher_Call struct { + *mock.Call +} + +// StopPrefetcher is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) StopPrefetcher() *PolarStateDB_StopPrefetcher_Call { + return &PolarStateDB_StopPrefetcher_Call{Call: _e.mock.On("StopPrefetcher")} +} + +func (_c *PolarStateDB_StopPrefetcher_Call) Run(run func()) *PolarStateDB_StopPrefetcher_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_StopPrefetcher_Call) Return() *PolarStateDB_StopPrefetcher_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_StopPrefetcher_Call) RunAndReturn(run func()) *PolarStateDB_StopPrefetcher_Call { + _c.Call.Return(run) + return _c +} + +// SubBalance provides a mock function with given fields: _a0, _a1 +func (_m *PolarStateDB) SubBalance(_a0 common.Address, _a1 *big.Int) { + _m.Called(_a0, _a1) +} + +// PolarStateDB_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance' +type PolarStateDB_SubBalance_Call struct { + *mock.Call +} + +// SubBalance is a helper method to define mock.On call +// - _a0 common.Address +// - _a1 *big.Int +func (_e *PolarStateDB_Expecter) SubBalance(_a0 interface{}, _a1 interface{}) *PolarStateDB_SubBalance_Call { + return &PolarStateDB_SubBalance_Call{Call: _e.mock.On("SubBalance", _a0, _a1)} +} + +func (_c *PolarStateDB_SubBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *PolarStateDB_SubBalance_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Address), args[1].(*big.Int)) + }) + return _c +} + +func (_c *PolarStateDB_SubBalance_Call) Return() *PolarStateDB_SubBalance_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SubBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *PolarStateDB_SubBalance_Call { + _c.Call.Return(run) + return _c +} + +// SubRefund provides a mock function with given fields: _a0 +func (_m *PolarStateDB) SubRefund(_a0 uint64) { + _m.Called(_a0) +} + +// PolarStateDB_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund' +type PolarStateDB_SubRefund_Call struct { + *mock.Call +} + +// SubRefund is a helper method to define mock.On call +// - _a0 uint64 +func (_e *PolarStateDB_Expecter) SubRefund(_a0 interface{}) *PolarStateDB_SubRefund_Call { + return &PolarStateDB_SubRefund_Call{Call: _e.mock.On("SubRefund", _a0)} +} + +func (_c *PolarStateDB_SubRefund_Call) Run(run func(_a0 uint64)) *PolarStateDB_SubRefund_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *PolarStateDB_SubRefund_Call) Return() *PolarStateDB_SubRefund_Call { + _c.Call.Return() + return _c +} + +func (_c *PolarStateDB_SubRefund_Call) RunAndReturn(run func(uint64)) *PolarStateDB_SubRefund_Call { + _c.Call.Return(run) + return _c +} + +// TxIndex provides a mock function with given fields: +func (_m *PolarStateDB) TxIndex() int { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// PolarStateDB_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex' +type PolarStateDB_TxIndex_Call struct { + *mock.Call +} + +// TxIndex is a helper method to define mock.On call +func (_e *PolarStateDB_Expecter) TxIndex() *PolarStateDB_TxIndex_Call { + return &PolarStateDB_TxIndex_Call{Call: _e.mock.On("TxIndex")} +} + +func (_c *PolarStateDB_TxIndex_Call) Run(run func()) *PolarStateDB_TxIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *PolarStateDB_TxIndex_Call) Return(_a0 int) *PolarStateDB_TxIndex_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *PolarStateDB_TxIndex_Call) RunAndReturn(run func() int) *PolarStateDB_TxIndex_Call { + _c.Call.Return(run) + return _c +} + +// NewPolarStateDB creates a new instance of PolarStateDB. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewPolarStateDB(t interface { + mock.TestingT + Cleanup(func()) +}) *PolarStateDB { + mock := &PolarStateDB{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index e95e76ac67..00a8851f82 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -13,7 +13,7 @@ import ( vm "github.com/ethereum/go-ethereum/core/vm" ) -// PrecompilePlugin is an autogenerated mock type for the PrecompilePlugin type. +// PrecompilePlugin is an autogenerated mock type for the PrecompilePlugin type type PrecompilePlugin struct { mock.Mock } @@ -26,12 +26,12 @@ func (_m *PrecompilePlugin) EXPECT() *PrecompilePlugin_Expecter { return &PrecompilePlugin_Expecter{mock: &_m.Mock} } -// DisableReentrancy provides a mock function with given fields: _a0. +// DisableReentrancy provides a mock function with given fields: _a0 func (_m *PrecompilePlugin) DisableReentrancy(_a0 vm.PrecompileEVM) { _m.Called(_a0) } -// PrecompilePlugin_DisableReentrancy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DisableReentrancy'. +// PrecompilePlugin_DisableReentrancy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DisableReentrancy' type PrecompilePlugin_DisableReentrancy_Call struct { *mock.Call } @@ -59,12 +59,12 @@ func (_c *PrecompilePlugin_DisableReentrancy_Call) RunAndReturn(run func(vm.Prec return _c } -// EnableReentrancy provides a mock function with given fields: _a0. +// EnableReentrancy provides a mock function with given fields: _a0 func (_m *PrecompilePlugin) EnableReentrancy(_a0 vm.PrecompileEVM) { _m.Called(_a0) } -// PrecompilePlugin_EnableReentrancy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnableReentrancy'. +// PrecompilePlugin_EnableReentrancy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnableReentrancy' type PrecompilePlugin_EnableReentrancy_Call struct { *mock.Call } @@ -92,7 +92,7 @@ func (_c *PrecompilePlugin_EnableReentrancy_Call) RunAndReturn(run func(vm.Preco return _c } -// Get provides a mock function with given fields: addr, rules. +// Get provides a mock function with given fields: addr, rules func (_m *PrecompilePlugin) Get(addr common.Address, rules *params.Rules) (vm.PrecompiledContract, bool) { ret := _m.Called(addr, rules) @@ -118,7 +118,7 @@ func (_m *PrecompilePlugin) Get(addr common.Address, rules *params.Rules) (vm.Pr return r0, r1 } -// PrecompilePlugin_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get'. +// PrecompilePlugin_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' type PrecompilePlugin_Get_Call struct { *mock.Call } @@ -147,7 +147,7 @@ func (_c *PrecompilePlugin_Get_Call) RunAndReturn(run func(common.Address, *para return _c } -// GetActive provides a mock function with given fields: _a0. +// GetActive provides a mock function with given fields: _a0 func (_m *PrecompilePlugin) GetActive(_a0 params.Rules) []common.Address { ret := _m.Called(_a0) @@ -163,7 +163,7 @@ func (_m *PrecompilePlugin) GetActive(_a0 params.Rules) []common.Address { return r0 } -// PrecompilePlugin_GetActive_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetActive'. +// PrecompilePlugin_GetActive_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetActive' type PrecompilePlugin_GetActive_Call struct { *mock.Call } @@ -191,7 +191,7 @@ func (_c *PrecompilePlugin_GetActive_Call) RunAndReturn(run func(params.Rules) [ return _c } -// Register provides a mock function with given fields: _a0. +// Register provides a mock function with given fields: _a0 func (_m *PrecompilePlugin) Register(_a0 vm.PrecompiledContract) error { ret := _m.Called(_a0) @@ -205,7 +205,7 @@ func (_m *PrecompilePlugin) Register(_a0 vm.PrecompiledContract) error { return r0 } -// PrecompilePlugin_Register_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Register'. +// PrecompilePlugin_Register_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Register' type PrecompilePlugin_Register_Call struct { *mock.Call } @@ -233,7 +233,7 @@ func (_c *PrecompilePlugin_Register_Call) RunAndReturn(run func(vm.PrecompiledCo return _c } -// Run provides a mock function with given fields: evm, p, input, caller, value, suppliedGas, readonly. +// Run provides a mock function with given fields: evm, p, input, caller, value, suppliedGas, readonly func (_m *PrecompilePlugin) Run(evm vm.PrecompileEVM, p vm.PrecompiledContract, input []byte, caller common.Address, value *big.Int, suppliedGas uint64, readonly bool) ([]byte, uint64, error) { ret := _m.Called(evm, p, input, caller, value, suppliedGas, readonly) @@ -266,7 +266,7 @@ func (_m *PrecompilePlugin) Run(evm vm.PrecompileEVM, p vm.PrecompiledContract, return r0, r1, r2 } -// PrecompilePlugin_Run_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Run'. +// PrecompilePlugin_Run_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Run' type PrecompilePlugin_Run_Call struct { *mock.Call } From 7edaa19510e1ac9b60706240f076307741864e27 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 5 Oct 2023 23:12:14 -0400 Subject: [PATCH 067/122] chore(mocks): regenerate and clean mocks --- cosmos/txpool/mocks/handler.go | 114 -- eth/core/state/mocks/state_db.go | 2221 ------------------------------ eth/core/state/state_test.go | 33 - eth/core/state/statedb_test.go | 6 + 4 files changed, 6 insertions(+), 2368 deletions(-) delete mode 100644 cosmos/txpool/mocks/handler.go delete mode 100644 eth/core/state/mocks/state_db.go delete mode 100644 eth/core/state/state_test.go diff --git a/cosmos/txpool/mocks/handler.go b/cosmos/txpool/mocks/handler.go deleted file mode 100644 index 3293b8f743..0000000000 --- a/cosmos/txpool/mocks/handler.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// Handler is an autogenerated mock type for the Handler type. -type Handler struct { - mock.Mock -} - -type Handler_Expecter struct { - mock *mock.Mock -} - -func (_m *Handler) EXPECT() *Handler_Expecter { - return &Handler_Expecter{mock: &_m.Mock} -} - -// Start provides a mock function with given fields:. -func (_m *Handler) Start() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Handler_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'. -type Handler_Start_Call struct { - *mock.Call -} - -// Start is a helper method to define mock.On call. -func (_e *Handler_Expecter) Start() *Handler_Start_Call { - return &Handler_Start_Call{Call: _e.mock.On("Start")} -} - -func (_c *Handler_Start_Call) Run(run func()) *Handler_Start_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Handler_Start_Call) Return(_a0 error) *Handler_Start_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *Handler_Start_Call) RunAndReturn(run func() error) *Handler_Start_Call { - _c.Call.Return(run) - return _c -} - -// Stop provides a mock function with given fields:. -func (_m *Handler) Stop() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Handler_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop'. -type Handler_Stop_Call struct { - *mock.Call -} - -// Stop is a helper method to define mock.On call. -func (_e *Handler_Expecter) Stop() *Handler_Stop_Call { - return &Handler_Stop_Call{Call: _e.mock.On("Stop")} -} - -func (_c *Handler_Stop_Call) Run(run func()) *Handler_Stop_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Handler_Stop_Call) Return(_a0 error) *Handler_Stop_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *Handler_Stop_Call) RunAndReturn(run func() error) *Handler_Stop_Call { - _c.Call.Return(run) - return _c -} - -// NewHandler creates a new instance of Handler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewHandler(t interface { - mock.TestingT - Cleanup(func()) -}) *Handler { - mock := &Handler{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/eth/core/state/mocks/state_db.go b/eth/core/state/mocks/state_db.go deleted file mode 100644 index 061b7a39b2..0000000000 --- a/eth/core/state/mocks/state_db.go +++ /dev/null @@ -1,2221 +0,0 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. - -package mocks - -import ( - context "context" - big "math/big" - - common "github.com/ethereum/go-ethereum/common" - - corestate "github.com/ethereum/go-ethereum/core/state" - - mock "github.com/stretchr/testify/mock" - - params "github.com/ethereum/go-ethereum/params" - - types "github.com/ethereum/go-ethereum/core/types" -) - -// StateDB is an autogenerated mock type for the StateDB type. -type StateDB struct { - mock.Mock -} - -type StateDB_Expecter struct { - mock *mock.Mock -} - -func (_m *StateDB) EXPECT() *StateDB_Expecter { - return &StateDB_Expecter{mock: &_m.Mock} -} - -// AddAddressToAccessList provides a mock function with given fields: addr. -func (_m *StateDB) AddAddressToAccessList(addr common.Address) { - _m.Called(addr) -} - -// StateDB_AddAddressToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddAddressToAccessList'. -type StateDB_AddAddressToAccessList_Call struct { - *mock.Call -} - -// AddAddressToAccessList is a helper method to define mock.On call -// - addr common.Address -func (_e *StateDB_Expecter) AddAddressToAccessList(addr interface{}) *StateDB_AddAddressToAccessList_Call { - return &StateDB_AddAddressToAccessList_Call{Call: _e.mock.On("AddAddressToAccessList", addr)} -} - -func (_c *StateDB_AddAddressToAccessList_Call) Run(run func(addr common.Address)) *StateDB_AddAddressToAccessList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_AddAddressToAccessList_Call) Return() *StateDB_AddAddressToAccessList_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_AddAddressToAccessList_Call) RunAndReturn(run func(common.Address)) *StateDB_AddAddressToAccessList_Call { - _c.Call.Return(run) - return _c -} - -// AddBalance provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) AddBalance(_a0 common.Address, _a1 *big.Int) { - _m.Called(_a0, _a1) -} - -// StateDB_AddBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBalance'. -type StateDB_AddBalance_Call struct { - *mock.Call -} - -// AddBalance is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 *big.Int -func (_e *StateDB_Expecter) AddBalance(_a0 interface{}, _a1 interface{}) *StateDB_AddBalance_Call { - return &StateDB_AddBalance_Call{Call: _e.mock.On("AddBalance", _a0, _a1)} -} - -func (_c *StateDB_AddBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *StateDB_AddBalance_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(*big.Int)) - }) - return _c -} - -func (_c *StateDB_AddBalance_Call) Return() *StateDB_AddBalance_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_AddBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *StateDB_AddBalance_Call { - _c.Call.Return(run) - return _c -} - -// AddLog provides a mock function with given fields: _a0. -func (_m *StateDB) AddLog(_a0 *types.Log) { - _m.Called(_a0) -} - -// StateDB_AddLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddLog'. -type StateDB_AddLog_Call struct { - *mock.Call -} - -// AddLog is a helper method to define mock.On call -// - _a0 *types.Log -func (_e *StateDB_Expecter) AddLog(_a0 interface{}) *StateDB_AddLog_Call { - return &StateDB_AddLog_Call{Call: _e.mock.On("AddLog", _a0)} -} - -func (_c *StateDB_AddLog_Call) Run(run func(_a0 *types.Log)) *StateDB_AddLog_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*types.Log)) - }) - return _c -} - -func (_c *StateDB_AddLog_Call) Return() *StateDB_AddLog_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_AddLog_Call) RunAndReturn(run func(*types.Log)) *StateDB_AddLog_Call { - _c.Call.Return(run) - return _c -} - -// AddPreimage provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) AddPreimage(_a0 common.Hash, _a1 []byte) { - _m.Called(_a0, _a1) -} - -// StateDB_AddPreimage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPreimage'. -type StateDB_AddPreimage_Call struct { - *mock.Call -} - -// AddPreimage is a helper method to define mock.On call -// - _a0 common.Hash -// - _a1 []byte -func (_e *StateDB_Expecter) AddPreimage(_a0 interface{}, _a1 interface{}) *StateDB_AddPreimage_Call { - return &StateDB_AddPreimage_Call{Call: _e.mock.On("AddPreimage", _a0, _a1)} -} - -func (_c *StateDB_AddPreimage_Call) Run(run func(_a0 common.Hash, _a1 []byte)) *StateDB_AddPreimage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Hash), args[1].([]byte)) - }) - return _c -} - -func (_c *StateDB_AddPreimage_Call) Return() *StateDB_AddPreimage_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_AddPreimage_Call) RunAndReturn(run func(common.Hash, []byte)) *StateDB_AddPreimage_Call { - _c.Call.Return(run) - return _c -} - -// AddRefund provides a mock function with given fields: _a0. -func (_m *StateDB) AddRefund(_a0 uint64) { - _m.Called(_a0) -} - -// StateDB_AddRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRefund'. -type StateDB_AddRefund_Call struct { - *mock.Call -} - -// AddRefund is a helper method to define mock.On call -// - _a0 uint64 -func (_e *StateDB_Expecter) AddRefund(_a0 interface{}) *StateDB_AddRefund_Call { - return &StateDB_AddRefund_Call{Call: _e.mock.On("AddRefund", _a0)} -} - -func (_c *StateDB_AddRefund_Call) Run(run func(_a0 uint64)) *StateDB_AddRefund_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(uint64)) - }) - return _c -} - -func (_c *StateDB_AddRefund_Call) Return() *StateDB_AddRefund_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_AddRefund_Call) RunAndReturn(run func(uint64)) *StateDB_AddRefund_Call { - _c.Call.Return(run) - return _c -} - -// AddSlotToAccessList provides a mock function with given fields: addr, slot. -func (_m *StateDB) AddSlotToAccessList(addr common.Address, slot common.Hash) { - _m.Called(addr, slot) -} - -// StateDB_AddSlotToAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSlotToAccessList'. -type StateDB_AddSlotToAccessList_Call struct { - *mock.Call -} - -// AddSlotToAccessList is a helper method to define mock.On call -// - addr common.Address -// - slot common.Hash -func (_e *StateDB_Expecter) AddSlotToAccessList(addr interface{}, slot interface{}) *StateDB_AddSlotToAccessList_Call { - return &StateDB_AddSlotToAccessList_Call{Call: _e.mock.On("AddSlotToAccessList", addr, slot)} -} - -func (_c *StateDB_AddSlotToAccessList_Call) Run(run func(addr common.Address, slot common.Hash)) *StateDB_AddSlotToAccessList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_AddSlotToAccessList_Call) Return() *StateDB_AddSlotToAccessList_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_AddSlotToAccessList_Call) RunAndReturn(run func(common.Address, common.Hash)) *StateDB_AddSlotToAccessList_Call { - _c.Call.Return(run) - return _c -} - -// AddressInAccessList provides a mock function with given fields: addr. -func (_m *StateDB) AddressInAccessList(addr common.Address) bool { - ret := _m.Called(addr) - - var r0 bool - if rf, ok := ret.Get(0).(func(common.Address) bool); ok { - r0 = rf(addr) - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// StateDB_AddressInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddressInAccessList'. -type StateDB_AddressInAccessList_Call struct { - *mock.Call -} - -// AddressInAccessList is a helper method to define mock.On call -// - addr common.Address -func (_e *StateDB_Expecter) AddressInAccessList(addr interface{}) *StateDB_AddressInAccessList_Call { - return &StateDB_AddressInAccessList_Call{Call: _e.mock.On("AddressInAccessList", addr)} -} - -func (_c *StateDB_AddressInAccessList_Call) Run(run func(addr common.Address)) *StateDB_AddressInAccessList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_AddressInAccessList_Call) Return(_a0 bool) *StateDB_AddressInAccessList_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_AddressInAccessList_Call) RunAndReturn(run func(common.Address) bool) *StateDB_AddressInAccessList_Call { - _c.Call.Return(run) - return _c -} - -// Commit provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) Commit(_a0 uint64, _a1 bool) (common.Hash, error) { - ret := _m.Called(_a0, _a1) - - var r0 common.Hash - var r1 error - if rf, ok := ret.Get(0).(func(uint64, bool) (common.Hash, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(uint64, bool) common.Hash); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - if rf, ok := ret.Get(1).(func(uint64, bool) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// StateDB_Commit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Commit'. -type StateDB_Commit_Call struct { - *mock.Call -} - -// Commit is a helper method to define mock.On call -// - _a0 uint64 -// - _a1 bool -func (_e *StateDB_Expecter) Commit(_a0 interface{}, _a1 interface{}) *StateDB_Commit_Call { - return &StateDB_Commit_Call{Call: _e.mock.On("Commit", _a0, _a1)} -} - -func (_c *StateDB_Commit_Call) Run(run func(_a0 uint64, _a1 bool)) *StateDB_Commit_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(uint64), args[1].(bool)) - }) - return _c -} - -func (_c *StateDB_Commit_Call) Return(_a0 common.Hash, _a1 error) *StateDB_Commit_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *StateDB_Commit_Call) RunAndReturn(run func(uint64, bool) (common.Hash, error)) *StateDB_Commit_Call { - _c.Call.Return(run) - return _c -} - -// Copy provides a mock function with given fields:. -func (_m *StateDB) Copy() corestate.StateDBI { - ret := _m.Called() - - var r0 corestate.StateDBI - if rf, ok := ret.Get(0).(func() corestate.StateDBI); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(corestate.StateDBI) - } - } - - return r0 -} - -// StateDB_Copy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Copy'. -type StateDB_Copy_Call struct { - *mock.Call -} - -// Copy is a helper method to define mock.On call. -func (_e *StateDB_Expecter) Copy() *StateDB_Copy_Call { - return &StateDB_Copy_Call{Call: _e.mock.On("Copy")} -} - -func (_c *StateDB_Copy_Call) Run(run func()) *StateDB_Copy_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_Copy_Call) Return(_a0 corestate.StateDBI) *StateDB_Copy_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Copy_Call) RunAndReturn(run func() corestate.StateDBI) *StateDB_Copy_Call { - _c.Call.Return(run) - return _c -} - -// CreateAccount provides a mock function with given fields: _a0. -func (_m *StateDB) CreateAccount(_a0 common.Address) { - _m.Called(_a0) -} - -// StateDB_CreateAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateAccount'. -type StateDB_CreateAccount_Call struct { - *mock.Call -} - -// CreateAccount is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) CreateAccount(_a0 interface{}) *StateDB_CreateAccount_Call { - return &StateDB_CreateAccount_Call{Call: _e.mock.On("CreateAccount", _a0)} -} - -func (_c *StateDB_CreateAccount_Call) Run(run func(_a0 common.Address)) *StateDB_CreateAccount_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_CreateAccount_Call) Return() *StateDB_CreateAccount_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_CreateAccount_Call) RunAndReturn(run func(common.Address)) *StateDB_CreateAccount_Call { - _c.Call.Return(run) - return _c -} - -// Database provides a mock function with given fields:. -func (_m *StateDB) Database() corestate.Database { - ret := _m.Called() - - var r0 corestate.Database - if rf, ok := ret.Get(0).(func() corestate.Database); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(corestate.Database) - } - } - - return r0 -} - -// StateDB_Database_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Database'. -type StateDB_Database_Call struct { - *mock.Call -} - -// Database is a helper method to define mock.On call. -func (_e *StateDB_Expecter) Database() *StateDB_Database_Call { - return &StateDB_Database_Call{Call: _e.mock.On("Database")} -} - -func (_c *StateDB_Database_Call) Run(run func()) *StateDB_Database_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_Database_Call) Return(_a0 corestate.Database) *StateDB_Database_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Database_Call) RunAndReturn(run func() corestate.Database) *StateDB_Database_Call { - _c.Call.Return(run) - return _c -} - -// Dump provides a mock function with given fields: opts. -func (_m *StateDB) Dump(opts *corestate.DumpConfig) []byte { - ret := _m.Called(opts) - - var r0 []byte - if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) []byte); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]byte) - } - } - - return r0 -} - -// StateDB_Dump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Dump'. -type StateDB_Dump_Call struct { - *mock.Call -} - -// Dump is a helper method to define mock.On call -// - opts *corestate.DumpConfig -func (_e *StateDB_Expecter) Dump(opts interface{}) *StateDB_Dump_Call { - return &StateDB_Dump_Call{Call: _e.mock.On("Dump", opts)} -} - -func (_c *StateDB_Dump_Call) Run(run func(opts *corestate.DumpConfig)) *StateDB_Dump_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*corestate.DumpConfig)) - }) - return _c -} - -func (_c *StateDB_Dump_Call) Return(_a0 []byte) *StateDB_Dump_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Dump_Call) RunAndReturn(run func(*corestate.DumpConfig) []byte) *StateDB_Dump_Call { - _c.Call.Return(run) - return _c -} - -// DumpToCollector provides a mock function with given fields: c, conf. -func (_m *StateDB) DumpToCollector(c corestate.DumpCollector, conf *corestate.DumpConfig) []byte { - ret := _m.Called(c, conf) - - var r0 []byte - if rf, ok := ret.Get(0).(func(corestate.DumpCollector, *corestate.DumpConfig) []byte); ok { - r0 = rf(c, conf) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]byte) - } - } - - return r0 -} - -// StateDB_DumpToCollector_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DumpToCollector'. -type StateDB_DumpToCollector_Call struct { - *mock.Call -} - -// DumpToCollector is a helper method to define mock.On call -// - c corestate.DumpCollector -// - conf *corestate.DumpConfig -func (_e *StateDB_Expecter) DumpToCollector(c interface{}, conf interface{}) *StateDB_DumpToCollector_Call { - return &StateDB_DumpToCollector_Call{Call: _e.mock.On("DumpToCollector", c, conf)} -} - -func (_c *StateDB_DumpToCollector_Call) Run(run func(c corestate.DumpCollector, conf *corestate.DumpConfig)) *StateDB_DumpToCollector_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(corestate.DumpCollector), args[1].(*corestate.DumpConfig)) - }) - return _c -} - -func (_c *StateDB_DumpToCollector_Call) Return(nextKey []byte) *StateDB_DumpToCollector_Call { - _c.Call.Return(nextKey) - return _c -} - -func (_c *StateDB_DumpToCollector_Call) RunAndReturn(run func(corestate.DumpCollector, *corestate.DumpConfig) []byte) *StateDB_DumpToCollector_Call { - _c.Call.Return(run) - return _c -} - -// Empty provides a mock function with given fields: _a0. -func (_m *StateDB) Empty(_a0 common.Address) bool { - ret := _m.Called(_a0) - - var r0 bool - if rf, ok := ret.Get(0).(func(common.Address) bool); ok { - r0 = rf(_a0) - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// StateDB_Empty_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Empty'. -type StateDB_Empty_Call struct { - *mock.Call -} - -// Empty is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) Empty(_a0 interface{}) *StateDB_Empty_Call { - return &StateDB_Empty_Call{Call: _e.mock.On("Empty", _a0)} -} - -func (_c *StateDB_Empty_Call) Run(run func(_a0 common.Address)) *StateDB_Empty_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_Empty_Call) Return(_a0 bool) *StateDB_Empty_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Empty_Call) RunAndReturn(run func(common.Address) bool) *StateDB_Empty_Call { - _c.Call.Return(run) - return _c -} - -// Error provides a mock function with given fields:. -func (_m *StateDB) Error() error { - ret := _m.Called() - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// StateDB_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error'. -type StateDB_Error_Call struct { - *mock.Call -} - -// Error is a helper method to define mock.On call. -func (_e *StateDB_Expecter) Error() *StateDB_Error_Call { - return &StateDB_Error_Call{Call: _e.mock.On("Error")} -} - -func (_c *StateDB_Error_Call) Run(run func()) *StateDB_Error_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_Error_Call) Return(_a0 error) *StateDB_Error_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Error_Call) RunAndReturn(run func() error) *StateDB_Error_Call { - _c.Call.Return(run) - return _c -} - -// Exist provides a mock function with given fields: _a0. -func (_m *StateDB) Exist(_a0 common.Address) bool { - ret := _m.Called(_a0) - - var r0 bool - if rf, ok := ret.Get(0).(func(common.Address) bool); ok { - r0 = rf(_a0) - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// StateDB_Exist_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exist'. -type StateDB_Exist_Call struct { - *mock.Call -} - -// Exist is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) Exist(_a0 interface{}) *StateDB_Exist_Call { - return &StateDB_Exist_Call{Call: _e.mock.On("Exist", _a0)} -} - -func (_c *StateDB_Exist_Call) Run(run func(_a0 common.Address)) *StateDB_Exist_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_Exist_Call) Return(_a0 bool) *StateDB_Exist_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Exist_Call) RunAndReturn(run func(common.Address) bool) *StateDB_Exist_Call { - _c.Call.Return(run) - return _c -} - -// Finalise provides a mock function with given fields: deleteEmptyObjects. -func (_m *StateDB) Finalise(deleteEmptyObjects bool) { - _m.Called(deleteEmptyObjects) -} - -// StateDB_Finalise_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Finalise'. -type StateDB_Finalise_Call struct { - *mock.Call -} - -// Finalise is a helper method to define mock.On call -// - deleteEmptyObjects bool -func (_e *StateDB_Expecter) Finalise(deleteEmptyObjects interface{}) *StateDB_Finalise_Call { - return &StateDB_Finalise_Call{Call: _e.mock.On("Finalise", deleteEmptyObjects)} -} - -func (_c *StateDB_Finalise_Call) Run(run func(deleteEmptyObjects bool)) *StateDB_Finalise_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(bool)) - }) - return _c -} - -func (_c *StateDB_Finalise_Call) Return() *StateDB_Finalise_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_Finalise_Call) RunAndReturn(run func(bool)) *StateDB_Finalise_Call { - _c.Call.Return(run) - return _c -} - -// GetBalance provides a mock function with given fields: _a0. -func (_m *StateDB) GetBalance(_a0 common.Address) *big.Int { - ret := _m.Called(_a0) - - var r0 *big.Int - if rf, ok := ret.Get(0).(func(common.Address) *big.Int); ok { - r0 = rf(_a0) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - return r0 -} - -// StateDB_GetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBalance'. -type StateDB_GetBalance_Call struct { - *mock.Call -} - -// GetBalance is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) GetBalance(_a0 interface{}) *StateDB_GetBalance_Call { - return &StateDB_GetBalance_Call{Call: _e.mock.On("GetBalance", _a0)} -} - -func (_c *StateDB_GetBalance_Call) Run(run func(_a0 common.Address)) *StateDB_GetBalance_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetBalance_Call) Return(_a0 *big.Int) *StateDB_GetBalance_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetBalance_Call) RunAndReturn(run func(common.Address) *big.Int) *StateDB_GetBalance_Call { - _c.Call.Return(run) - return _c -} - -// GetCode provides a mock function with given fields: _a0. -func (_m *StateDB) GetCode(_a0 common.Address) []byte { - ret := _m.Called(_a0) - - var r0 []byte - if rf, ok := ret.Get(0).(func(common.Address) []byte); ok { - r0 = rf(_a0) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]byte) - } - } - - return r0 -} - -// StateDB_GetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCode'. -type StateDB_GetCode_Call struct { - *mock.Call -} - -// GetCode is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) GetCode(_a0 interface{}) *StateDB_GetCode_Call { - return &StateDB_GetCode_Call{Call: _e.mock.On("GetCode", _a0)} -} - -func (_c *StateDB_GetCode_Call) Run(run func(_a0 common.Address)) *StateDB_GetCode_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetCode_Call) Return(_a0 []byte) *StateDB_GetCode_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetCode_Call) RunAndReturn(run func(common.Address) []byte) *StateDB_GetCode_Call { - _c.Call.Return(run) - return _c -} - -// GetCodeHash provides a mock function with given fields: _a0. -func (_m *StateDB) GetCodeHash(_a0 common.Address) common.Hash { - ret := _m.Called(_a0) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { - r0 = rf(_a0) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// StateDB_GetCodeHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeHash'. -type StateDB_GetCodeHash_Call struct { - *mock.Call -} - -// GetCodeHash is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) GetCodeHash(_a0 interface{}) *StateDB_GetCodeHash_Call { - return &StateDB_GetCodeHash_Call{Call: _e.mock.On("GetCodeHash", _a0)} -} - -func (_c *StateDB_GetCodeHash_Call) Run(run func(_a0 common.Address)) *StateDB_GetCodeHash_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetCodeHash_Call) Return(_a0 common.Hash) *StateDB_GetCodeHash_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetCodeHash_Call) RunAndReturn(run func(common.Address) common.Hash) *StateDB_GetCodeHash_Call { - _c.Call.Return(run) - return _c -} - -// GetCodeSize provides a mock function with given fields: _a0. -func (_m *StateDB) GetCodeSize(_a0 common.Address) int { - ret := _m.Called(_a0) - - var r0 int - if rf, ok := ret.Get(0).(func(common.Address) int); ok { - r0 = rf(_a0) - } else { - r0 = ret.Get(0).(int) - } - - return r0 -} - -// StateDB_GetCodeSize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCodeSize'. -type StateDB_GetCodeSize_Call struct { - *mock.Call -} - -// GetCodeSize is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) GetCodeSize(_a0 interface{}) *StateDB_GetCodeSize_Call { - return &StateDB_GetCodeSize_Call{Call: _e.mock.On("GetCodeSize", _a0)} -} - -func (_c *StateDB_GetCodeSize_Call) Run(run func(_a0 common.Address)) *StateDB_GetCodeSize_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetCodeSize_Call) Return(_a0 int) *StateDB_GetCodeSize_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetCodeSize_Call) RunAndReturn(run func(common.Address) int) *StateDB_GetCodeSize_Call { - _c.Call.Return(run) - return _c -} - -// GetCommittedState provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) GetCommittedState(_a0 common.Address, _a1 common.Hash) common.Hash { - ret := _m.Called(_a0, _a1) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// StateDB_GetCommittedState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommittedState'. -type StateDB_GetCommittedState_Call struct { - *mock.Call -} - -// GetCommittedState is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 common.Hash -func (_e *StateDB_Expecter) GetCommittedState(_a0 interface{}, _a1 interface{}) *StateDB_GetCommittedState_Call { - return &StateDB_GetCommittedState_Call{Call: _e.mock.On("GetCommittedState", _a0, _a1)} -} - -func (_c *StateDB_GetCommittedState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *StateDB_GetCommittedState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_GetCommittedState_Call) Return(_a0 common.Hash) *StateDB_GetCommittedState_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetCommittedState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *StateDB_GetCommittedState_Call { - _c.Call.Return(run) - return _c -} - -// GetContext provides a mock function with given fields:. -func (_m *StateDB) GetContext() context.Context { - ret := _m.Called() - - var r0 context.Context - if rf, ok := ret.Get(0).(func() context.Context); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(context.Context) - } - } - - return r0 -} - -// StateDB_GetContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContext'. -type StateDB_GetContext_Call struct { - *mock.Call -} - -// GetContext is a helper method to define mock.On call. -func (_e *StateDB_Expecter) GetContext() *StateDB_GetContext_Call { - return &StateDB_GetContext_Call{Call: _e.mock.On("GetContext")} -} - -func (_c *StateDB_GetContext_Call) Run(run func()) *StateDB_GetContext_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_GetContext_Call) Return(_a0 context.Context) *StateDB_GetContext_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetContext_Call) RunAndReturn(run func() context.Context) *StateDB_GetContext_Call { - _c.Call.Return(run) - return _c -} - -// GetLogs provides a mock function with given fields: hash, blockNumber, blockHash. -func (_m *StateDB) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { - ret := _m.Called(hash, blockNumber, blockHash) - - var r0 []*types.Log - if rf, ok := ret.Get(0).(func(common.Hash, uint64, common.Hash) []*types.Log); ok { - r0 = rf(hash, blockNumber, blockHash) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*types.Log) - } - } - - return r0 -} - -// StateDB_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs'. -type StateDB_GetLogs_Call struct { - *mock.Call -} - -// GetLogs is a helper method to define mock.On call -// - hash common.Hash -// - blockNumber uint64 -// - blockHash common.Hash -func (_e *StateDB_Expecter) GetLogs(hash interface{}, blockNumber interface{}, blockHash interface{}) *StateDB_GetLogs_Call { - return &StateDB_GetLogs_Call{Call: _e.mock.On("GetLogs", hash, blockNumber, blockHash)} -} - -func (_c *StateDB_GetLogs_Call) Run(run func(hash common.Hash, blockNumber uint64, blockHash common.Hash)) *StateDB_GetLogs_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Hash), args[1].(uint64), args[2].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_GetLogs_Call) Return(_a0 []*types.Log) *StateDB_GetLogs_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetLogs_Call) RunAndReturn(run func(common.Hash, uint64, common.Hash) []*types.Log) *StateDB_GetLogs_Call { - _c.Call.Return(run) - return _c -} - -// GetNonce provides a mock function with given fields: _a0. -func (_m *StateDB) GetNonce(_a0 common.Address) uint64 { - ret := _m.Called(_a0) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(common.Address) uint64); ok { - r0 = rf(_a0) - } else { - r0 = ret.Get(0).(uint64) - } - - return r0 -} - -// StateDB_GetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNonce'. -type StateDB_GetNonce_Call struct { - *mock.Call -} - -// GetNonce is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) GetNonce(_a0 interface{}) *StateDB_GetNonce_Call { - return &StateDB_GetNonce_Call{Call: _e.mock.On("GetNonce", _a0)} -} - -func (_c *StateDB_GetNonce_Call) Run(run func(_a0 common.Address)) *StateDB_GetNonce_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetNonce_Call) Return(_a0 uint64) *StateDB_GetNonce_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetNonce_Call) RunAndReturn(run func(common.Address) uint64) *StateDB_GetNonce_Call { - _c.Call.Return(run) - return _c -} - -// GetOrNewStateObject provides a mock function with given fields: addr. -func (_m *StateDB) GetOrNewStateObject(addr common.Address) *corestate.StateObject { - ret := _m.Called(addr) - - var r0 *corestate.StateObject - if rf, ok := ret.Get(0).(func(common.Address) *corestate.StateObject); ok { - r0 = rf(addr) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*corestate.StateObject) - } - } - - return r0 -} - -// StateDB_GetOrNewStateObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOrNewStateObject'. -type StateDB_GetOrNewStateObject_Call struct { - *mock.Call -} - -// GetOrNewStateObject is a helper method to define mock.On call -// - addr common.Address -func (_e *StateDB_Expecter) GetOrNewStateObject(addr interface{}) *StateDB_GetOrNewStateObject_Call { - return &StateDB_GetOrNewStateObject_Call{Call: _e.mock.On("GetOrNewStateObject", addr)} -} - -func (_c *StateDB_GetOrNewStateObject_Call) Run(run func(addr common.Address)) *StateDB_GetOrNewStateObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetOrNewStateObject_Call) Return(_a0 *corestate.StateObject) *StateDB_GetOrNewStateObject_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetOrNewStateObject_Call) RunAndReturn(run func(common.Address) *corestate.StateObject) *StateDB_GetOrNewStateObject_Call { - _c.Call.Return(run) - return _c -} - -// GetPrecompileManager provides a mock function with given fields:. -func (_m *StateDB) GetPrecompileManager() interface{} { - ret := _m.Called() - - var r0 interface{} - if rf, ok := ret.Get(0).(func() interface{}); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - return r0 -} - -// StateDB_GetPrecompileManager_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPrecompileManager'. -type StateDB_GetPrecompileManager_Call struct { - *mock.Call -} - -// GetPrecompileManager is a helper method to define mock.On call. -func (_e *StateDB_Expecter) GetPrecompileManager() *StateDB_GetPrecompileManager_Call { - return &StateDB_GetPrecompileManager_Call{Call: _e.mock.On("GetPrecompileManager")} -} - -func (_c *StateDB_GetPrecompileManager_Call) Run(run func()) *StateDB_GetPrecompileManager_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_GetPrecompileManager_Call) Return(_a0 interface{}) *StateDB_GetPrecompileManager_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetPrecompileManager_Call) RunAndReturn(run func() interface{}) *StateDB_GetPrecompileManager_Call { - _c.Call.Return(run) - return _c -} - -// GetRefund provides a mock function with given fields:. -func (_m *StateDB) GetRefund() uint64 { - ret := _m.Called() - - var r0 uint64 - if rf, ok := ret.Get(0).(func() uint64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint64) - } - - return r0 -} - -// StateDB_GetRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRefund'. -type StateDB_GetRefund_Call struct { - *mock.Call -} - -// GetRefund is a helper method to define mock.On call. -func (_e *StateDB_Expecter) GetRefund() *StateDB_GetRefund_Call { - return &StateDB_GetRefund_Call{Call: _e.mock.On("GetRefund")} -} - -func (_c *StateDB_GetRefund_Call) Run(run func()) *StateDB_GetRefund_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_GetRefund_Call) Return(_a0 uint64) *StateDB_GetRefund_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetRefund_Call) RunAndReturn(run func() uint64) *StateDB_GetRefund_Call { - _c.Call.Return(run) - return _c -} - -// GetState provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) GetState(_a0 common.Address, _a1 common.Hash) common.Hash { - ret := _m.Called(_a0, _a1) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// StateDB_GetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetState'. -type StateDB_GetState_Call struct { - *mock.Call -} - -// GetState is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 common.Hash -func (_e *StateDB_Expecter) GetState(_a0 interface{}, _a1 interface{}) *StateDB_GetState_Call { - return &StateDB_GetState_Call{Call: _e.mock.On("GetState", _a0, _a1)} -} - -func (_c *StateDB_GetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash)) *StateDB_GetState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_GetState_Call) Return(_a0 common.Hash) *StateDB_GetState_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *StateDB_GetState_Call { - _c.Call.Return(run) - return _c -} - -// GetStorageRoot provides a mock function with given fields: addr. -func (_m *StateDB) GetStorageRoot(addr common.Address) common.Hash { - ret := _m.Called(addr) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(common.Address) common.Hash); ok { - r0 = rf(addr) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// StateDB_GetStorageRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetStorageRoot'. -type StateDB_GetStorageRoot_Call struct { - *mock.Call -} - -// GetStorageRoot is a helper method to define mock.On call -// - addr common.Address -func (_e *StateDB_Expecter) GetStorageRoot(addr interface{}) *StateDB_GetStorageRoot_Call { - return &StateDB_GetStorageRoot_Call{Call: _e.mock.On("GetStorageRoot", addr)} -} - -func (_c *StateDB_GetStorageRoot_Call) Run(run func(addr common.Address)) *StateDB_GetStorageRoot_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_GetStorageRoot_Call) Return(_a0 common.Hash) *StateDB_GetStorageRoot_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetStorageRoot_Call) RunAndReturn(run func(common.Address) common.Hash) *StateDB_GetStorageRoot_Call { - _c.Call.Return(run) - return _c -} - -// GetTransientState provides a mock function with given fields: addr, key. -func (_m *StateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash { - ret := _m.Called(addr, key) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(common.Address, common.Hash) common.Hash); ok { - r0 = rf(addr, key) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// StateDB_GetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTransientState'. -type StateDB_GetTransientState_Call struct { - *mock.Call -} - -// GetTransientState is a helper method to define mock.On call -// - addr common.Address -// - key common.Hash -func (_e *StateDB_Expecter) GetTransientState(addr interface{}, key interface{}) *StateDB_GetTransientState_Call { - return &StateDB_GetTransientState_Call{Call: _e.mock.On("GetTransientState", addr, key)} -} - -func (_c *StateDB_GetTransientState_Call) Run(run func(addr common.Address, key common.Hash)) *StateDB_GetTransientState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_GetTransientState_Call) Return(_a0 common.Hash) *StateDB_GetTransientState_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_GetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash) common.Hash) *StateDB_GetTransientState_Call { - _c.Call.Return(run) - return _c -} - -// HasSelfDestructed provides a mock function with given fields: _a0. -func (_m *StateDB) HasSelfDestructed(_a0 common.Address) bool { - ret := _m.Called(_a0) - - var r0 bool - if rf, ok := ret.Get(0).(func(common.Address) bool); ok { - r0 = rf(_a0) - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// StateDB_HasSelfDestructed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HasSelfDestructed'. -type StateDB_HasSelfDestructed_Call struct { - *mock.Call -} - -// HasSelfDestructed is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) HasSelfDestructed(_a0 interface{}) *StateDB_HasSelfDestructed_Call { - return &StateDB_HasSelfDestructed_Call{Call: _e.mock.On("HasSelfDestructed", _a0)} -} - -func (_c *StateDB_HasSelfDestructed_Call) Run(run func(_a0 common.Address)) *StateDB_HasSelfDestructed_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_HasSelfDestructed_Call) Return(_a0 bool) *StateDB_HasSelfDestructed_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_HasSelfDestructed_Call) RunAndReturn(run func(common.Address) bool) *StateDB_HasSelfDestructed_Call { - _c.Call.Return(run) - return _c -} - -// IntermediateRoot provides a mock function with given fields: deleteEmptyObjects. -func (_m *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { - ret := _m.Called(deleteEmptyObjects) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(bool) common.Hash); ok { - r0 = rf(deleteEmptyObjects) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - return r0 -} - -// StateDB_IntermediateRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IntermediateRoot'. -type StateDB_IntermediateRoot_Call struct { - *mock.Call -} - -// IntermediateRoot is a helper method to define mock.On call -// - deleteEmptyObjects bool -func (_e *StateDB_Expecter) IntermediateRoot(deleteEmptyObjects interface{}) *StateDB_IntermediateRoot_Call { - return &StateDB_IntermediateRoot_Call{Call: _e.mock.On("IntermediateRoot", deleteEmptyObjects)} -} - -func (_c *StateDB_IntermediateRoot_Call) Run(run func(deleteEmptyObjects bool)) *StateDB_IntermediateRoot_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(bool)) - }) - return _c -} - -func (_c *StateDB_IntermediateRoot_Call) Return(_a0 common.Hash) *StateDB_IntermediateRoot_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_IntermediateRoot_Call) RunAndReturn(run func(bool) common.Hash) *StateDB_IntermediateRoot_Call { - _c.Call.Return(run) - return _c -} - -// IteratorDump provides a mock function with given fields: opts. -func (_m *StateDB) IteratorDump(opts *corestate.DumpConfig) corestate.IteratorDump { - ret := _m.Called(opts) - - var r0 corestate.IteratorDump - if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) corestate.IteratorDump); ok { - r0 = rf(opts) - } else { - r0 = ret.Get(0).(corestate.IteratorDump) - } - - return r0 -} - -// StateDB_IteratorDump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IteratorDump'. -type StateDB_IteratorDump_Call struct { - *mock.Call -} - -// IteratorDump is a helper method to define mock.On call -// - opts *corestate.DumpConfig -func (_e *StateDB_Expecter) IteratorDump(opts interface{}) *StateDB_IteratorDump_Call { - return &StateDB_IteratorDump_Call{Call: _e.mock.On("IteratorDump", opts)} -} - -func (_c *StateDB_IteratorDump_Call) Run(run func(opts *corestate.DumpConfig)) *StateDB_IteratorDump_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*corestate.DumpConfig)) - }) - return _c -} - -func (_c *StateDB_IteratorDump_Call) Return(_a0 corestate.IteratorDump) *StateDB_IteratorDump_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_IteratorDump_Call) RunAndReturn(run func(*corestate.DumpConfig) corestate.IteratorDump) *StateDB_IteratorDump_Call { - _c.Call.Return(run) - return _c -} - -// Logs provides a mock function with given fields:. -func (_m *StateDB) Logs() []*types.Log { - ret := _m.Called() - - var r0 []*types.Log - if rf, ok := ret.Get(0).(func() []*types.Log); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*types.Log) - } - } - - return r0 -} - -// StateDB_Logs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logs'. -type StateDB_Logs_Call struct { - *mock.Call -} - -// Logs is a helper method to define mock.On call. -func (_e *StateDB_Expecter) Logs() *StateDB_Logs_Call { - return &StateDB_Logs_Call{Call: _e.mock.On("Logs")} -} - -func (_c *StateDB_Logs_Call) Run(run func()) *StateDB_Logs_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_Logs_Call) Return(_a0 []*types.Log) *StateDB_Logs_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Logs_Call) RunAndReturn(run func() []*types.Log) *StateDB_Logs_Call { - _c.Call.Return(run) - return _c -} - -// Preimages provides a mock function with given fields:. -func (_m *StateDB) Preimages() map[common.Hash][]byte { - ret := _m.Called() - - var r0 map[common.Hash][]byte - if rf, ok := ret.Get(0).(func() map[common.Hash][]byte); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[common.Hash][]byte) - } - } - - return r0 -} - -// StateDB_Preimages_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Preimages'. -type StateDB_Preimages_Call struct { - *mock.Call -} - -// Preimages is a helper method to define mock.On call. -func (_e *StateDB_Expecter) Preimages() *StateDB_Preimages_Call { - return &StateDB_Preimages_Call{Call: _e.mock.On("Preimages")} -} - -func (_c *StateDB_Preimages_Call) Run(run func()) *StateDB_Preimages_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_Preimages_Call) Return(_a0 map[common.Hash][]byte) *StateDB_Preimages_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Preimages_Call) RunAndReturn(run func() map[common.Hash][]byte) *StateDB_Preimages_Call { - _c.Call.Return(run) - return _c -} - -// Prepare provides a mock function with given fields: rules, sender, coinbase, dest, precompiles, txAccesses. -func (_m *StateDB) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { - _m.Called(rules, sender, coinbase, dest, precompiles, txAccesses) -} - -// StateDB_Prepare_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Prepare'. -type StateDB_Prepare_Call struct { - *mock.Call -} - -// Prepare is a helper method to define mock.On call -// - rules params.Rules -// - sender common.Address -// - coinbase common.Address -// - dest *common.Address -// - precompiles []common.Address -// - txAccesses types.AccessList -func (_e *StateDB_Expecter) Prepare(rules interface{}, sender interface{}, coinbase interface{}, dest interface{}, precompiles interface{}, txAccesses interface{}) *StateDB_Prepare_Call { - return &StateDB_Prepare_Call{Call: _e.mock.On("Prepare", rules, sender, coinbase, dest, precompiles, txAccesses)} -} - -func (_c *StateDB_Prepare_Call) Run(run func(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList)) *StateDB_Prepare_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(params.Rules), args[1].(common.Address), args[2].(common.Address), args[3].(*common.Address), args[4].([]common.Address), args[5].(types.AccessList)) - }) - return _c -} - -func (_c *StateDB_Prepare_Call) Return() *StateDB_Prepare_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_Prepare_Call) RunAndReturn(run func(params.Rules, common.Address, common.Address, *common.Address, []common.Address, types.AccessList)) *StateDB_Prepare_Call { - _c.Call.Return(run) - return _c -} - -// RawDump provides a mock function with given fields: opts. -func (_m *StateDB) RawDump(opts *corestate.DumpConfig) corestate.Dump { - ret := _m.Called(opts) - - var r0 corestate.Dump - if rf, ok := ret.Get(0).(func(*corestate.DumpConfig) corestate.Dump); ok { - r0 = rf(opts) - } else { - r0 = ret.Get(0).(corestate.Dump) - } - - return r0 -} - -// StateDB_RawDump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RawDump'. -type StateDB_RawDump_Call struct { - *mock.Call -} - -// RawDump is a helper method to define mock.On call -// - opts *corestate.DumpConfig -func (_e *StateDB_Expecter) RawDump(opts interface{}) *StateDB_RawDump_Call { - return &StateDB_RawDump_Call{Call: _e.mock.On("RawDump", opts)} -} - -func (_c *StateDB_RawDump_Call) Run(run func(opts *corestate.DumpConfig)) *StateDB_RawDump_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*corestate.DumpConfig)) - }) - return _c -} - -func (_c *StateDB_RawDump_Call) Return(_a0 corestate.Dump) *StateDB_RawDump_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_RawDump_Call) RunAndReturn(run func(*corestate.DumpConfig) corestate.Dump) *StateDB_RawDump_Call { - _c.Call.Return(run) - return _c -} - -// RevertToSnapshot provides a mock function with given fields: _a0. -func (_m *StateDB) RevertToSnapshot(_a0 int) { - _m.Called(_a0) -} - -// StateDB_RevertToSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevertToSnapshot'. -type StateDB_RevertToSnapshot_Call struct { - *mock.Call -} - -// RevertToSnapshot is a helper method to define mock.On call -// - _a0 int -func (_e *StateDB_Expecter) RevertToSnapshot(_a0 interface{}) *StateDB_RevertToSnapshot_Call { - return &StateDB_RevertToSnapshot_Call{Call: _e.mock.On("RevertToSnapshot", _a0)} -} - -func (_c *StateDB_RevertToSnapshot_Call) Run(run func(_a0 int)) *StateDB_RevertToSnapshot_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(int)) - }) - return _c -} - -func (_c *StateDB_RevertToSnapshot_Call) Return() *StateDB_RevertToSnapshot_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_RevertToSnapshot_Call) RunAndReturn(run func(int)) *StateDB_RevertToSnapshot_Call { - _c.Call.Return(run) - return _c -} - -// SelfDestruct provides a mock function with given fields: _a0. -func (_m *StateDB) SelfDestruct(_a0 common.Address) { - _m.Called(_a0) -} - -// StateDB_SelfDestruct_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SelfDestruct'. -type StateDB_SelfDestruct_Call struct { - *mock.Call -} - -// SelfDestruct is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) SelfDestruct(_a0 interface{}) *StateDB_SelfDestruct_Call { - return &StateDB_SelfDestruct_Call{Call: _e.mock.On("SelfDestruct", _a0)} -} - -func (_c *StateDB_SelfDestruct_Call) Run(run func(_a0 common.Address)) *StateDB_SelfDestruct_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_SelfDestruct_Call) Return() *StateDB_SelfDestruct_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SelfDestruct_Call) RunAndReturn(run func(common.Address)) *StateDB_SelfDestruct_Call { - _c.Call.Return(run) - return _c -} - -// Selfdestruct6780 provides a mock function with given fields: _a0. -func (_m *StateDB) Selfdestruct6780(_a0 common.Address) { - _m.Called(_a0) -} - -// StateDB_Selfdestruct6780_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Selfdestruct6780'. -type StateDB_Selfdestruct6780_Call struct { - *mock.Call -} - -// Selfdestruct6780 is a helper method to define mock.On call -// - _a0 common.Address -func (_e *StateDB_Expecter) Selfdestruct6780(_a0 interface{}) *StateDB_Selfdestruct6780_Call { - return &StateDB_Selfdestruct6780_Call{Call: _e.mock.On("Selfdestruct6780", _a0)} -} - -func (_c *StateDB_Selfdestruct6780_Call) Run(run func(_a0 common.Address)) *StateDB_Selfdestruct6780_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address)) - }) - return _c -} - -func (_c *StateDB_Selfdestruct6780_Call) Return() *StateDB_Selfdestruct6780_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_Selfdestruct6780_Call) RunAndReturn(run func(common.Address)) *StateDB_Selfdestruct6780_Call { - _c.Call.Return(run) - return _c -} - -// SetBalance provides a mock function with given fields: addr, amount. -func (_m *StateDB) SetBalance(addr common.Address, amount *big.Int) { - _m.Called(addr, amount) -} - -// StateDB_SetBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetBalance'. -type StateDB_SetBalance_Call struct { - *mock.Call -} - -// SetBalance is a helper method to define mock.On call -// - addr common.Address -// - amount *big.Int -func (_e *StateDB_Expecter) SetBalance(addr interface{}, amount interface{}) *StateDB_SetBalance_Call { - return &StateDB_SetBalance_Call{Call: _e.mock.On("SetBalance", addr, amount)} -} - -func (_c *StateDB_SetBalance_Call) Run(run func(addr common.Address, amount *big.Int)) *StateDB_SetBalance_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(*big.Int)) - }) - return _c -} - -func (_c *StateDB_SetBalance_Call) Return() *StateDB_SetBalance_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *StateDB_SetBalance_Call { - _c.Call.Return(run) - return _c -} - -// SetCode provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) SetCode(_a0 common.Address, _a1 []byte) { - _m.Called(_a0, _a1) -} - -// StateDB_SetCode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCode'. -type StateDB_SetCode_Call struct { - *mock.Call -} - -// SetCode is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 []byte -func (_e *StateDB_Expecter) SetCode(_a0 interface{}, _a1 interface{}) *StateDB_SetCode_Call { - return &StateDB_SetCode_Call{Call: _e.mock.On("SetCode", _a0, _a1)} -} - -func (_c *StateDB_SetCode_Call) Run(run func(_a0 common.Address, _a1 []byte)) *StateDB_SetCode_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].([]byte)) - }) - return _c -} - -func (_c *StateDB_SetCode_Call) Return() *StateDB_SetCode_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetCode_Call) RunAndReturn(run func(common.Address, []byte)) *StateDB_SetCode_Call { - _c.Call.Return(run) - return _c -} - -// SetNonce provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) SetNonce(_a0 common.Address, _a1 uint64) { - _m.Called(_a0, _a1) -} - -// StateDB_SetNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetNonce'. -type StateDB_SetNonce_Call struct { - *mock.Call -} - -// SetNonce is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 uint64 -func (_e *StateDB_Expecter) SetNonce(_a0 interface{}, _a1 interface{}) *StateDB_SetNonce_Call { - return &StateDB_SetNonce_Call{Call: _e.mock.On("SetNonce", _a0, _a1)} -} - -func (_c *StateDB_SetNonce_Call) Run(run func(_a0 common.Address, _a1 uint64)) *StateDB_SetNonce_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(uint64)) - }) - return _c -} - -func (_c *StateDB_SetNonce_Call) Return() *StateDB_SetNonce_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetNonce_Call) RunAndReturn(run func(common.Address, uint64)) *StateDB_SetNonce_Call { - _c.Call.Return(run) - return _c -} - -// SetState provides a mock function with given fields: _a0, _a1, _a2. -func (_m *StateDB) SetState(_a0 common.Address, _a1 common.Hash, _a2 common.Hash) { - _m.Called(_a0, _a1, _a2) -} - -// StateDB_SetState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetState'. -type StateDB_SetState_Call struct { - *mock.Call -} - -// SetState is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 common.Hash -// - _a2 common.Hash -func (_e *StateDB_Expecter) SetState(_a0 interface{}, _a1 interface{}, _a2 interface{}) *StateDB_SetState_Call { - return &StateDB_SetState_Call{Call: _e.mock.On("SetState", _a0, _a1, _a2)} -} - -func (_c *StateDB_SetState_Call) Run(run func(_a0 common.Address, _a1 common.Hash, _a2 common.Hash)) *StateDB_SetState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_SetState_Call) Return() *StateDB_SetState_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *StateDB_SetState_Call { - _c.Call.Return(run) - return _c -} - -// SetStorage provides a mock function with given fields: addr, storage. -func (_m *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { - _m.Called(addr, storage) -} - -// StateDB_SetStorage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStorage'. -type StateDB_SetStorage_Call struct { - *mock.Call -} - -// SetStorage is a helper method to define mock.On call -// - addr common.Address -// - storage map[common.Hash]common.Hash -func (_e *StateDB_Expecter) SetStorage(addr interface{}, storage interface{}) *StateDB_SetStorage_Call { - return &StateDB_SetStorage_Call{Call: _e.mock.On("SetStorage", addr, storage)} -} - -func (_c *StateDB_SetStorage_Call) Run(run func(addr common.Address, storage map[common.Hash]common.Hash)) *StateDB_SetStorage_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(map[common.Hash]common.Hash)) - }) - return _c -} - -func (_c *StateDB_SetStorage_Call) Return() *StateDB_SetStorage_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetStorage_Call) RunAndReturn(run func(common.Address, map[common.Hash]common.Hash)) *StateDB_SetStorage_Call { - _c.Call.Return(run) - return _c -} - -// SetTransientState provides a mock function with given fields: addr, key, value. -func (_m *StateDB) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { - _m.Called(addr, key, value) -} - -// StateDB_SetTransientState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTransientState'. -type StateDB_SetTransientState_Call struct { - *mock.Call -} - -// SetTransientState is a helper method to define mock.On call -// - addr common.Address -// - key common.Hash -// - value common.Hash -func (_e *StateDB_Expecter) SetTransientState(addr interface{}, key interface{}, value interface{}) *StateDB_SetTransientState_Call { - return &StateDB_SetTransientState_Call{Call: _e.mock.On("SetTransientState", addr, key, value)} -} - -func (_c *StateDB_SetTransientState_Call) Run(run func(addr common.Address, key common.Hash, value common.Hash)) *StateDB_SetTransientState_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash), args[2].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_SetTransientState_Call) Return() *StateDB_SetTransientState_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetTransientState_Call) RunAndReturn(run func(common.Address, common.Hash, common.Hash)) *StateDB_SetTransientState_Call { - _c.Call.Return(run) - return _c -} - -// SetTxContext provides a mock function with given fields: thash, ti. -func (_m *StateDB) SetTxContext(thash common.Hash, ti int) { - _m.Called(thash, ti) -} - -// StateDB_SetTxContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTxContext'. -type StateDB_SetTxContext_Call struct { - *mock.Call -} - -// SetTxContext is a helper method to define mock.On call -// - thash common.Hash -// - ti int -func (_e *StateDB_Expecter) SetTxContext(thash interface{}, ti interface{}) *StateDB_SetTxContext_Call { - return &StateDB_SetTxContext_Call{Call: _e.mock.On("SetTxContext", thash, ti)} -} - -func (_c *StateDB_SetTxContext_Call) Run(run func(thash common.Hash, ti int)) *StateDB_SetTxContext_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Hash), args[1].(int)) - }) - return _c -} - -func (_c *StateDB_SetTxContext_Call) Return() *StateDB_SetTxContext_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SetTxContext_Call) RunAndReturn(run func(common.Hash, int)) *StateDB_SetTxContext_Call { - _c.Call.Return(run) - return _c -} - -// SlotInAccessList provides a mock function with given fields: addr, slot. -func (_m *StateDB) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { - ret := _m.Called(addr, slot) - - var r0 bool - var r1 bool - if rf, ok := ret.Get(0).(func(common.Address, common.Hash) (bool, bool)); ok { - return rf(addr, slot) - } - if rf, ok := ret.Get(0).(func(common.Address, common.Hash) bool); ok { - r0 = rf(addr, slot) - } else { - r0 = ret.Get(0).(bool) - } - - if rf, ok := ret.Get(1).(func(common.Address, common.Hash) bool); ok { - r1 = rf(addr, slot) - } else { - r1 = ret.Get(1).(bool) - } - - return r0, r1 -} - -// StateDB_SlotInAccessList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SlotInAccessList'. -type StateDB_SlotInAccessList_Call struct { - *mock.Call -} - -// SlotInAccessList is a helper method to define mock.On call -// - addr common.Address -// - slot common.Hash -func (_e *StateDB_Expecter) SlotInAccessList(addr interface{}, slot interface{}) *StateDB_SlotInAccessList_Call { - return &StateDB_SlotInAccessList_Call{Call: _e.mock.On("SlotInAccessList", addr, slot)} -} - -func (_c *StateDB_SlotInAccessList_Call) Run(run func(addr common.Address, slot common.Hash)) *StateDB_SlotInAccessList_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(common.Hash)) - }) - return _c -} - -func (_c *StateDB_SlotInAccessList_Call) Return(addressOk bool, slotOk bool) *StateDB_SlotInAccessList_Call { - _c.Call.Return(addressOk, slotOk) - return _c -} - -func (_c *StateDB_SlotInAccessList_Call) RunAndReturn(run func(common.Address, common.Hash) (bool, bool)) *StateDB_SlotInAccessList_Call { - _c.Call.Return(run) - return _c -} - -// Snapshot provides a mock function with given fields:. -func (_m *StateDB) Snapshot() int { - ret := _m.Called() - - var r0 int - if rf, ok := ret.Get(0).(func() int); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int) - } - - return r0 -} - -// StateDB_Snapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Snapshot'. -type StateDB_Snapshot_Call struct { - *mock.Call -} - -// Snapshot is a helper method to define mock.On call. -func (_e *StateDB_Expecter) Snapshot() *StateDB_Snapshot_Call { - return &StateDB_Snapshot_Call{Call: _e.mock.On("Snapshot")} -} - -func (_c *StateDB_Snapshot_Call) Run(run func()) *StateDB_Snapshot_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_Snapshot_Call) Return(_a0 int) *StateDB_Snapshot_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_Snapshot_Call) RunAndReturn(run func() int) *StateDB_Snapshot_Call { - _c.Call.Return(run) - return _c -} - -// StartPrefetcher provides a mock function with given fields: namespace. -func (_m *StateDB) StartPrefetcher(namespace string) { - _m.Called(namespace) -} - -// StateDB_StartPrefetcher_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StartPrefetcher'. -type StateDB_StartPrefetcher_Call struct { - *mock.Call -} - -// StartPrefetcher is a helper method to define mock.On call -// - namespace string -func (_e *StateDB_Expecter) StartPrefetcher(namespace interface{}) *StateDB_StartPrefetcher_Call { - return &StateDB_StartPrefetcher_Call{Call: _e.mock.On("StartPrefetcher", namespace)} -} - -func (_c *StateDB_StartPrefetcher_Call) Run(run func(namespace string)) *StateDB_StartPrefetcher_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string)) - }) - return _c -} - -func (_c *StateDB_StartPrefetcher_Call) Return() *StateDB_StartPrefetcher_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_StartPrefetcher_Call) RunAndReturn(run func(string)) *StateDB_StartPrefetcher_Call { - _c.Call.Return(run) - return _c -} - -// StopPrefetcher provides a mock function with given fields:. -func (_m *StateDB) StopPrefetcher() { - _m.Called() -} - -// StateDB_StopPrefetcher_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StopPrefetcher'. -type StateDB_StopPrefetcher_Call struct { - *mock.Call -} - -// StopPrefetcher is a helper method to define mock.On call. -func (_e *StateDB_Expecter) StopPrefetcher() *StateDB_StopPrefetcher_Call { - return &StateDB_StopPrefetcher_Call{Call: _e.mock.On("StopPrefetcher")} -} - -func (_c *StateDB_StopPrefetcher_Call) Run(run func()) *StateDB_StopPrefetcher_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_StopPrefetcher_Call) Return() *StateDB_StopPrefetcher_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_StopPrefetcher_Call) RunAndReturn(run func()) *StateDB_StopPrefetcher_Call { - _c.Call.Return(run) - return _c -} - -// SubBalance provides a mock function with given fields: _a0, _a1. -func (_m *StateDB) SubBalance(_a0 common.Address, _a1 *big.Int) { - _m.Called(_a0, _a1) -} - -// StateDB_SubBalance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubBalance'. -type StateDB_SubBalance_Call struct { - *mock.Call -} - -// SubBalance is a helper method to define mock.On call -// - _a0 common.Address -// - _a1 *big.Int -func (_e *StateDB_Expecter) SubBalance(_a0 interface{}, _a1 interface{}) *StateDB_SubBalance_Call { - return &StateDB_SubBalance_Call{Call: _e.mock.On("SubBalance", _a0, _a1)} -} - -func (_c *StateDB_SubBalance_Call) Run(run func(_a0 common.Address, _a1 *big.Int)) *StateDB_SubBalance_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(common.Address), args[1].(*big.Int)) - }) - return _c -} - -func (_c *StateDB_SubBalance_Call) Return() *StateDB_SubBalance_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SubBalance_Call) RunAndReturn(run func(common.Address, *big.Int)) *StateDB_SubBalance_Call { - _c.Call.Return(run) - return _c -} - -// SubRefund provides a mock function with given fields: _a0. -func (_m *StateDB) SubRefund(_a0 uint64) { - _m.Called(_a0) -} - -// StateDB_SubRefund_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubRefund'. -type StateDB_SubRefund_Call struct { - *mock.Call -} - -// SubRefund is a helper method to define mock.On call -// - _a0 uint64 -func (_e *StateDB_Expecter) SubRefund(_a0 interface{}) *StateDB_SubRefund_Call { - return &StateDB_SubRefund_Call{Call: _e.mock.On("SubRefund", _a0)} -} - -func (_c *StateDB_SubRefund_Call) Run(run func(_a0 uint64)) *StateDB_SubRefund_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(uint64)) - }) - return _c -} - -func (_c *StateDB_SubRefund_Call) Return() *StateDB_SubRefund_Call { - _c.Call.Return() - return _c -} - -func (_c *StateDB_SubRefund_Call) RunAndReturn(run func(uint64)) *StateDB_SubRefund_Call { - _c.Call.Return(run) - return _c -} - -// TxIndex provides a mock function with given fields:. -func (_m *StateDB) TxIndex() int { - ret := _m.Called() - - var r0 int - if rf, ok := ret.Get(0).(func() int); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int) - } - - return r0 -} - -// StateDB_TxIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxIndex'. -type StateDB_TxIndex_Call struct { - *mock.Call -} - -// TxIndex is a helper method to define mock.On call. -func (_e *StateDB_Expecter) TxIndex() *StateDB_TxIndex_Call { - return &StateDB_TxIndex_Call{Call: _e.mock.On("TxIndex")} -} - -func (_c *StateDB_TxIndex_Call) Run(run func()) *StateDB_TxIndex_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *StateDB_TxIndex_Call) Return(_a0 int) *StateDB_TxIndex_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *StateDB_TxIndex_Call) RunAndReturn(run func() int) *StateDB_TxIndex_Call { - _c.Call.Return(run) - return _c -} - -// NewStateDB creates a new instance of StateDB. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewStateDB(t interface { - mock.TestingT - Cleanup(func()) -}) *StateDB { - mock := &StateDB{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/eth/core/state/state_test.go b/eth/core/state/state_test.go deleted file mode 100644 index 2c770966aa..0000000000 --- a/eth/core/state/state_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package state_test - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestState(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "eth/core/state") -} diff --git a/eth/core/state/statedb_test.go b/eth/core/state/statedb_test.go index 27573ea82f..2e95bd40e4 100644 --- a/eth/core/state/statedb_test.go +++ b/eth/core/state/statedb_test.go @@ -23,6 +23,7 @@ package state_test import ( "errors" "math/big" + "testing" tmock "github.com/stretchr/testify/mock" @@ -43,6 +44,11 @@ var ( slot = common.Hash{1} ) +func TestState(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "eth/core/state") +} + var _ = Describe("StateDB", func() { var sdb state.StateDB var sp *mock.PluginMock From a64844cbe0ac7a1c7d237cc899f6e96fb7a8581d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 6 Oct 2023 10:49:53 -0400 Subject: [PATCH 068/122] chore(app): Remove`deadcode` (#1189) --- e2e/testapp/app.go | 63 +-- e2e/testapp/export.go | 2 +- e2e/testapp/go.mod | 2 +- e2e/testapp/helpers.go | 2 +- e2e/testapp/sim_test.go | 188 --------- go.work.sum | 912 ++++++---------------------------------- 6 files changed, 136 insertions(+), 1033 deletions(-) delete mode 100644 e2e/testapp/sim_test.go diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 429ccaa1d1..ae0e79d30a 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -207,7 +207,7 @@ func NewPolarisApp( ante.HandlerOptions{ AccountKeeper: app.AccountKeeper, BankKeeper: app.BankKeeper, - SignModeHandler: app.TxConfig().SignModeHandler(), + SignModeHandler: app.txConfig.SignModeHandler(), FeegrantKeeper: nil, SigGasConsumer: evmante.SigVerificationGasConsumer, }, @@ -250,36 +250,6 @@ func (app *SimApp) LegacyAmino() *codec.LegacyAmino { return app.legacyAmino } -// AppCodec returns SimApp's app codec. -// -// NOTE: This is solely to be used for testing purposes as it may be desirable -// for modules to register their own custom testing types. -func (app *SimApp) AppCodec() codec.Codec { - return app.appCodec -} - -// InterfaceRegistry returns SimApp's InterfaceRegistry. -func (app *SimApp) InterfaceRegistry() codectypes.InterfaceRegistry { - return app.interfaceRegistry -} - -// TxConfig returns SimApp's TxConfig. -func (app *SimApp) TxConfig() client.TxConfig { - return app.txConfig -} - -// GetKey returns the KVStoreKey for the provided store key. -// -// NOTE: This is solely to be used for testing purposes. -func (app *SimApp) GetKey(storeKey string) *storetypes.KVStoreKey { - sk := app.UnsafeFindStoreKey(storeKey) - kvStoreKey, ok := sk.(*storetypes.KVStoreKey) - if !ok { - return nil - } - return kvStoreKey -} - func (app *SimApp) kvStoreKeys() map[string]*storetypes.KVStoreKey { keys := make(map[string]*storetypes.KVStoreKey) for _, k := range app.GetStoreKeys() { @@ -325,34 +295,5 @@ func (app *SimApp) Close() error { if pl := app.EVMKeeper.Polaris(); pl != nil { return pl.Close() } - return nil -} - -// GetMaccPerms returns a copy of the module account permissions -// -// NOTE: This is solely to be used for testing purposes. -func GetMaccPerms() map[string][]string { - dup := make(map[string][]string) - for _, perms := range moduleAccPerms { - dup[perms.Account] = perms.Permissions - } - - return dup -} - -// BlockedAddresses returns all the app's blocked account addresses. -func BlockedAddresses() map[string]bool { - result := make(map[string]bool) - - if len(blockAccAddrs) > 0 { - for _, addr := range blockAccAddrs { - result[addr] = true - } - } else { - for addr := range GetMaccPerms() { - result[addr] = true - } - } - - return result + return app.BaseApp.Close() } diff --git a/e2e/testapp/export.go b/e2e/testapp/export.go index bc6e40cb27..881d31a25e 100644 --- a/e2e/testapp/export.go +++ b/e2e/testapp/export.go @@ -222,7 +222,7 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // Iterate through validators by power descending, reset bond heights, and // update bond intra-tx counters. - store := ctx.KVStore(app.GetKey(stakingtypes.StoreKey)) + store := ctx.KVStore(app.UnsafeFindStoreKey(stakingtypes.StoreKey)) iter := storetypes.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) counter := int16(0) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index d1610326ed..e3a3900745 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,7 +15,6 @@ require ( cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d - github.com/stretchr/testify v1.8.4 pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 ) @@ -231,6 +230,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.2.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect diff --git a/e2e/testapp/helpers.go b/e2e/testapp/helpers.go index 7bcfa0deb9..18cb8b4671 100644 --- a/e2e/testapp/helpers.go +++ b/e2e/testapp/helpers.go @@ -58,7 +58,7 @@ func PrecompilesToInject( app.AccountKeeper, govkeeper.NewMsgServerImpl(app.GovKeeper), govkeeper.NewQueryServer(app.GovKeeper), - app.InterfaceRegistry(), + app.interfaceRegistry, ), stakingprecompile.NewPrecompileContract(app.AccountKeeper, app.StakingKeeper), }...) diff --git a/e2e/testapp/sim_test.go b/e2e/testapp/sim_test.go deleted file mode 100644 index 40aa028951..0000000000 --- a/e2e/testapp/sim_test.go +++ /dev/null @@ -1,188 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package testapp - -import ( - "flag" - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/require" - - "cosmossdk.io/log" - - abci "github.com/cometbft/cometbft/abci/types" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/server" - simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/cosmos/cosmos-sdk/x/simulation" - simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli" -) - -// SimAppChainID hardcoded chainID for simulation. -const ( - SimAppChainID = "simulation-app" - Bech32Prefix = "cosmos" -) - -var FlagEnableStreamingValue bool - -// Get flags every time the simulator is run. -func setup() { - simcli.GetSimulatorFlags() - flag.BoolVar(&FlagEnableStreamingValue, "EnableStreaming", false, "Enable streaming service") -} - -func TestMain(m *testing.M) { - setup() - code := m.Run() - os.Exit(code) -} - -// fauxMerkleModeOpt returns a BaseApp option to use a dbStoreAdapter instead of -// an IAVLStore for faster simulation speed. -func fauxMerkleModeOpt(bapp *baseapp.BaseApp) { - bapp.SetFauxMerkleMode() -} - -func TestAppSimulationAfterImport(t *testing.T) { - config := simcli.NewConfigFromFlags() - config.ChainID = SimAppChainID - - db, dir, logger, skip, err := simtestutil.SetupSimulation( - config, - "leveldb-app-sim", - "Simulation", - simcli.FlagVerboseValue, - simcli.FlagEnabledValue, - ) - if skip { - t.Skip("skipping application simulation after import") - } - require.NoError(t, err, "simulation setup failed") - - appOptions := make(simtestutil.AppOptionsMap, 0) - appOptions[flags.FlagHome] = fmt.Sprintf("%d/%s", config.Seed, DefaultNodeHome) - appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue - - app := NewPolarisApp( - logger, - db, - nil, - true, - Bech32Prefix, - appOptions, - fauxMerkleModeOpt, - baseapp.SetChainID(SimAppChainID), - ) - require.Equal(t, "SimApp", app.Name()) - - // Run randomized simulation - stopEarly, simParams, simErr := simulation.SimulateFromSeed( - t, - os.Stdout, - app.BaseApp, - simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), - app.DefaultGenesis()), - simtypes.RandomAccounts, // Replace with own - // random account function if using keys other than secp256k1 - simtestutil.SimulationOperations(app, app.AppCodec(), config), - BlockedAddresses(), - config, - app.AppCodec(), - ) - - // export state and simParams before the simulation error is checked - err = simtestutil.CheckExportSimulation(app, config, simParams) - require.NoError(t, err) - require.NoError(t, simErr) - - if config.Commit { - simtestutil.PrintStats(db) - } - - if stopEarly { - t.Log("can't export or import a zero-validator genesis, exiting test...") - return - } - - t.Log("exporting genesis...\n") - - exported, err := app.ExportAppStateAndValidators(true, []string{}, []string{}) - require.NoError(t, err) - - require.NoError(t, app.Close()) - require.NoError(t, db.Close()) - require.NoError(t, os.RemoveAll(dir)) - - t.Log("importing genesis...\n") - - newDB, newDir, _, _, err := simtestutil.SetupSimulation( - config, - "leveldb-app-sim-2", - "Simulation-2", - simcli.FlagVerboseValue, - simcli.FlagEnabledValue, - ) - require.NoError(t, err, "simulation setup failed") - - defer func() { - require.NoError(t, newDB.Close()) - require.NoError(t, os.RemoveAll(newDir)) - }() - - newApp := NewPolarisApp( - log.NewNopLogger(), - newDB, - nil, - true, - Bech32Prefix, - appOptions, - fauxMerkleModeOpt, - baseapp.SetChainID(SimAppChainID), - ) - require.Equal(t, "SimApp", newApp.Name()) - - _, err = newApp.InitChain(&abci.RequestInitChain{ - AppStateBytes: exported.AppState, - ChainId: SimAppChainID, - }) - require.NoError(t, err) - - _, _, err = simulation.SimulateFromSeed( - t, - os.Stdout, - newApp.BaseApp, - simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), - app.DefaultGenesis()), - // Replace with own random account function if using keys other than secp256k1 - simtypes.RandomAccounts, - simtestutil.SimulationOperations(newApp, newApp.AppCodec(), config), - BlockedAddresses(), - config, - app.AppCodec(), - ) - require.NoError(t, err) -} diff --git a/go.work.sum b/go.work.sum index f0a96d9b16..b05dc88f5d 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,234 +1,356 @@ +cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n6vCmFJM= cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqmfddPA= cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0= cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= cloud.google.com/go/eventarc v1.13.0 h1:xIP3XZi0Xawx8DEfh++mE2lrIi5kQmCr/KcWhJ1q0J4= cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.6.0 h1:PKggmegChZulPW8yvtziF8P9UOuVFwbvylbEucTNups= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/tpu v1.6.1 h1:kQf1jgPY04UJBYYjNUO+3GrZtIb57MfGAW2bwgLbR3A= cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zXrU0= cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmXJ+EjTA= cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= @@ -236,15 +358,20 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSu github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= @@ -261,14 +388,18 @@ github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= @@ -302,213 +433,77 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= -github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/cloudflare/circl v1.3.1 h1:4OVCZRL62ijwEwxnF6I7hLwxvIYi3VaZt8TflkqtrtA= github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= -github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= -github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= -github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= -github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= -github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= -github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= -github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= -github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= -github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= -github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= -github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= -github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= -github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= -github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= -github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= -github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= @@ -519,24 +514,14 @@ github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojt github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db h1:gb2Z18BhTPJPpLQWj4T+rfKHYCHxRHCtRxhKKjRidVw= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0= @@ -546,8 +531,6 @@ github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BH github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= @@ -556,202 +539,56 @@ github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHs github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= -github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= -github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= -github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/hydrogen18/memlistener v1.0.0 h1:JR7eDj8HD6eXrc5fWLbSUnfcQFL06PYvCc0DKQnWfaU= @@ -760,10 +597,6 @@ github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/informalsystems/tm-load-test v1.3.0 h1:FGjKy7vBw6mXNakt+wmNWKggQZRsKkEYpaFk/zR64VA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= @@ -774,35 +607,20 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= @@ -824,20 +642,12 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= @@ -850,161 +660,78 @@ github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76 h1:0xuRacu/Zr+jX+KyLLPPktbwXqyOvnOPUQmMLzX1jxU= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3 h1:hUmXhbljNFtrH5hzV9kiRoddZ5nfPTq3K0Sb2hYYiqE= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= @@ -1013,61 +740,33 @@ github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR github.com/pointlander/peg v1.0.1 h1:mgA/GQE8TeS9MdkU6Xn6iEzBmQUQCNuWD7rHCK6Mjs0= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5 h1:CvqZS4QYHBRvx7AeFdimd16HCbLlYsvQMcKDACpJW/c= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96 h1:J8J/cgLDRuqXJnwIrRDBvtl+LLsdg7De74znW/BRRq4= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e h1:eTWZyPUnHcuGRDiryS/l2I7FfKjbU3IBx3IjqHPxuKU= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= @@ -1075,67 +774,28 @@ github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -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/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= -github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= -github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= @@ -1146,9 +806,7 @@ github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/V github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -1164,21 +822,11 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= @@ -1189,331 +837,33 @@ go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= -pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:TZhwmadAUlnyf450t7suO5sN3AGRNE3qziXldP58rUs= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 5dcdec130410a0d26b797e4a2bbde90b1364d52d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 6 Oct 2023 13:13:33 -0400 Subject: [PATCH 069/122] fix(4node): Fix 4 node testnet (#1190) --- e2e/testapp/docker/docker-compose.yml | 25 +++++-- e2e/testapp/docker/network-init-2.sh | 60 ----------------- e2e/testapp/docker/network-init-4.sh | 2 +- e2e/testapp/docker/nginx.conf | 19 ++++++ e2e/testapp/docker/reset-temp.sh | 0 e2e/testapp/docker/seed/init.sh | 65 +++++++++++++++++++ .../docker/seed/scripts/get-seed-address.sh | 4 +- .../docker/seed/scripts/liveness-probe.sh | 54 +++++++++++++++ .../docker/seed/scripts/readiness-probe.sh | 38 +++++++++++ e2e/testapp/docker/seed/scripts/reset.sh | 6 +- e2e/testapp/docker/seed/scripts/seed-start.sh | 10 ++- .../docker/seed/scripts/seed0-init-step1.sh | 45 +++++++++---- .../docker/seed/scripts/seed0-init-step2.sh | 21 +++++- .../docker/seed/scripts/seed1-init-step1.sh | 21 ++++-- .../docker/seed/scripts/seed1-init-step2.sh | 22 +++++-- .../seed/scripts/set-persistent-peers.sh | 28 ++++++++ .../docker/seed/scripts/set-seed-address.sh | 5 +- .../validator/scripts/val0-init-step1.sh | 2 +- .../validator/scripts/val0-init-step2.sh | 2 +- .../validator/scripts/val0-init-step3.sh | 2 +- .../validator/scripts/val1-init-step1.sh | 2 +- .../validator/scripts/val1-init-step2.sh | 2 +- 22 files changed, 334 insertions(+), 101 deletions(-) delete mode 100755 e2e/testapp/docker/network-init-2.sh create mode 100644 e2e/testapp/docker/nginx.conf mode change 100644 => 100755 e2e/testapp/docker/reset-temp.sh create mode 100755 e2e/testapp/docker/seed/init.sh create mode 100644 e2e/testapp/docker/seed/scripts/liveness-probe.sh create mode 100644 e2e/testapp/docker/seed/scripts/readiness-probe.sh create mode 100644 e2e/testapp/docker/seed/scripts/set-persistent-peers.sh diff --git a/e2e/testapp/docker/docker-compose.yml b/e2e/testapp/docker/docker-compose.yml index 839feb48b1..20c8d4be1e 100644 --- a/e2e/testapp/docker/docker-compose.yml +++ b/e2e/testapp/docker/docker-compose.yml @@ -18,7 +18,7 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -version: '3.3' +version: "3.3" services: node0: @@ -27,9 +27,10 @@ services: ports: - "26656-26658:26656-26658" - "9090-9091:9090-9091" - - "8545-8546:8545-8546" + - "1545-1546:8545-8546" environment: - ID=0 + - CHAINID=berachain-localnet-666 volumes: - type: bind source: ./temp/seed0 @@ -44,9 +45,10 @@ services: ports: - "26659-26661:26656-26658" - "9092-9093:9090-9091" - - "8547-8548:8545-8546" + - "2547-2548:8545-8546" environment: - ID=1 + - CHAINID=berachain-localnet-666 volumes: - type: bind source: ./temp/seed1 @@ -61,9 +63,10 @@ services: ports: - "26662-26664:26656-26658" - "9094-9095:9090-9091" - - "8549-8550:8545-8546" + - "3549-3550:8545-8546" environment: - ID=2 + - CHAINID=berachain-localnet-666 volumes: - type: bind source: ./temp/seed2 @@ -78,9 +81,10 @@ services: ports: - "26665-26667:26656-26658" - "9096-9097:9090-9091" - - "8551-8552:8545-8546" + - "4551-4552:8545-8546" environment: - ID=3 + - CHAINID=berachain-localnet-666 volumes: - type: bind source: ./temp/seed3 @@ -89,6 +93,17 @@ services: localnet: ipv4_address: 192.168.10.13 + nginx: + container_name: nginx + image: nginx:latest + ports: + - "8545:80" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + networks: + localnet: + ipv4_address: 192.168.10.14 + networks: localnet: driver: bridge diff --git a/e2e/testapp/docker/network-init-2.sh b/e2e/testapp/docker/network-init-2.sh deleted file mode 100755 index 01be29f096..0000000000 --- a/e2e/testapp/docker/network-init-2.sh +++ /dev/null @@ -1,60 +0,0 @@ -# SPDX-License-Identifier: BUSL-1.1 -# -# Copyright (C) 2023, Berachain Foundation. All rights reserved. -# Use of this software is govered by the Business Source License included -# in the LICENSE file of this repository and at www.mariadb.com/bsl11. -# -# ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -# TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -# VERSIONS OF THE LICENSED WORK. -# -# THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -# LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -# LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -# -# TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -# AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -# EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -# TITLE. - -CONTAINER0="polard-node0" -CONTAINER1="polard-node1" -HOMEDIR="/root/.polard" -SCRIPTS="/scripts" - -rm -rf ./temp -mkdir ./temp -mkdir ./temp/seed0 -mkdir ./temp/seed1 -touch ./temp/genesis.json - -# init step 1 -docker exec $CONTAINER0 bash -c "$SCRIPTS/seed0-init-step1.sh" -docker exec $CONTAINER1 bash -c "$SCRIPTS/seed1-init-step1.sh seed-1" - -# copy genesis.json from seed-0 to seed-1 -docker cp $CONTAINER0:$HOMEDIR/config/genesis.json ./temp/genesis.json -docker cp ./temp/genesis.json $CONTAINER1:$HOMEDIR/config/genesis.json - -# init step 2 -docker exec $CONTAINER1 bash -c "$SCRIPTS/seed1-init-step2.sh seed-1" - -# copy genesis.json from seed-1 to seed-0 -docker cp $CONTAINER1:$HOMEDIR/config/genesis.json ./temp/genesis.json -docker cp ./temp/genesis.json $CONTAINER0:$HOMEDIR/config/genesis.json - -# copy gentx -docker cp $CONTAINER1:$HOMEDIR/config/gentx ./temp/gentx -docker cp ./temp/gentx $CONTAINER0:$HOMEDIR/config - -# init step 2 -docker exec $CONTAINER0 bash -c "$SCRIPTS/seed0-init-step2.sh" - -# copy genesis.json from seed-0 to seed-1 -docker cp $CONTAINER0:$HOMEDIR/config/genesis.json ./temp/genesis.json -docker cp ./temp/genesis.json $CONTAINER1:$HOMEDIR/config/genesis.json - -# start -# docker exec -it $CONTAINER0 bash -c "$SCRIPTS/seed-start.sh" -# docker exec -it $CONTAINER1 bash -c "$SCRIPTS/seed-start.sh" diff --git a/e2e/testapp/docker/network-init-4.sh b/e2e/testapp/docker/network-init-4.sh index 82a3ee3d5c..08d260ba28 100755 --- a/e2e/testapp/docker/network-init-4.sh +++ b/e2e/testapp/docker/network-init-4.sh @@ -23,7 +23,7 @@ CONTAINER1="polard-node1" CONTAINER2="polard-node2" CONTAINER3="polard-node3" -HOMEDIR="/root/.polard" +HOMEDIR="/.polard" SCRIPTS="/scripts" rm -rf ./temp diff --git a/e2e/testapp/docker/nginx.conf b/e2e/testapp/docker/nginx.conf new file mode 100644 index 0000000000..45a4e47486 --- /dev/null +++ b/e2e/testapp/docker/nginx.conf @@ -0,0 +1,19 @@ +events {} + +http { + upstream nodes { + server polard-node0:8545; + server polard-node1:8545; + server polard-node2:8545; + server polard-node3:8545; + } + + server { + listen 80; + location / { + proxy_pass http://nodes; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + } +} \ No newline at end of file diff --git a/e2e/testapp/docker/reset-temp.sh b/e2e/testapp/docker/reset-temp.sh old mode 100644 new mode 100755 diff --git a/e2e/testapp/docker/seed/init.sh b/e2e/testapp/docker/seed/init.sh new file mode 100755 index 0000000000..0ad79711ca --- /dev/null +++ b/e2e/testapp/docker/seed/init.sh @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: BUSL-1.1 +# +# Copyright (C) 2023, Berachain Foundation. All rights reserved. +# Use of this software is govered by the Business Source License included +# in the LICENSE file of this repository and at www.mariadb.com/bsl11. +# +# ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +# TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +# VERSIONS OF THE LICENSED WORK. +# +# THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +# LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +# LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +# +# TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +# AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +# EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +# TITLE. + +KEY="brick" +CHAINID="berachain-666" +MONIKER="brickchain" +KEYRING="test" +KEYALGO="eth_secp256k1" +LOGLEVEL="info" +HOMEDIR="data/.polard" +TRACE="" +GENESIS=$HOMEDIR/config/genesis.json +TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json + +if [ "$(ls -A $HOMEDIR)" ]; then + echo "$HOMEDIR is not empty" + polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" +else + echo "$HOMEDIR is empty, creating a new network" + + polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" + + jq '.app_state["staking"]["params"]["bond_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" + jq '.app_state["crisis"]["constant_fee"]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" + jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" + jq '.app_state["evm"]["params"]["evm_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" + jq '.app_state["mint"]["params"]["mint_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" + jq '.consensus["params"]["block"]["max_gas"]="30000000"' "$GENESIS" >"$TMP_GENESIS" + mv "$TMP_GENESIS" "$GENESIS" + + polard config set client keyring-backend $KEYRING --home "$HOMEDIR" + polard config set client chain-id "$CHAINID" --home "$HOMEDIR" + + polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" + + polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + + # polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + + polard genesis gentx $KEY 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" + + polard genesis collect-gentxs --home "$HOMEDIR" + + polard genesis validate-genesis --home "$HOMEDIR" + + polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" + polard start --pruning=nothing '' --log_level info --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home data/.polard +fi \ No newline at end of file diff --git a/e2e/testapp/docker/seed/scripts/get-seed-address.sh b/e2e/testapp/docker/seed/scripts/get-seed-address.sh index 6795b99a62..3b48b49314 100644 --- a/e2e/testapp/docker/seed/scripts/get-seed-address.sh +++ b/e2e/testapp/docker/seed/scripts/get-seed-address.sh @@ -18,7 +18,9 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -HOMEDIR="/root/.polard" +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi ip=$1 node_id=$(polard comet show-node-id --home "$HOMEDIR") diff --git a/e2e/testapp/docker/seed/scripts/liveness-probe.sh b/e2e/testapp/docker/seed/scripts/liveness-probe.sh new file mode 100644 index 0000000000..5b7e2a0494 --- /dev/null +++ b/e2e/testapp/docker/seed/scripts/liveness-probe.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# SPDX-License-Identifier: BUSL-1.1 +# +# Copyright (C) 2023, Berachain Foundation. All rights reserved. +# Use of this software is govered by the Business Source License included +# in the LICENSE file of this repository and at www.mariadb.com/bsl11. +# +# ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +# TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +# VERSIONS OF THE LICENSED WORK. +# +# THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +# LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +# LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +# +# TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +# AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +# EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +# TITLE. + + +# Execute the cURL command and capture the response +response=$(curl -s -X POST -H "Content-Type: application/json" -d '{ + "jsonrpc":"2.0", + "method": "eth_blockNumber", + "params": [], + "id": 1 +}' http://localhost:8545) + +height=$(echo "$response" | jq -r '.result') + +file="last_height.txt" + +# Check if the file exists +if [ -e "$file" ]; then + # Read the contents of the file into the result variable + last_height=$(cat "$file") +else + # File does not exist, set result to an empty string + last_height="" +fi + +rm $file +echo "$height" >> $file + +# Check if the two input strings are equal +if [ "$height" == "$last_height" ]; then + # Strings are equal, return 1 + exit 1 +else + # Strings are not equal, return 0 + exit 0 +fi diff --git a/e2e/testapp/docker/seed/scripts/readiness-probe.sh b/e2e/testapp/docker/seed/scripts/readiness-probe.sh new file mode 100644 index 0000000000..c13b71a70b --- /dev/null +++ b/e2e/testapp/docker/seed/scripts/readiness-probe.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# SPDX-License-Identifier: BUSL-1.1 +# +# Copyright (C) 2023, Berachain Foundation. All rights reserved. +# Use of this software is govered by the Business Source License included +# in the LICENSE file of this repository and at www.mariadb.com/bsl11. +# +# ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +# TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +# VERSIONS OF THE LICENSED WORK. +# +# THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +# LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +# LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +# +# TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +# AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +# EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +# TITLE. + + +# Execute the cURL command and capture the response +response=$(curl -s -X POST -H "Content-Type: application/json" -d '{ + "jsonrpc":"2.0", + "method": "eth_syncing", + "params": [], + "id": 1 +}' http://localhost:8545) + +# Check if the response contains the "result" field +if echo "$response" | grep -q '"result":.*false'; then + echo "Syncing is not in progress" + exit 0 # Exit with success code +else + echo "Syncing is in progress or port is not up" + exit 1 # Exit with failed code +fi diff --git a/e2e/testapp/docker/seed/scripts/reset.sh b/e2e/testapp/docker/seed/scripts/reset.sh index ea7153a5fd..f908f23333 100644 --- a/e2e/testapp/docker/seed/scripts/reset.sh +++ b/e2e/testapp/docker/seed/scripts/reset.sh @@ -18,4 +18,8 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -rm -rf /root/.polard \ No newline at end of file +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi + +rm -rf $HOMEDIR \ No newline at end of file diff --git a/e2e/testapp/docker/seed/scripts/seed-start.sh b/e2e/testapp/docker/seed/scripts/seed-start.sh index 8fcc427512..787637ec37 100644 --- a/e2e/testapp/docker/seed/scripts/seed-start.sh +++ b/e2e/testapp/docker/seed/scripts/seed-start.sh @@ -18,7 +18,11 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -HOMEDIR="/root/.polard" -LOGLEVEL="info" +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi +if [ -z "$LOGLEVEL" ]; then + LOGLEVEL="info" +fi -polard start --log_level $LOGLEVEL --minimum-gas-prices=0.0001abera --home "$HOMEDIR" +polard start --log_level $LOGLEVEL --minimum-gas-prices=0.0001abera --api.enable --home "$HOMEDIR" diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh index e860159922..4aa4cd5f09 100755 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh @@ -18,15 +18,24 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -apk add bash jq +if [ -z "$CHAINID" ]; then + CHAINID="brickchain-666" +fi +if [ -z "$KEYRING" ]; then + KEYRING="test" +fi +if [ -z "$KEYALGO" ]; then + KEYALGO="eth_secp256k1" +fi +if [ -z "$LOGLEVEL" ]; then + LOGLEVEL="info" +fi +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi -KEY1="seed0" -CHAINID="brickchain-666" +KEY1="seed-0" MONIKER1="seed-0" -KEYRING="test" -KEYALGO="eth_secp256k1" -LOGLEVEL="info" -HOMEDIR="/root/.polard" TRACE="" GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json @@ -37,14 +46,26 @@ polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" jq '.app_state["staking"]["params"]["bond_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; jq '.app_state["crisis"]["constant_fee"]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; -jq '.app_state["evm"]["params"]["evm_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; -jq '.app_state["mint"]["params"]["mint_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["min_deposit"][0]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["min_deposit"][0]["amount"]="10000000000000000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["expedited_min_deposit"][0]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["expedited_min_deposit"][0]["amount"]="20000000000000000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["max_deposit_period"]="300s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["voting_period"]="300s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["expedited_voting_period"]="240s"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["constitution"]="Honey is money."' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; jq '.consensus["params"]["block"]["max_gas"]="30000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; - +jq '.app_state["mint"]["params"]["mint_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +polard config set client chain-id $CHAINID --home "$HOMEDIR" polard config set client keyring-backend $KEYRING --home "$HOMEDIR" polard keys add $KEY1 --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" -polard genesis add-genesis-account $KEY1 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" +polard genesis add-genesis-account $KEY1 100000000000000000000000000abera,100000000000000000000000000stgusdc --keyring-backend $KEYRING --home "$HOMEDIR" -polard genesis gentx $KEY1 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" +polard genesis gentx $KEY1 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" \ + --moniker="seed-0" \ + --identity="identity of seed-0" \ + --details="This is seed-0" \ + --security-contact="brick@berachain.com" \ + --website="https://quantumwn.org/" diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh index ea8e2bef6b..6267490110 100644 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh @@ -18,8 +18,27 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -HOMEDIR="/root/.polard" +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi +if [ -z "$KEYRING" ]; then + KEYRING="test" +fi +if [ -z "$KEYALGO" ]; then + KEYALGO="eth_secp256k1" +fi + +HOMEDIR="/.polard" polard genesis collect-gentxs --home "$HOMEDIR" polard genesis validate-genesis --home "$HOMEDIR" + +# # faucet +# polard keys add faucet --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" +# polard genesis add-genesis-account faucet 1000000000000000000000000000abera,1000000000000000000000000000stgusdc --keyring-backend $KEYRING --home "$HOMEDIR" + +# # # Test Account +# # absurd surge gather author blanket acquire proof struggle runway attract cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite verb tank +# # 0xfffdbb37105441e14b0ee6330d855d8504ff39e705c3afa8f859ac9865f99306 +# polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 1000000000000000000000000000abera,1000000000000000000000000000stgusdc --keyring-backend $KEYRING --home "$HOMEDIR" diff --git a/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh b/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh index ce7444c725..0f784b4b7d 100644 --- a/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh +++ b/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh @@ -18,15 +18,24 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -apk add bash jq +if [ -z "$CHAINID" ]; then + CHAINID="brickchain-666" +fi +if [ -z "$KEYRING" ]; then + KEYRING="test" +fi +if [ -z "$KEYALGO" ]; then + KEYALGO="eth_secp256k1" +fi +if [ -z "$LOGLEVEL" ]; then + LOGLEVEL="info" +fi +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi KEY="$1" -CHAINID="brickchain-666" MONIKER="$1" -KEYRING="test" -KEYALGO="eth_secp256k1" -LOGLEVEL="info" -HOMEDIR="/root/.polard" TRACE="" GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json diff --git a/e2e/testapp/docker/seed/scripts/seed1-init-step2.sh b/e2e/testapp/docker/seed/scripts/seed1-init-step2.sh index cdb04e8754..b87252ccae 100644 --- a/e2e/testapp/docker/seed/scripts/seed1-init-step2.sh +++ b/e2e/testapp/docker/seed/scripts/seed1-init-step2.sh @@ -18,11 +18,23 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. +if [ -z "$CHAINID" ]; then + CHAINID="brickchain-666" +fi +if [ -z "$KEYRING" ]; then + KEYRING="test" +fi +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi + KEY="$1" -KEYRING="test" -CHAINID="brickchain-666" -HOMEDIR="/root/.polard" -polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" +polard genesis add-genesis-account $KEY 100000000000000000000000000abera,100000000000000000000000000stgusdc --keyring-backend $KEYRING --home "$HOMEDIR" -polard genesis gentx $KEY 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" +polard genesis gentx $KEY 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" \ + --moniker="$KEY" \ + --identity="identity of $KEY" \ + --details="This is $KEY" \ + --security-contact="brick@berachain.com" \ + --website="https://quantumwn.org/" diff --git a/e2e/testapp/docker/seed/scripts/set-persistent-peers.sh b/e2e/testapp/docker/seed/scripts/set-persistent-peers.sh new file mode 100644 index 0000000000..e0c83fc0eb --- /dev/null +++ b/e2e/testapp/docker/seed/scripts/set-persistent-peers.sh @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: BUSL-1.1 +# +# Copyright (C) 2023, Berachain Foundation. All rights reserved. +# Use of this software is govered by the Business Source License included +# in the LICENSE file of this repository and at www.mariadb.com/bsl11. +# +# ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +# TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +# VERSIONS OF THE LICENSED WORK. +# +# THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +# LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +# LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +# +# TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +# AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +# EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +# TITLE. + +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi + +CONFIG_TOML=$HOMEDIR/config/config.toml + +seed_address=$1 +sed -i "s/^persistent_peers = .*/persistent_peers = \"$seed_address\"/" "$CONFIG_TOML" diff --git a/e2e/testapp/docker/seed/scripts/set-seed-address.sh b/e2e/testapp/docker/seed/scripts/set-seed-address.sh index 9b6f2f3c75..1248cee7b8 100644 --- a/e2e/testapp/docker/seed/scripts/set-seed-address.sh +++ b/e2e/testapp/docker/seed/scripts/set-seed-address.sh @@ -18,7 +18,10 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. -HOMEDIR="/root/.polard" +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi + CONFIG_TOML=$HOMEDIR/config/config.toml seed_address=$1 diff --git a/e2e/testapp/docker/validator/scripts/val0-init-step1.sh b/e2e/testapp/docker/validator/scripts/val0-init-step1.sh index a255606746..1c5ce6f7a5 100644 --- a/e2e/testapp/docker/validator/scripts/val0-init-step1.sh +++ b/e2e/testapp/docker/validator/scripts/val0-init-step1.sh @@ -23,7 +23,7 @@ CHAINID="brickchain-666" MONIKER1="val-0" KEYRING="test" KEYALGO="eth_secp256k1" -HOMEDIR="/root/.polard" +HOMEDIR="/.polard" polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/docker/validator/scripts/val0-init-step2.sh b/e2e/testapp/docker/validator/scripts/val0-init-step2.sh index 2ec3ac76f3..489e93a989 100644 --- a/e2e/testapp/docker/validator/scripts/val0-init-step2.sh +++ b/e2e/testapp/docker/validator/scripts/val0-init-step2.sh @@ -20,6 +20,6 @@ KEY1="val0" KEYRING="test" -HOMEDIR="/root/.polard" +HOMEDIR="/.polard" polard genesis add-genesis-account $KEY1 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" diff --git a/e2e/testapp/docker/validator/scripts/val0-init-step3.sh b/e2e/testapp/docker/validator/scripts/val0-init-step3.sh index 2b85709706..9a8d75a343 100644 --- a/e2e/testapp/docker/validator/scripts/val0-init-step3.sh +++ b/e2e/testapp/docker/validator/scripts/val0-init-step3.sh @@ -20,7 +20,7 @@ KEY1="val0" KEYRING="test" -HOMEDIR="/root/.polard" +HOMEDIR="/.polard" VAL_JSON="$HOMEDIR/config/validator.json" # Generating a JSON string (https://stackoverflow.com/a/48470227) diff --git a/e2e/testapp/docker/validator/scripts/val1-init-step1.sh b/e2e/testapp/docker/validator/scripts/val1-init-step1.sh index 77706db0fc..e11b397216 100644 --- a/e2e/testapp/docker/validator/scripts/val1-init-step1.sh +++ b/e2e/testapp/docker/validator/scripts/val1-init-step1.sh @@ -23,7 +23,7 @@ CHAINID="brickchain-666" MONIKER1="val-1" KEYRING="test" KEYALGO="eth_secp256k1" -HOMEDIR="/root/.polard" +HOMEDIR="/.polard" polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/docker/validator/scripts/val1-init-step2.sh b/e2e/testapp/docker/validator/scripts/val1-init-step2.sh index 2f364dac0b..ec558fd2b3 100644 --- a/e2e/testapp/docker/validator/scripts/val1-init-step2.sh +++ b/e2e/testapp/docker/validator/scripts/val1-init-step2.sh @@ -20,6 +20,6 @@ KEY1="val1" KEYRING="test" -HOMEDIR="/root/.polard" +HOMEDIR="/.polard" polard genesis add-genesis-account $KEY1 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" From 5a93af91c50c12145370acc69d18749d36d15474 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 6 Oct 2023 14:54:17 -0400 Subject: [PATCH 070/122] feat(abci): Utilize geth `miner` to build blocks (#1165) ### Summary by CodeRabbit - New Feature: Introduced a new "miner" package that implements Ethereum mining operations, enhancing the blockchain's functionality. - Refactor: Updated function calls within the `Polaris` struct to use the new `spminer` object, reflecting a change in the mining mechanism. - Refactor: Renamed the `Broadcaster` interface to `TxBroadcaster` and updated related functions and structures accordingly for better clarity. - New Feature: Added new functions to the `Polaris` struct including `SPMiner()`, `MinerChain()`, and `IsLocalBlock()` to enhance block management capabilities. - Bug Fix: Modified JSON responses for the `eth_getBlockByNumber` RPC call to correctly represent data size and withdrawals. - Refactor: Shifted from using a blockchain object to a miner object for operations in `backend.go`, improving code organization. - Refactor: Replaced references to `app.InterfaceRegistry()` with `app.interfaceRegistry` and `ctx.KVStore` with `ctx.UnsafeFindStoreKey` for improved code efficiency. --- cosmos/abci/prepare/prepare.go | 134 -- cosmos/miner/miner.go | 138 ++ cosmos/{cosmos.go => miner/miner_test.go} | 30 +- cosmos/x/evm/keeper/abci.go | 4 +- cosmos/x/evm/keeper/host.go | 2 + cosmos/x/evm/keeper/processor.go | 2 +- .../tests/eth_getBlockByNumber/get-block-n.io | 2 +- .../get-block-notfound.io | 2 + .../tests/eth_getBlockByNumber/get-genesis.io | 2 +- e2e/testapp/app.go | 16 +- e2e/testapp/go.sum | 1353 ----------------- eth/consensus/dummy_eth_one.go | 119 ++ eth/core/chain.go | 7 +- eth/core/chain_reader.go | 52 +- eth/core/chain_subscriber.go | 6 - eth/core/chain_writer.go | 12 + eth/core/state/statedb.go | 4 +- eth/core/types/imported.go | 2 + eth/miner/miner.go | 1 + eth/polar/backend.go | 24 +- eth/polar/mining.go | 6 +- eth/polar/polaris.go | 42 +- go.work.sum | 217 +++ 23 files changed, 599 insertions(+), 1578 deletions(-) delete mode 100644 cosmos/abci/prepare/prepare.go create mode 100644 cosmos/miner/miner.go rename cosmos/{cosmos.go => miner/miner_test.go} (70%) create mode 100644 e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-notfound.io create mode 100644 eth/consensus/dummy_eth_one.go diff --git a/cosmos/abci/prepare/prepare.go b/cosmos/abci/prepare/prepare.go deleted file mode 100644 index d35704af95..0000000000 --- a/cosmos/abci/prepare/prepare.go +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package prepare - -import ( - abci "github.com/cometbft/cometbft/abci/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/miner" - - "pkg.berachain.dev/polaris/eth/polar" -) - -type ( - // ProposalTxVerifier defines the interface that is implemented by BaseApp, - // that any custom ABCI PrepareProposal and ProcessProposal handler can use - // to verify a transaction. - TxVerifier interface { - PrepareProposalVerifyTx(tx sdk.Tx) ([]byte, error) - ProcessProposalVerifyTx(txBz []byte) (sdk.Tx, error) - } -) - -// TxSerializer provides an interface to Serialize Geth Transactions to Bytes (via sdk.Tx). -type TxSerializer interface { - SerializeToSdkTx(signedTx *types.Transaction) (sdk.Tx, error) -} - -// Handler provides the PrepareProposal function to allow a cosmos app to utilize the -// geth txpool. -type Handler struct { - polaris *polar.Polaris - txVerifier TxVerifier - serializer TxSerializer -} - -// NewHandler returns a new Handler. -func NewHandler(polaris *polar.Polaris, txVerifier TxVerifier) *Handler { - return &Handler{ - polaris: polaris, - txVerifier: txVerifier, - } -} - -// Init initializes the handler. -func (h *Handler) Init(serializer TxSerializer) { - h.serializer = serializer -} - -// PrepareProposal implements baseapp.PrepareProposalHandler. -func (h *Handler) PrepareProposal( - ctx sdk.Context, req *abci.RequestPrepareProposal, -) (*abci.ResponsePrepareProposal, error) { - var maxBlockGas int64 - if b := ctx.ConsensusParams().Block; b != nil { - maxBlockGas = b.MaxGas - } - - var ( - selectedTxs [][]byte - totalTxBytes int64 - totalTxGas uint64 - ) - txs := h.txPoolTransactions() - - for lazyTx := txs.Peek(); lazyTx != nil; lazyTx = txs.Peek() { - tx := lazyTx.Resolve() - sdkTx, err := h.serializer.SerializeToSdkTx(tx) - if err != nil { - ctx.Logger().Error("Failed sdk.Tx Serialization", tx.Hash(), err) - continue - } - - var bz []byte - bz, _ = h.txVerifier.PrepareProposalVerifyTx(sdkTx) - txGasLimit := tx.Gas() - txSize := int64(len(bz)) - - // only add the transaction to the proposal if we have enough capacity - if (txSize + totalTxBytes) < req.MaxTxBytes { - // If there is a max block gas limit, add the tx only if the limit has - // not been met. - if maxBlockGas > 0 { - if (txGasLimit + totalTxGas) <= uint64(maxBlockGas) { - totalTxGas += txGasLimit - totalTxBytes += txSize - selectedTxs = append(selectedTxs, bz) - } - } else { - totalTxBytes += txSize - selectedTxs = append(selectedTxs, bz) - } - } - - // Check if we've reached capacity. If so, we cannot select any more - // transactions. - if totalTxBytes >= req.MaxTxBytes || - (maxBlockGas > 0 && (totalTxGas >= uint64(maxBlockGas))) { - break - } - - // Shift the transaction off the queue. - txs.Shift() - } - - return &abci.ResponsePrepareProposal{Txs: selectedTxs}, nil -} - -// txPoolTransactions returns a sorted list of transactions from the txpool. -func (h *Handler) txPoolTransactions() *miner.TransactionsByPriceAndNonce { - return miner.NewTransactionsByPriceAndNonce(types.LatestSigner( - h.polaris.Host().GetConfigurationPlugin().ChainConfig(), - ), h.polaris.TxPool().Pending(false), h.polaris.Miner().NextBaseFee()) -} diff --git a/cosmos/miner/miner.go b/cosmos/miner/miner.go new file mode 100644 index 0000000000..fdd20854cb --- /dev/null +++ b/cosmos/miner/miner.go @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +// Package miner implements the Ethereum miner. +package miner + +import ( + "context" + + abci "github.com/cometbft/cometbft/abci/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/miner" + + evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/core/types" +) + +// emptyHash is a common.Hash initialized to all zeros. +var emptyHash = common.Hash{} + +// Miner implements the baseapp.TxSelector interface. +type Miner struct { + *miner.Miner + serializer evmtypes.TxSerializer + currentPayload *miner.Payload +} + +// New produces a cosmos miner from a geth miner. +func New(gm *miner.Miner) *Miner { + return &Miner{ + Miner: gm, + } +} + +// Init sets the transaction serializer. +func (m *Miner) Init(serializer evmtypes.TxSerializer) { + m.serializer = serializer +} + +// PrepareProposal implements baseapp.PrepareProposal. +func (m *Miner) PrepareProposal( + ctx sdk.Context, _ *abci.RequestPrepareProposal, +) (*abci.ResponsePrepareProposal, error) { + var txs [][]byte + var err error + if txs, err = m.buildBlock(ctx); err != nil { + return nil, err + } + return &abci.ResponsePrepareProposal{Txs: txs}, err +} + +// buildBlock builds and submits a payload, it also waits for the txs +// to resolve from the underying worker. +func (m *Miner) buildBlock(ctx sdk.Context) ([][]byte, error) { + defer m.clearPayload() + if err := m.submitPayloadForBuilding(ctx); err != nil { + return nil, err + } + return m.resolveTxs(), nil +} + +// submitPayloadForBuilding submits a payload for building. +func (m *Miner) submitPayloadForBuilding(ctx context.Context) error { + var ( + err error + payload *miner.Payload + sCtx = sdk.UnwrapSDKContext(ctx) + ) + + // Build Payload + if payload, err = m.BuildPayload(m.constructPayloadArgs(sCtx)); err != nil { + sCtx.Logger().Error("failed to build payload", "err", err) + return err + } + m.currentPayload = payload + sCtx.Logger().Info("submitted payload for building") + return nil +} + +// constructPayloadArgs builds a payload to submit to the miner. +func (m *Miner) constructPayloadArgs(ctx sdk.Context) *miner.BuildPayloadArgs { + return &miner.BuildPayloadArgs{ + Timestamp: uint64(ctx.BlockTime().Unix()), + FeeRecipient: common.Address{}, /* todo: set etherbase */ + Random: common.Hash{}, /* todo: generated random */ + Withdrawals: make(types.Withdrawals, 0), + BeaconRoot: &emptyHash, + } +} + +// resolveTxs resolves the transactions from the payload. +func (m *Miner) resolveTxs() [][]byte { + if m.currentPayload == nil { + return nil + } + envelope := m.currentPayload.ResolveFull() + ethTxBzs := envelope.ExecutionPayload.Transactions + txs := make([][]byte, len(envelope.ExecutionPayload.Transactions)) + + // encode to sdk.txs and then + for i, ethTxBz := range ethTxBzs { + var tx types.Transaction + if err := tx.UnmarshalBinary(ethTxBz); err != nil { + return nil + } + bz, err := m.serializer.SerializeToBytes(&tx) + if err != nil { + panic(err) + } + txs[i] = bz + } + return txs +} + +// clearPayload clears the payload. +func (m *Miner) clearPayload() { + m.currentPayload = nil +} diff --git a/cosmos/cosmos.go b/cosmos/miner/miner_test.go similarity index 70% rename from cosmos/cosmos.go rename to cosmos/miner/miner_test.go index ac123cf2e3..527ef815bf 100644 --- a/cosmos/cosmos.go +++ b/cosmos/miner/miner_test.go @@ -18,4 +18,32 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package cosmos +package miner + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestMiner(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/miner") +} + +var _ = Describe("", func() { + + var ( + // t = GinkgoT() + // txPool *mocks.GethTxPool + // sdkTx *mocks.SdkTx + // mempool *Miner + // ctx = context.Background() + ) + + BeforeEach(func() { + // mempool = &Miner{} + }) + +}) diff --git a/cosmos/x/evm/keeper/abci.go b/cosmos/x/evm/keeper/abci.go index eadf27e392..b2610cfb10 100644 --- a/cosmos/x/evm/keeper/abci.go +++ b/cosmos/x/evm/keeper/abci.go @@ -28,11 +28,11 @@ import ( func (k *Keeper) BeginBlocker(ctx context.Context) error { // Prepare the Polaris Ethereum block. - _ = k.polaris.Miner().Prepare(ctx, uint64(sdk.UnwrapSDKContext(ctx).BlockHeight())) + _ = k.polaris.SPMiner().Prepare(ctx, uint64(sdk.UnwrapSDKContext(ctx).BlockHeight())) return nil } func (k *Keeper) EndBlock(ctx context.Context) error { // Finalize the Polaris Ethereum block. - return k.polaris.Miner().Finalize(ctx) + return k.polaris.SPMiner().Finalize(ctx) } diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index e835cd135b..3b54844648 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -106,9 +106,11 @@ func NewHost( func (h *host) SetupPrecompiles() error { // Set the query context function for the block and state plugins pcs := h.pcs().GetPrecompiles() + if err := h.pp.RegisterPrecompiles(pcs); err != nil { return err } + h.sp.SetPrecompileLogFactory(pclog.NewFactory(pcs)) return nil } diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 314de5f509..336b66e443 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -43,7 +43,7 @@ func (k *Keeper) ProcessTransaction( "reset gas meter prior to ethereum state transition") // Process the transaction and return the EVM's execution result. - receipt, err := k.polaris.Miner().ProcessTransaction(ctx, tx) + receipt, err := k.polaris.SPMiner().ProcessTransaction(ctx, tx) if err != nil { k.Logger(sCtx).Error("failed to process transaction", "err", err) return nil, err diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-n.io b/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-n.io index 34e2b43488..f4bb16a991 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-n.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-n.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["0x0",true]} -<< {"jsonrpc":"2.0","id":1,"result":{"baseFeePerGas":"0x3b9aca00","difficulty":"0x1","extraData":"0x","gasLimit":"0x4c4b40","gasUsed":"0x0","hash":"0x1fc027d65f820d3eef441ebeec139ebe09e471cf98516dce7b5643ccb27f418c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x21e","stateRoot":"0x078dc6061b1d8eaa8493384b59c9c65ceb917201221d08b80c4de6770b6ec7e7","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals": null,"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}} +<< {"jsonrpc":"2.0","id":1,"result":{"baseFeePerGas":"0x3b9aca00","difficulty":"0x1","extraData":"0x","gasLimit":"0x4c4b40","gasUsed":"0x0","hash":"0x1fc027d65f820d3eef441ebeec139ebe09e471cf98516dce7b5643ccb27f418c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x21f","stateRoot":"0x078dc6061b1d8eaa8493384b59c9c65ceb917201221d08b80c4de6770b6ec7e7","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals": [],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}} diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-notfound.io b/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-notfound.io new file mode 100644 index 0000000000..44bfc6b192 --- /dev/null +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-block-notfound.io @@ -0,0 +1,2 @@ +>> {"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["0x3e8",true]} +<< {"jsonrpc":"2.0","id":1,"result":null} \ No newline at end of file diff --git a/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-genesis.io b/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-genesis.io index 34e2b43488..f4bb16a991 100644 --- a/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-genesis.io +++ b/e2e/hive/simulators/rpc-compat/tests/eth_getBlockByNumber/get-genesis.io @@ -1,2 +1,2 @@ >> {"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["0x0",true]} -<< {"jsonrpc":"2.0","id":1,"result":{"baseFeePerGas":"0x3b9aca00","difficulty":"0x1","extraData":"0x","gasLimit":"0x4c4b40","gasUsed":"0x0","hash":"0x1fc027d65f820d3eef441ebeec139ebe09e471cf98516dce7b5643ccb27f418c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x21e","stateRoot":"0x078dc6061b1d8eaa8493384b59c9c65ceb917201221d08b80c4de6770b6ec7e7","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals": null,"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}} +<< {"jsonrpc":"2.0","id":1,"result":{"baseFeePerGas":"0x3b9aca00","difficulty":"0x1","extraData":"0x","gasLimit":"0x4c4b40","gasUsed":"0x0","hash":"0x1fc027d65f820d3eef441ebeec139ebe09e471cf98516dce7b5643ccb27f418c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x21f","stateRoot":"0x078dc6061b1d8eaa8493384b59c9c65ceb917201221d08b80c4de6770b6ec7e7","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals": [],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}} diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index ae0e79d30a..889ed92b59 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -56,9 +56,9 @@ import ( "github.com/ethereum/go-ethereum/node" - "pkg.berachain.dev/polaris/cosmos/abci/prepare" evmconfig "pkg.berachain.dev/polaris/cosmos/config" ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" + "pkg.berachain.dev/polaris/cosmos/miner" "pkg.berachain.dev/polaris/cosmos/txpool" evmante "pkg.berachain.dev/polaris/cosmos/x/evm/ante" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -98,8 +98,10 @@ type SimApp struct { // polaris keepers EVMKeeper *evmkeeper.Keeper - pp *prepare.Handler - mp *txpool.Mempool + + // polaris componets + mm *miner.Miner + mp *txpool.Mempool } //nolint:gochecknoinits // from sdk. @@ -198,9 +200,9 @@ func NewPolarisApp( app.mp = txpool.New(app.EVMKeeper.Polaris().TxPool()) app.SetMempool(app.mp) - // Setup Prepare Proposal - app.pp = prepare.NewHandler(app.EVMKeeper.Polaris(), app) - app.SetPrepareProposal(app.pp.PrepareProposal) + // Setup Miner Wrapper + app.mm = miner.New(app.EVMKeeper.Polaris().Miner()) + app.SetPrepareProposal(app.mm.PrepareProposal) // Setup Custom Ante Handler ch, _ := evmante.NewAnteHandler( @@ -281,7 +283,7 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon serializer := evmtypes.NewSerializer(apiSvr.ClientCtx.TxConfig) // Initialize services. - app.pp.Init(serializer) + app.mm.Init(serializer) app.mp.Init(app.Logger(), apiSvr.ClientCtx, serializer) // Register services with Polaris. diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index e9b46e70f9..2a7c7f0d58 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -277,1629 +277,276 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= -github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= -github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= -github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= -github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= -github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= -github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= -github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= -github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= -github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= -github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= -github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= -github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= -github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= -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/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= -github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= -github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= -github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= -github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= -github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= -github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -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= github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= -github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= -github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= -github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= -github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= -github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= -github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/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.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= -github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= -github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= -github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/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/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= -github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= -github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= -golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -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= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -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= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -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= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd h1:TZSUZb9hGRwhYLFGuU5+vxyPzuNnjLWWST7Gv03Se84= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/eth/consensus/dummy_eth_one.go b/eth/consensus/dummy_eth_one.go new file mode 100644 index 0000000000..3c4e819b72 --- /dev/null +++ b/eth/consensus/dummy_eth_one.go @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. +// +//nolint:revive // boilerplate for now. +package consensus + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/trie" + + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/core/state" + "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/rpc" +) + +type Engine consensus.Engine + +// DummyEthOne is a dummy implementation of the consensus.Engine interface. +var _ Engine = (*DummyEthOne)(nil) + +// DummyEthOne is a mock implementation of the Engine interface. +type DummyEthOne struct{} + +// Author is a mock implementation. +func (m *DummyEthOne) Author(header *types.Header) (common.Address, error) { + return common.Address{}, nil +} + +// VerifyHeader is a mock implementation. +func (m *DummyEthOne) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header) error { + // Set the correct difficulty + header.Difficulty = new(big.Int).SetUint64(1) + return nil +} + +// VerifyHeaders is a mock implementation. +func (m *DummyEthOne) VerifyHeaders( + chain consensus.ChainHeaderReader, headers []*types.Header) (chan<- struct{}, <-chan error) { + for _, h := range headers { + if err := m.VerifyHeader(chain, h); err != nil { + return nil, nil + } + } + return nil, nil +} + +// VerifyUncles is a mock implementation. +func (m *DummyEthOne) VerifyUncles(chain consensus.ChainReader, block *types.Block) error { + return nil +} + +// Prepare is a mock implementation. +func (m *DummyEthOne) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error { + header.Difficulty = new(big.Int).SetUint64(0) + return nil +} + +// Finalize is a mock implementation. +func (m *DummyEthOne) Finalize(chain consensus.ChainHeaderReader, + header *types.Header, state state.StateDB, txs []*types.Transaction, + uncles []*types.Header, withdrawals []*types.Withdrawal) { +} + +// FinalizeAndAssemble is a mock implementation. +func (m *DummyEthOne) FinalizeAndAssemble(chain consensus.ChainHeaderReader, + header *types.Header, state state.StateDB, txs []*types.Transaction, + uncles []*types.Header, receipts []*types.Receipt, + withdrawals []*types.Withdrawal) (*types.Block, error) { + return types.NewBlock(header, txs, uncles, receipts, trie.NewStackTrie(nil)), nil +} + +// Seal is a mock implementation. +func (m *DummyEthOne) Seal(chain consensus.ChainHeaderReader, + block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + sealedBlock := block // .seal() + results <- sealedBlock + return nil +} + +// SealHash is a mock implementation. +func (m *DummyEthOne) SealHash(header *types.Header) common.Hash { + return header.Hash() +} + +// CalcDifficulty is a mock implementation. +func (m *DummyEthOne) CalcDifficulty(chain consensus.ChainHeaderReader, + time uint64, parent *types.Header) *big.Int { + return big.NewInt(0) +} + +// APIs is a mock implementation. +func (m *DummyEthOne) APIs(chain consensus.ChainHeaderReader) []rpc.API { + return nil +} + +// Close is a mock implementation. +func (m *DummyEthOne) Close() error { + return nil +} diff --git a/eth/core/chain.go b/eth/core/chain.go index d69844681c..aa013ef0ab 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -21,10 +21,12 @@ package core import ( + "math/big" "sync/atomic" lru "github.com/ethereum/go-ethereum/common/lru" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/trie" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state" @@ -118,7 +120,10 @@ func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used logger: log.Root(), } bc.statedb = state.NewStateDB(bc.sp, bc.pp) - bc.currentBlock.Store(nil) + // TODO: hmm... + bc.currentBlock.Store( + types.NewBlock(&types.Header{Number: big.NewInt(0), + BaseFee: big.NewInt(0)}, nil, nil, nil, trie.NewStackTrie(nil))) bc.finalizedBlock.Store(nil) return bc diff --git a/eth/core/chain_reader.go b/eth/core/chain_reader.go index 5dcbe8371f..439f0e2ae2 100644 --- a/eth/core/chain_reader.go +++ b/eth/core/chain_reader.go @@ -48,9 +48,7 @@ type ChainBlockReader interface { GetBlockByNumber(uint64) *types.Block GetTransactionLookup(common.Hash) *types.TxLookupEntry GetTd(common.Hash, uint64) *big.Int - - // THIS SHOULD BE MOVED TO A "MINER" TYPE THING - PendingBlockAndReceipts() (*types.Block, types.Receipts) + HasBlock(common.Hash, uint64) bool } // ========================================================================= @@ -103,44 +101,6 @@ func (bc *blockchain) CurrentSafeBlock() *types.Header { return bc.CurrentFinalBlock() } -// PendingBlockAndReceipts returns the pending block and receipts of the blockchain. -// TODO: move to the miner. Currently returns the "current" finalized block and receipts. -func (bc *blockchain) PendingBlockAndReceipts() (*types.Block, types.Receipts) { - var err error - - // Get current block. - header := bc.CurrentHeader() - if header == nil { - bc.logger.Error("current header is nil") - return nil, nil - } - - // Get receipts from cache. - receipts, ok := utils.GetAs[types.Receipts](bc.currentReceipts.Load()) - if receipts == nil || !ok { - bc.logger.Error("current receipts are nil") - return nil, nil - } - - // Derive receipts from block. - receipts, err = bc.deriveReceipts(receipts, header.Hash()) - if err != nil { - bc.logger.Error("failed to derive receipts", "err", err) - return nil, nil - } - - // Get block - block := bc.GetBlock(header.Hash(), header.Number.Uint64()) - if block == nil { - bc.logger.Error("failed to get block", "hash", header.Hash(), "number", header.Number.Uint64()) - return nil, nil - } - - // Add to cache. - bc.receiptsCache.Add(block.Hash(), receipts) - return block, receipts -} - // GetBlock returns a block by its hash or number. func (bc *blockchain) GetBlock(hash common.Hash, number uint64) *types.Block { if block := bc.GetBlockByHash(hash); block != nil { @@ -313,3 +273,13 @@ func (bc *blockchain) GetTd(hash common.Hash, number uint64) *big.Int { } return block.Difficulty() } + +// HasBlock returns true if the blockchain contains a block with the given +// hash or number. +func (bc *blockchain) HasBlock(hash common.Hash, number uint64) bool { + b := bc.GetBlockByNumber(number) + if b == nil { + b = bc.GetBlockByHash(hash) + } + return b != nil +} diff --git a/eth/core/chain_subscriber.go b/eth/core/chain_subscriber.go index c410704c8b..27b31ab980 100644 --- a/eth/core/chain_subscriber.go +++ b/eth/core/chain_subscriber.go @@ -32,7 +32,6 @@ type ChainSubscriber interface { SubscribeChainHeadEvent(chan<- ChainHeadEvent) event.Subscription SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription // currently not used SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription - SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription } // SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. @@ -59,8 +58,3 @@ func (bc *blockchain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Su func (bc *blockchain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return bc.scope.Track(bc.logsFeed.Subscribe(ch)) } - -// SubscribePendingLogsEvent registers a subscription of []*types.Log. -func (bc *blockchain) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { - return bc.scope.Track(bc.pendingLogsFeed.Subscribe(ch)) -} diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 7a07b61f55..7ef90576c6 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -21,12 +21,24 @@ package core import ( + "github.com/ethereum/go-ethereum/core" + + "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" ) // ChainWriter defines methods that are used to perform state and block transitions. type ChainWriter interface { InsertBlock(block *types.Block, receipts types.Receipts, logs []*types.Log) error + WriteBlockAndSetHead(block *types.Block, receipts []*types.Receipt, logs []*types.Log, + state state.StateDB, emitHeadEvent bool) (status core.WriteStatus, err error) +} + +// WriteBlockAndSetHead is a no-op in the current implementation. Potentially usable later. +func (*blockchain) WriteBlockAndSetHead( + _ *types.Block, _ []*types.Receipt, _ []*types.Log, _ state.StateDB, + _ bool) (core.WriteStatus, error) { + return core.NonStatTy, nil } // InsertBlock inserts a block into the canonical chain and updates the state of the blockchain. diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index b8708f2fbd..8610636b22 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -61,9 +61,9 @@ type stateDB struct { type ( // StateDB is an alias for StateDBI. - StateDB = state.StateDBI //nolint:revive // to match geth. + StateDB = state.StateDBI //nolint:revive // to match geth naming. - // PolarStateDB is a Polaris StateDB with a context. + // PolarStateDB is a Polaris StateDB that has a context. PolarStateDB interface { StateDB GetContext() context.Context diff --git a/eth/core/types/imported.go b/eth/core/types/imported.go index cc0cc17271..f998461c97 100644 --- a/eth/core/types/imported.go +++ b/eth/core/types/imported.go @@ -44,6 +44,8 @@ type ( LegacyTx = types.LegacyTx TxData = types.TxData Signer = types.Signer + Withdrawal = types.Withdrawal + Withdrawals = types.Withdrawals ) var ( diff --git a/eth/miner/miner.go b/eth/miner/miner.go index d0586aea29..c55287a128 100644 --- a/eth/miner/miner.go +++ b/eth/miner/miner.go @@ -65,6 +65,7 @@ type Miner interface { } // miner implements the Miner interface. +// TODO: RENAME TO STATE PROCESSOR OR DEPRECATE. type miner struct { backend Backend chain core.Blockchain diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 2ffe6a7cc0..07f6476cb4 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -229,12 +229,8 @@ func (b *backend) BlockByNumber(_ context.Context, number rpc.BlockNumber) (*typ // Pending block is only known by the miner switch number { case rpc.PendingBlockNumber: - // block := b.eth.miner.PendingBlock() - // return block, nil - // TODO: handling pending in the miner. - header := b.polar.blockchain.CurrentBlock() - return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - + block := b.polar.miner.PendingBlock() + return block, nil // Otherwise resolve and return the block case rpc.LatestBlockNumber: header := b.polar.blockchain.CurrentBlock() @@ -297,13 +293,11 @@ func (b *backend) StateAndHeaderByNumber( ctx context.Context, number rpc.BlockNumber, ) (state.StateDB, *types.Header, error) { - // TODO: handling pending better - // // Pending state is only known by the miner - // if number == rpc.PendingBlockNumber { - // block, state := b.eth.miner.Pending() - // return state, block.Header(), nil - // } - + // Pending state is only known by the miner + if number == rpc.PendingBlockNumber { + block, state := b.polar.miner.Pending() + return state, block.Header(), nil + } // Otherwise resolve the block number and return its state header, err := b.HeaderByNumber(ctx, number) if err != nil { @@ -368,7 +362,7 @@ func (b *backend) GetTransaction( // PendingBlockAndReceipts returns the pending block (equivalent to current block in Polaris) // and associated receipts. func (b *backend) PendingBlockAndReceipts() (*types.Block, types.Receipts) { - block, receipts := b.polar.blockchain.PendingBlockAndReceipts() + block, receipts := b.polar.miner.PendingBlockAndReceipts() // If the block is non-existent, return nil. // This is to maintain parity with the behavior of the geth backend. if block == nil { @@ -550,7 +544,7 @@ func (b *backend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription } func (b *backend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { - return b.polar.blockchain.SubscribePendingLogsEvent(ch) + return b.polar.miner.SubscribePendingLogs(ch) } func (b *backend) BloomStatus() (uint64, uint64) { diff --git a/eth/polar/mining.go b/eth/polar/mining.go index d28b2a0d5a..228700b82b 100644 --- a/eth/polar/mining.go +++ b/eth/polar/mining.go @@ -29,7 +29,7 @@ import ( // TODO: replace this file with a proper mining object and use message passing // Prepare prepares the Polaris chain for processing a new block at the given height. func (pl *Polaris) Prepare(ctx context.Context, number uint64) { - header := pl.miner.Prepare(ctx, number) + header := pl.spminer.Prepare(ctx, number) if header == nil { panic("blockchain produced nil header") } @@ -40,10 +40,10 @@ func (pl *Polaris) ProcessTransaction( ctx context.Context, tx *types.Transaction, ) (*types.Receipt, error) { - return pl.miner.ProcessTransaction(ctx, tx) + return pl.spminer.ProcessTransaction(ctx, tx) } // Finalize finalizes the current block. func (pl *Polaris) Finalize(ctx context.Context) error { - return pl.miner.Finalize(ctx) + return pl.spminer.Finalize(ctx) } diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index 31b8b71c67..18fbb871d2 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -30,11 +30,15 @@ import ( "github.com/ethereum/go-ethereum/core/txpool/legacypool" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" + "pkg.berachain.dev/polaris/eth/consensus" "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/log" - "pkg.berachain.dev/polaris/eth/miner" + oldminer "pkg.berachain.dev/polaris/eth/miner" polarapi "pkg.berachain.dev/polaris/eth/polar/api" "pkg.berachain.dev/polaris/eth/rpc" ) @@ -48,9 +52,9 @@ var defaultEthConfig = ethconfig.Config{ FilterLogCacheSize: 0, } -// NetworkingStack defines methods that allow a Polaris chain to build and expose JSON-RPC apis. +// NetworkingStack defines methods that allow a Polaris chain to build and expose JSON-RPC API. type NetworkingStack interface { - // IsExtRPCEnabled returns true if the networking stack is configured to expose JSON-RPC APIs. + // IsExtRPCEnabled returns true if the networking stack is configured to expose JSON-RPC API. ExtRPCEnabled() bool // RegisterHandler manually registers a new handler into the networking stack. @@ -81,7 +85,8 @@ type Polaris struct { host core.PolarisHostChain blockchain core.Blockchain txPool *txpool.TxPool - miner miner.Miner + spminer oldminer.Miner + miner *miner.Miner // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs // and the core pieces. @@ -89,6 +94,7 @@ type Polaris struct { // engine represents the consensus engine for the backend. engine core.EnginePlugin + beacon consensus.Engine // filterSystem is the filter system that is used by the filter API. // TODO: relocate @@ -107,6 +113,7 @@ func NewWithNetworkingStack( stack: stack, host: host, engine: host.GetEnginePlugin(), + beacon: &consensus.DummyEthOne{}, } // When creating a Polaris EVM, we allow the implementing chain // to specify their own log handler. If logHandler is nil then we @@ -127,8 +134,7 @@ func NewWithNetworkingStack( // Init initializes the Polaris struct. func (pl *Polaris) Init() error { var err error - pl.miner = miner.New(pl) - // eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) + pl.spminer = oldminer.New(pl) // For now, we only have a legacy pool, we will implement blob pool later. legacyPool := legacypool.New( @@ -144,9 +150,12 @@ func (pl *Polaris) Init() error { return err } - // eth.miner = miner.New(eth, - // &config.Miner, eth.blockchain.Config(), eth.EventMux(), eth.engine, eth.isLocalBlock) - + mux := new(event.TypeMux) //nolint:staticcheck // deprecated but still in geth. + // TODO: miner config to app.toml + pl.miner = miner.New(pl, &pl.cfg.Miner, + pl.host.GetConfigurationPlugin().ChainConfig(), mux, pl.beacon, pl.IsLocalBlock) + // extra data must be nil until 1 block 1 transaction. + // eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) // Build and set the RPC Backend and other services. // if eth.APIBackend.allowUnprotectedTxs { @@ -205,14 +214,27 @@ func (pl *Polaris) Host() core.PolarisHostChain { return pl.host } -func (pl *Polaris) Miner() miner.Miner { +func (pl *Polaris) Miner() *miner.Miner { return pl.miner } +func (pl *Polaris) SPMiner() oldminer.Miner { + return pl.spminer +} + func (pl *Polaris) TxPool() *txpool.TxPool { return pl.txPool } +func (pl *Polaris) MinerChain() miner.BlockChain { + return pl.blockchain +} + func (pl *Polaris) Blockchain() core.Blockchain { return pl.blockchain } + +func (pl *Polaris) IsLocalBlock(_ *types.Header) bool { + // Unused. + return true +} diff --git a/go.work.sum b/go.work.sum index b05dc88f5d..1bcf286c81 100644 --- a/go.work.sum +++ b/go.work.sum @@ -433,6 +433,7 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= @@ -447,6 +448,7 @@ github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMr github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= @@ -466,6 +468,7 @@ github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= @@ -485,8 +488,10 @@ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= +github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= @@ -504,6 +509,8 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaI github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= @@ -560,11 +567,36 @@ github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= @@ -576,10 +608,13 @@ github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtX github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= @@ -612,6 +647,8 @@ github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= @@ -643,6 +680,7 @@ github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= @@ -671,6 +709,7 @@ github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqA github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= @@ -796,6 +835,8 @@ github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzH github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= @@ -837,21 +878,196 @@ go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= @@ -862,6 +1078,7 @@ gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= From 8af23216be65dadbfa3f0b12ac6c1392f0d61711 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sat, 7 Oct 2023 19:31:25 -0400 Subject: [PATCH 071/122] refactor(signing): remove `polar` and `eth_secp256k1` (#1191) ### Summary by CodeRabbit - Refactor: Removed unused `golines` target from Makefile and updated the `format` target. - Refactor: Removed two struct types and associated functions from `i_bank_module.abigen.go`. - Refactor: Removed two functions from `Bank.sol`. - New Feature: Introduced a new function `NewMinimalHandler` in `minimal.go`. - Refactor: Modified `SdkProposalToGovProposal` function in `conversions.go` for better error handling. - Refactor: Updated package name and added a new function `ProvideNoopGetSigners` in `signers.go`. - New Feature: Introduced a new package `libtx` that provides a `TxSerializer` interface and its implementation. - Refactor: Updated `Miner` struct to include a field of type `EthTxSerializer`. - Refactor: Removed two functions from `bank.go`. - Refactor: Updated test cases in `bank_test.go` and `governance_test.go`. - Refactor: Changed bond denomination in `testutil.go`. - Refactor: Updated address prefixes in `setup.go`. - Refactor: Renamed methods in `handler.go` and `mempool.go`. - Refactor: Updated test cases in `handler_test.go` and `mempool_test.go`. - Refactor: Updated methods in `tx_serializer.go`. - Refactor: Simplified Bech32 prefix setting in `config.go`. - Refactor: Removed commented-out code in `genesis.go`. - Refactor: Updated `EthTransaction` function in `msg_server.go`. - Refactor: Renamed functions and modified return types in `tx.go`. - Documentation: Added a new section titled "Hive Clients" in `README.md`. - Refactor: Updated scripts in `hive-init.sh`, `start-node.sh`, `docker-init.sh`, `init.sh`, `seed0-init-step1.sh`, `seed0-init-step2.sh`, `seed1-init-step1.sh`, `val0-init-step1.sh`, `val1-init-step1.sh`, and `entrypoint.sh`. - Refactor: Updated configuration and initialization process in `app.go` and `app_config.go`. - Refactor: Updated scripts in `root.go`, `proto_generate.sh`, and `proto_generate_pulsar.sh`. - Chore: Removed import of the "github.com/segmentio/golines" package from `tools.go`. --- Makefile | 22 +- .../precompile/bank/i_bank_module.abigen.go | 81 +- .../governance/governance_wrapper.abigen.go | 2 +- contracts/src/cosmos/precompile/Bank.sol | 10 - .../crypto/ethsecp256k1/v1/keys.pulsar.go | 1074 ---------------- cosmos/crypto/codec/codec.go | 34 - cosmos/crypto/hd/algo.go | 67 - cosmos/crypto/hd/algo_test.go | 99 -- cosmos/crypto/hd/hd.go | 73 -- cosmos/crypto/keyring/option.go | 37 - cosmos/crypto/keyring/option_test.go | 178 --- cosmos/crypto/keys/ethsecp256k1/keys.go | 137 -- cosmos/crypto/keys/ethsecp256k1/keys.pb.go | 499 -------- cosmos/crypto/keys/ethsecp256k1/keys_test.go | 80 -- .../crypto/keys/ethsecp256k1/signature_cgo.go | 64 - .../keys/ethsecp256k1/signature_cgo_test.go | 66 - cosmos/go.mod | 5 +- cosmos/go.sum | 31 - cosmos/lib/ante/ignore.go | 55 - cosmos/lib/ante/ignore_test.go | 96 -- .../hd/hd_test.go => lib/ante/minimal.go} | 15 +- cosmos/lib/conversions.go | 37 +- .../codec_test.go => lib/signing/signers.go} | 28 +- cosmos/lib/tx/serializer.go | 100 ++ cosmos/miner/miner.go | 14 +- cosmos/precompile/bank/bank.go | 51 - cosmos/precompile/bank/bank_test.go | 86 -- .../precompile/governance/governance_test.go | 6 +- cosmos/precompile/governance/testutil.go | 2 +- .../polaris/crypto/ethsecp256k1/v1/keys.proto | 40 - cosmos/testing/utils/setup.go | 6 +- cosmos/txpool/handler.go | 6 +- cosmos/txpool/handler_test.go | 15 +- cosmos/txpool/mempool.go | 2 +- cosmos/txpool/mempool_test.go | 6 +- cosmos/txpool/mocks/tx_serializer.go | 82 +- cosmos/types/config.go | 28 - cosmos/types/config_test.go | 9 - cosmos/x/evm/ante/ante.go | 91 -- cosmos/x/evm/ante/sigverify.go | 62 - cosmos/x/evm/genesis.go | 13 +- cosmos/x/evm/keeper/msg_server.go | 2 +- cosmos/x/evm/types/tx.go | 155 +-- cosmos/x/evm/types/tx_serializer.go | 121 -- cosmos/x/evm/types/tx_test.go | 90 -- e2e/hive/clients/README.md | 7 + e2e/hive/clients/polard/Dockerfile | 3 +- e2e/hive/clients/polard/config/app.toml | 515 -------- e2e/hive/clients/polard/config/genesis.json | 359 ------ e2e/hive/clients/polard/hive-init.sh | 6 +- e2e/localnet/go.mod | 140 +-- e2e/localnet/go.sum | 1118 ----------------- e2e/localnet/network/fixture.go | 31 - e2e/localnet/network/node.go | 2 +- e2e/precompile/contracts/bank/bank_test.go | 22 +- .../contracts/gov/governance_test.go | 6 +- .../contracts/staking/staking_test.go | 12 +- e2e/precompile/polard/config/addrbook.json | 4 - e2e/precompile/polard/config/app.toml | 515 -------- e2e/precompile/polard/config/client.toml | 21 - e2e/precompile/polard/config/config.toml | 473 ------- e2e/precompile/polard/config/genesis.json | 604 --------- ...4a78701907c06155caf2bf230ba7988115799.json | 1 - ...3fb1347b8cc9f52ed1679ea978b80aa1f3.address | 1 - ...d289b33e39edf3066d8ef9e4bf9e94c047.address | 1 - ...3c45e313d7834c197286eb0d669a588169.address | 1 - .../polard/config/keyring-test/dev0.info | 1 - .../polard/config/keyring-test/dev1.info | 1 - .../polard/config/keyring-test/dev2.info | 1 - e2e/precompile/polard/config/node_key.json | 1 - .../polard/config/priv_validator_key.json | 11 - .../polard/config/priv_validator_state.json | 5 - e2e/precompile/polard/start-node.sh | 79 +- e2e/testapp/app.go | 29 +- e2e/testapp/app_config.go | 2 +- e2e/testapp/docker/local/docker-init.sh | 4 +- e2e/testapp/docker/seed/init.sh | 2 +- .../docker/seed/scripts/seed0-init-step1.sh | 2 +- .../docker/seed/scripts/seed0-init-step2.sh | 2 +- .../docker/seed/scripts/seed1-init-step1.sh | 2 +- .../validator/scripts/val0-init-step1.sh | 2 +- .../validator/scripts/val1-init-step1.sh | 2 +- e2e/testapp/entrypoint.sh | 8 +- e2e/testapp/go.mod | 3 - e2e/testapp/go.sum | 1 - e2e/testapp/polard/cmd/root.go | 30 +- go.work.sum | 7 + {licensing => license}/argus-labs.md | 0 {cosmos/proto => proto}/buf.gen.gogo.yaml | 0 {cosmos/proto => proto}/buf.gen.pulsar.yaml | 0 {cosmos/proto => proto}/buf.lock | 0 {cosmos/proto => proto}/buf.yaml | 0 .../polaris/evm/module/v1alpha1/module.proto | 0 .../polaris/evm/v1alpha1/tx.proto | 0 .../scripts => scripts}/proto_generate.sh | 6 +- .../proto_generate_pulsar.sh | 6 +- tools/go.mod | 7 - tools/go.sum | 16 - tools/tools.go | 1 - x/evm/types/tx.pb.go | 608 +++++++++ 100 files changed, 997 insertions(+), 7461 deletions(-) delete mode 100644 cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go delete mode 100644 cosmos/crypto/codec/codec.go delete mode 100644 cosmos/crypto/hd/algo.go delete mode 100644 cosmos/crypto/hd/algo_test.go delete mode 100644 cosmos/crypto/hd/hd.go delete mode 100644 cosmos/crypto/keyring/option.go delete mode 100644 cosmos/crypto/keyring/option_test.go delete mode 100644 cosmos/crypto/keys/ethsecp256k1/keys.go delete mode 100644 cosmos/crypto/keys/ethsecp256k1/keys.pb.go delete mode 100644 cosmos/crypto/keys/ethsecp256k1/keys_test.go delete mode 100644 cosmos/crypto/keys/ethsecp256k1/signature_cgo.go delete mode 100644 cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go delete mode 100644 cosmos/lib/ante/ignore.go delete mode 100644 cosmos/lib/ante/ignore_test.go rename cosmos/{crypto/hd/hd_test.go => lib/ante/minimal.go} (76%) rename cosmos/{crypto/codec/codec_test.go => lib/signing/signers.go} (69%) create mode 100644 cosmos/lib/tx/serializer.go delete mode 100644 cosmos/proto/polaris/crypto/ethsecp256k1/v1/keys.proto delete mode 100644 cosmos/x/evm/ante/ante.go delete mode 100644 cosmos/x/evm/ante/sigverify.go delete mode 100644 cosmos/x/evm/types/tx_serializer.go delete mode 100644 cosmos/x/evm/types/tx_test.go create mode 100644 e2e/hive/clients/README.md delete mode 100644 e2e/hive/clients/polard/config/app.toml delete mode 100644 e2e/hive/clients/polard/config/genesis.json delete mode 100644 e2e/precompile/polard/config/addrbook.json delete mode 100644 e2e/precompile/polard/config/app.toml delete mode 100644 e2e/precompile/polard/config/client.toml delete mode 100644 e2e/precompile/polard/config/config.toml delete mode 100644 e2e/precompile/polard/config/genesis.json delete mode 100644 e2e/precompile/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json delete mode 100644 e2e/precompile/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address delete mode 100644 e2e/precompile/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address delete mode 100644 e2e/precompile/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address delete mode 100644 e2e/precompile/polard/config/keyring-test/dev0.info delete mode 100644 e2e/precompile/polard/config/keyring-test/dev1.info delete mode 100644 e2e/precompile/polard/config/keyring-test/dev2.info delete mode 100644 e2e/precompile/polard/config/node_key.json delete mode 100644 e2e/precompile/polard/config/priv_validator_key.json delete mode 100644 e2e/precompile/polard/config/priv_validator_state.json rename {licensing => license}/argus-labs.md (100%) rename {cosmos/proto => proto}/buf.gen.gogo.yaml (100%) rename {cosmos/proto => proto}/buf.gen.pulsar.yaml (100%) rename {cosmos/proto => proto}/buf.lock (100%) rename {cosmos/proto => proto}/buf.yaml (100%) rename {cosmos/proto => proto}/polaris/evm/module/v1alpha1/module.proto (100%) rename {cosmos/proto => proto}/polaris/evm/v1alpha1/tx.proto (100%) rename {cosmos/proto/scripts => scripts}/proto_generate.sh (95%) rename {cosmos/proto/scripts => scripts}/proto_generate_pulsar.sh (83%) create mode 100644 x/evm/types/tx.pb.go diff --git a/Makefile b/Makefile index 5133cb633c..828a1032fb 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ proto: @$(MAKE) buf-lint-fix buf-lint proto-build proto-build: - @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./cosmos/proto/scripts/proto_generate.sh + @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./scripts/proto_generate.sh ############################################################################### ### Docker ### @@ -286,7 +286,7 @@ test-localnet-no-build: ############################################################################### format: - @$(MAKE) license-fix buf-lint-fix forge-lint-fix golines golangci-fix + @$(MAKE) license-fix buf-lint-fix forge-lint-fix golangci-fix lint: @$(MAKE) license buf-lint forge-lint golangci gosec @@ -325,20 +325,6 @@ golangci-fix: @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --fix --concurrency 8 -v -################# -# golines # -################# - -golines-install: - @echo "--> Installing golines" - @go install github.com/segmentio/golines - -golines: - @$(MAKE) golines-install - @echo "--> Running golines" - @golines --reformat-tags --shorten-comments --write-output --max-len=99 -l ./. - - ################# # license # ################# @@ -380,7 +366,7 @@ gosec: # proto # ################# -protoDir := "cosmos/proto" +protoDir := "proto" buf-install: @echo "--> Installing buf" @@ -432,5 +418,5 @@ repo-rinse: | test-e2e test-e2e-no-build hive-setup hive-view test-hive \ test-hive-v test-localnet test-localnet-no-build format lint \ forge-lint-fix forge-lint golangci-install golangci golangci-fix \ - golines-install golines license-install license license-fix \ + license-install license license-fix \ gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse diff --git a/contracts/bindings/cosmos/precompile/bank/i_bank_module.abigen.go b/contracts/bindings/cosmos/precompile/bank/i_bank_module.abigen.go index 30c0f30a7a..25e27ca7a1 100644 --- a/contracts/bindings/cosmos/precompile/bank/i_bank_module.abigen.go +++ b/contracts/bindings/cosmos/precompile/bank/i_bank_module.abigen.go @@ -35,26 +35,9 @@ type CosmosCoin struct { Denom string } -// IBankModuleDenomMetadata is an auto generated low-level Go binding around an user-defined struct. -type IBankModuleDenomMetadata struct { - Description string - DenomUnits []IBankModuleDenomUnit - Base string - Display string - Name string - Symbol string -} - -// IBankModuleDenomUnit is an auto generated low-level Go binding around an user-defined struct. -type IBankModuleDenomUnit struct { - Denom string - Aliases []string - Exponent uint32 -} - // BankModuleMetaData contains all meta data concerning the BankModule contract. var BankModuleMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"CoinReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"CoinSpent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"Coinbase\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"Message\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getAllBalances\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getAllSpendableBalances\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllSupply\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getDenomMetadata\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"aliases\",\"type\":\"string[]\"},{\"internalType\":\"uint32\",\"name\":\"exponent\",\"type\":\"uint32\"}],\"internalType\":\"structIBankModule.DenomUnit[]\",\"name\":\"denomUnits\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"base\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"display\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"internalType\":\"structIBankModule.DenomMetadata\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getSendEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getSpendableBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"send\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"CoinReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"CoinSpent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"Coinbase\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"Message\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getAllBalances\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"}],\"name\":\"getAllSpendableBalances\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllSupply\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accountAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getSpendableBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"getSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"send\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]", } // BankModuleABI is the input ABI used to generate the binding from. @@ -327,68 +310,6 @@ func (_BankModule *BankModuleCallerSession) GetBalance(accountAddress common.Add return _BankModule.Contract.GetBalance(&_BankModule.CallOpts, accountAddress, denom) } -// GetDenomMetadata is a free data retrieval call binding the contract method 0x52a6ea04. -// -// Solidity: function getDenomMetadata(string denom) view returns((string,(string,string[],uint32)[],string,string,string,string)) -func (_BankModule *BankModuleCaller) GetDenomMetadata(opts *bind.CallOpts, denom string) (IBankModuleDenomMetadata, error) { - var out []interface{} - err := _BankModule.contract.Call(opts, &out, "getDenomMetadata", denom) - - if err != nil { - return *new(IBankModuleDenomMetadata), err - } - - out0 := *abi.ConvertType(out[0], new(IBankModuleDenomMetadata)).(*IBankModuleDenomMetadata) - - return out0, err - -} - -// GetDenomMetadata is a free data retrieval call binding the contract method 0x52a6ea04. -// -// Solidity: function getDenomMetadata(string denom) view returns((string,(string,string[],uint32)[],string,string,string,string)) -func (_BankModule *BankModuleSession) GetDenomMetadata(denom string) (IBankModuleDenomMetadata, error) { - return _BankModule.Contract.GetDenomMetadata(&_BankModule.CallOpts, denom) -} - -// GetDenomMetadata is a free data retrieval call binding the contract method 0x52a6ea04. -// -// Solidity: function getDenomMetadata(string denom) view returns((string,(string,string[],uint32)[],string,string,string,string)) -func (_BankModule *BankModuleCallerSession) GetDenomMetadata(denom string) (IBankModuleDenomMetadata, error) { - return _BankModule.Contract.GetDenomMetadata(&_BankModule.CallOpts, denom) -} - -// GetSendEnabled is a free data retrieval call binding the contract method 0x94047166. -// -// Solidity: function getSendEnabled(string denom) view returns(bool) -func (_BankModule *BankModuleCaller) GetSendEnabled(opts *bind.CallOpts, denom string) (bool, error) { - var out []interface{} - err := _BankModule.contract.Call(opts, &out, "getSendEnabled", denom) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// GetSendEnabled is a free data retrieval call binding the contract method 0x94047166. -// -// Solidity: function getSendEnabled(string denom) view returns(bool) -func (_BankModule *BankModuleSession) GetSendEnabled(denom string) (bool, error) { - return _BankModule.Contract.GetSendEnabled(&_BankModule.CallOpts, denom) -} - -// GetSendEnabled is a free data retrieval call binding the contract method 0x94047166. -// -// Solidity: function getSendEnabled(string denom) view returns(bool) -func (_BankModule *BankModuleCallerSession) GetSendEnabled(denom string) (bool, error) { - return _BankModule.Contract.GetSendEnabled(&_BankModule.CallOpts, denom) -} - // GetSpendableBalance is a free data retrieval call binding the contract method 0x34d1fdaf. // // Solidity: function getSpendableBalance(address accountAddress, string denom) view returns(uint256) diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index 7fad93d2b6..472dc6db66 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -80,7 +80,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea2646970667358221220614f855df71fb0dcaa073fb7cf6fe4c48e6b4b6079b271afe8dcf9d2994b768664736f6c63430008150033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea2646970667358221220554dc2c37553bc0c3484f8e62c856c95748dbeda5dedd2502876b8010ddf6a2264736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/src/cosmos/precompile/Bank.sol b/contracts/src/cosmos/precompile/Bank.sol index befb0fa75b..6a618cc455 100644 --- a/contracts/src/cosmos/precompile/Bank.sol +++ b/contracts/src/cosmos/precompile/Bank.sol @@ -113,16 +113,6 @@ interface IBankModule { */ function getAllSupply() external view returns (Cosmos.Coin[] memory); - /** - * @dev Returns the coin denomination's metadata - */ - function getDenomMetadata(string calldata denom) external view returns (DenomMetadata memory); - - /** - * @dev Returns if the coin is enabled to be sent (transfered) - */ - function getSendEnabled(string calldata denom) external view returns (bool); - ////////////////////////////////////// WRITE METHODS ////////////////////////////////////////// /** diff --git a/cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go b/cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go deleted file mode 100644 index 8dc63e61b2..0000000000 --- a/cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go +++ /dev/null @@ -1,1074 +0,0 @@ -// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. -package ethsecp256k1v1 - -import ( - fmt "fmt" - runtime "github.com/cosmos/cosmos-proto/runtime" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoiface "google.golang.org/protobuf/runtime/protoiface" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - io "io" - reflect "reflect" - sync "sync" -) - -var ( - md_PubKey protoreflect.MessageDescriptor - fd_PubKey_key protoreflect.FieldDescriptor -) - -func init() { - file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() - md_PubKey = File_polaris_crypto_ethsecp256k1_v1_keys_proto.Messages().ByName("PubKey") - fd_PubKey_key = md_PubKey.Fields().ByName("key") -} - -var _ protoreflect.Message = (*fastReflection_PubKey)(nil) - -type fastReflection_PubKey PubKey - -func (x *PubKey) ProtoReflect() protoreflect.Message { - return (*fastReflection_PubKey)(x) -} - -func (x *PubKey) slowProtoReflect() protoreflect.Message { - mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -var _fastReflection_PubKey_messageType fastReflection_PubKey_messageType -var _ protoreflect.MessageType = fastReflection_PubKey_messageType{} - -type fastReflection_PubKey_messageType struct{} - -func (x fastReflection_PubKey_messageType) Zero() protoreflect.Message { - return (*fastReflection_PubKey)(nil) -} -func (x fastReflection_PubKey_messageType) New() protoreflect.Message { - return new(fastReflection_PubKey) -} -func (x fastReflection_PubKey_messageType) Descriptor() protoreflect.MessageDescriptor { - return md_PubKey -} - -// Descriptor returns message descriptor, which contains only the protobuf -// type information for the message. -func (x *fastReflection_PubKey) Descriptor() protoreflect.MessageDescriptor { - return md_PubKey -} - -// Type returns the message type, which encapsulates both Go and protobuf -// type information. If the Go type information is not needed, -// it is recommended that the message descriptor be used instead. -func (x *fastReflection_PubKey) Type() protoreflect.MessageType { - return _fastReflection_PubKey_messageType -} - -// New returns a newly allocated and mutable empty message. -func (x *fastReflection_PubKey) New() protoreflect.Message { - return new(fastReflection_PubKey) -} - -// Interface unwraps the message reflection interface and -// returns the underlying ProtoMessage interface. -func (x *fastReflection_PubKey) Interface() protoreflect.ProtoMessage { - return (*PubKey)(x) -} - -// Range iterates over every populated field in an undefined order, -// calling f for each field descriptor and value encountered. -// Range returns immediately if f returns false. -// While iterating, mutating operations may only be performed -// on the current field descriptor. -func (x *fastReflection_PubKey) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if len(x.Key) != 0 { - value := protoreflect.ValueOfBytes(x.Key) - if !f(fd_PubKey_key, value) { - return - } - } -} - -// Has reports whether a field is populated. -// -// Some fields have the property of nullability where it is possible to -// distinguish between the default value of a field and whether the field -// was explicitly populated with the default value. Singular message fields, -// member fields of a oneof, and proto2 scalar fields are nullable. Such -// fields are populated only if explicitly set. -// -// In other cases (aside from the nullable cases above), -// a proto3 scalar field is populated if it contains a non-zero value, and -// a repeated field is populated if it is non-empty. -func (x *fastReflection_PubKey) Has(fd protoreflect.FieldDescriptor) bool { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PubKey.key": - return len(x.Key) != 0 - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) - } -} - -// Clear clears the field such that a subsequent Has call reports false. -// -// Clearing an extension field clears both the extension type and value -// associated with the given field number. -// -// Clear is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PubKey) Clear(fd protoreflect.FieldDescriptor) { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PubKey.key": - x.Key = nil - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) - } -} - -// Get retrieves the value for a field. -// -// For unpopulated scalars, it returns the default value, where -// the default value of a bytes scalar is guaranteed to be a copy. -// For unpopulated composite types, it returns an empty, read-only view -// of the value; to obtain a mutable reference, use Mutable. -func (x *fastReflection_PubKey) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { - switch descriptor.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PubKey.key": - value := x.Key - return protoreflect.ValueOfBytes(value) - default: - if descriptor.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", descriptor.FullName())) - } -} - -// Set stores the value for a field. -// -// For a field belonging to a oneof, it implicitly clears any other field -// that may be currently set within the same oneof. -// For extension fields, it implicitly stores the provided ExtensionType. -// When setting a composite type, it is unspecified whether the stored value -// aliases the source's memory in any way. If the composite value is an -// empty, read-only value, then it panics. -// -// Set is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PubKey) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PubKey.key": - x.Key = value.Bytes() - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) - } -} - -// Mutable returns a mutable reference to a composite type. -// -// If the field is unpopulated, it may allocate a composite value. -// For a field belonging to a oneof, it implicitly clears any other field -// that may be currently set within the same oneof. -// For extension fields, it implicitly stores the provided ExtensionType -// if not already stored. -// It panics if the field does not contain a composite type. -// -// Mutable is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PubKey) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PubKey.key": - panic(fmt.Errorf("field key of message polaris.crypto.ethsecp256k1.v1.PubKey is not mutable")) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) - } -} - -// NewField returns a new value that is assignable to the field -// for the given descriptor. For scalars, this returns the default value. -// For lists, maps, and messages, this returns a new, empty, mutable value. -func (x *fastReflection_PubKey) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PubKey.key": - return protoreflect.ValueOfBytes(nil) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) - } -} - -// WhichOneof reports which field within the oneof is populated, -// returning nil if none are populated. -// It panics if the oneof descriptor does not belong to this message. -func (x *fastReflection_PubKey) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { - switch d.FullName() { - default: - panic(fmt.Errorf("%s is not a oneof field in polaris.crypto.ethsecp256k1.v1.PubKey", d.FullName())) - } - panic("unreachable") -} - -// GetUnknown retrieves the entire list of unknown fields. -// The caller may only mutate the contents of the RawFields -// if the mutated bytes are stored back into the message with SetUnknown. -func (x *fastReflection_PubKey) GetUnknown() protoreflect.RawFields { - return x.unknownFields -} - -// SetUnknown stores an entire list of unknown fields. -// The raw fields must be syntactically valid according to the wire format. -// An implementation may panic if this is not the case. -// Once stored, the caller must not mutate the content of the RawFields. -// An empty RawFields may be passed to clear the fields. -// -// SetUnknown is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PubKey) SetUnknown(fields protoreflect.RawFields) { - x.unknownFields = fields -} - -// IsValid reports whether the message is valid. -// -// An invalid message is an empty, read-only value. -// -// An invalid message often corresponds to a nil pointer of the concrete -// message type, but the details are implementation dependent. -// Validity is not part of the protobuf data model, and may not -// be preserved in marshaling or other operations. -func (x *fastReflection_PubKey) IsValid() bool { - return x != nil -} - -// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. -// This method may return nil. -// -// The returned methods type is identical to -// "google.golang.org/protobuf/runtime/protoiface".Methods. -// Consult the protoiface package documentation for details. -func (x *fastReflection_PubKey) ProtoMethods() *protoiface.Methods { - size := func(input protoiface.SizeInput) protoiface.SizeOutput { - x := input.Message.Interface().(*PubKey) - if x == nil { - return protoiface.SizeOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Size: 0, - } - } - options := runtime.SizeInputToOptions(input) - _ = options - var n int - var l int - _ = l - l = len(x.Key) - if l > 0 { - n += 1 + l + runtime.Sov(uint64(l)) - } - if x.unknownFields != nil { - n += len(x.unknownFields) - } - return protoiface.SizeOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Size: n, - } - } - - marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { - x := input.Message.Interface().(*PubKey) - if x == nil { - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, nil - } - options := runtime.MarshalInputToOptions(input) - _ = options - size := options.Size(x) - dAtA := make([]byte, size) - i := len(dAtA) - _ = i - var l int - _ = l - if x.unknownFields != nil { - i -= len(x.unknownFields) - copy(dAtA[i:], x.unknownFields) - } - if len(x.Key) > 0 { - i -= len(x.Key) - copy(dAtA[i:], x.Key) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Key))) - i-- - dAtA[i] = 0xa - } - if input.Buf != nil { - input.Buf = append(input.Buf, dAtA...) - } else { - input.Buf = dAtA - } - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, nil - } - unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { - x := input.Message.Interface().(*PubKey) - if x == nil { - return protoiface.UnmarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Flags: input.Flags, - }, nil - } - options := runtime.UnmarshalInputToOptions(input) - _ = options - dAtA := input.Buf - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if postIndex > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - x.Key = append(x.Key[:0], dAtA[iNdEx:postIndex]...) - if x.Key == nil { - x.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := runtime.Skip(dAtA[iNdEx:]) - if err != nil { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if (iNdEx + skippy) > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - if !options.DiscardUnknown { - x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - } - iNdEx += skippy - } - } - - if iNdEx > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil - } - return &protoiface.Methods{ - NoUnkeyedLiterals: struct{}{}, - Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, - Size: size, - Marshal: marshal, - Unmarshal: unmarshal, - Merge: nil, - CheckInitialized: nil, - } -} - -var ( - md_PrivKey protoreflect.MessageDescriptor - fd_PrivKey_key protoreflect.FieldDescriptor -) - -func init() { - file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() - md_PrivKey = File_polaris_crypto_ethsecp256k1_v1_keys_proto.Messages().ByName("PrivKey") - fd_PrivKey_key = md_PrivKey.Fields().ByName("key") -} - -var _ protoreflect.Message = (*fastReflection_PrivKey)(nil) - -type fastReflection_PrivKey PrivKey - -func (x *PrivKey) ProtoReflect() protoreflect.Message { - return (*fastReflection_PrivKey)(x) -} - -func (x *PrivKey) slowProtoReflect() protoreflect.Message { - mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -var _fastReflection_PrivKey_messageType fastReflection_PrivKey_messageType -var _ protoreflect.MessageType = fastReflection_PrivKey_messageType{} - -type fastReflection_PrivKey_messageType struct{} - -func (x fastReflection_PrivKey_messageType) Zero() protoreflect.Message { - return (*fastReflection_PrivKey)(nil) -} -func (x fastReflection_PrivKey_messageType) New() protoreflect.Message { - return new(fastReflection_PrivKey) -} -func (x fastReflection_PrivKey_messageType) Descriptor() protoreflect.MessageDescriptor { - return md_PrivKey -} - -// Descriptor returns message descriptor, which contains only the protobuf -// type information for the message. -func (x *fastReflection_PrivKey) Descriptor() protoreflect.MessageDescriptor { - return md_PrivKey -} - -// Type returns the message type, which encapsulates both Go and protobuf -// type information. If the Go type information is not needed, -// it is recommended that the message descriptor be used instead. -func (x *fastReflection_PrivKey) Type() protoreflect.MessageType { - return _fastReflection_PrivKey_messageType -} - -// New returns a newly allocated and mutable empty message. -func (x *fastReflection_PrivKey) New() protoreflect.Message { - return new(fastReflection_PrivKey) -} - -// Interface unwraps the message reflection interface and -// returns the underlying ProtoMessage interface. -func (x *fastReflection_PrivKey) Interface() protoreflect.ProtoMessage { - return (*PrivKey)(x) -} - -// Range iterates over every populated field in an undefined order, -// calling f for each field descriptor and value encountered. -// Range returns immediately if f returns false. -// While iterating, mutating operations may only be performed -// on the current field descriptor. -func (x *fastReflection_PrivKey) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if len(x.Key) != 0 { - value := protoreflect.ValueOfBytes(x.Key) - if !f(fd_PrivKey_key, value) { - return - } - } -} - -// Has reports whether a field is populated. -// -// Some fields have the property of nullability where it is possible to -// distinguish between the default value of a field and whether the field -// was explicitly populated with the default value. Singular message fields, -// member fields of a oneof, and proto2 scalar fields are nullable. Such -// fields are populated only if explicitly set. -// -// In other cases (aside from the nullable cases above), -// a proto3 scalar field is populated if it contains a non-zero value, and -// a repeated field is populated if it is non-empty. -func (x *fastReflection_PrivKey) Has(fd protoreflect.FieldDescriptor) bool { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": - return len(x.Key) != 0 - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) - } -} - -// Clear clears the field such that a subsequent Has call reports false. -// -// Clearing an extension field clears both the extension type and value -// associated with the given field number. -// -// Clear is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PrivKey) Clear(fd protoreflect.FieldDescriptor) { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": - x.Key = nil - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) - } -} - -// Get retrieves the value for a field. -// -// For unpopulated scalars, it returns the default value, where -// the default value of a bytes scalar is guaranteed to be a copy. -// For unpopulated composite types, it returns an empty, read-only view -// of the value; to obtain a mutable reference, use Mutable. -func (x *fastReflection_PrivKey) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { - switch descriptor.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": - value := x.Key - return protoreflect.ValueOfBytes(value) - default: - if descriptor.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", descriptor.FullName())) - } -} - -// Set stores the value for a field. -// -// For a field belonging to a oneof, it implicitly clears any other field -// that may be currently set within the same oneof. -// For extension fields, it implicitly stores the provided ExtensionType. -// When setting a composite type, it is unspecified whether the stored value -// aliases the source's memory in any way. If the composite value is an -// empty, read-only value, then it panics. -// -// Set is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PrivKey) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": - x.Key = value.Bytes() - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) - } -} - -// Mutable returns a mutable reference to a composite type. -// -// If the field is unpopulated, it may allocate a composite value. -// For a field belonging to a oneof, it implicitly clears any other field -// that may be currently set within the same oneof. -// For extension fields, it implicitly stores the provided ExtensionType -// if not already stored. -// It panics if the field does not contain a composite type. -// -// Mutable is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PrivKey) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": - panic(fmt.Errorf("field key of message polaris.crypto.ethsecp256k1.v1.PrivKey is not mutable")) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) - } -} - -// NewField returns a new value that is assignable to the field -// for the given descriptor. For scalars, this returns the default value. -// For lists, maps, and messages, this returns a new, empty, mutable value. -func (x *fastReflection_PrivKey) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": - return protoreflect.ValueOfBytes(nil) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) - } - panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) - } -} - -// WhichOneof reports which field within the oneof is populated, -// returning nil if none are populated. -// It panics if the oneof descriptor does not belong to this message. -func (x *fastReflection_PrivKey) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { - switch d.FullName() { - default: - panic(fmt.Errorf("%s is not a oneof field in polaris.crypto.ethsecp256k1.v1.PrivKey", d.FullName())) - } - panic("unreachable") -} - -// GetUnknown retrieves the entire list of unknown fields. -// The caller may only mutate the contents of the RawFields -// if the mutated bytes are stored back into the message with SetUnknown. -func (x *fastReflection_PrivKey) GetUnknown() protoreflect.RawFields { - return x.unknownFields -} - -// SetUnknown stores an entire list of unknown fields. -// The raw fields must be syntactically valid according to the wire format. -// An implementation may panic if this is not the case. -// Once stored, the caller must not mutate the content of the RawFields. -// An empty RawFields may be passed to clear the fields. -// -// SetUnknown is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_PrivKey) SetUnknown(fields protoreflect.RawFields) { - x.unknownFields = fields -} - -// IsValid reports whether the message is valid. -// -// An invalid message is an empty, read-only value. -// -// An invalid message often corresponds to a nil pointer of the concrete -// message type, but the details are implementation dependent. -// Validity is not part of the protobuf data model, and may not -// be preserved in marshaling or other operations. -func (x *fastReflection_PrivKey) IsValid() bool { - return x != nil -} - -// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. -// This method may return nil. -// -// The returned methods type is identical to -// "google.golang.org/protobuf/runtime/protoiface".Methods. -// Consult the protoiface package documentation for details. -func (x *fastReflection_PrivKey) ProtoMethods() *protoiface.Methods { - size := func(input protoiface.SizeInput) protoiface.SizeOutput { - x := input.Message.Interface().(*PrivKey) - if x == nil { - return protoiface.SizeOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Size: 0, - } - } - options := runtime.SizeInputToOptions(input) - _ = options - var n int - var l int - _ = l - l = len(x.Key) - if l > 0 { - n += 1 + l + runtime.Sov(uint64(l)) - } - if x.unknownFields != nil { - n += len(x.unknownFields) - } - return protoiface.SizeOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Size: n, - } - } - - marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { - x := input.Message.Interface().(*PrivKey) - if x == nil { - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, nil - } - options := runtime.MarshalInputToOptions(input) - _ = options - size := options.Size(x) - dAtA := make([]byte, size) - i := len(dAtA) - _ = i - var l int - _ = l - if x.unknownFields != nil { - i -= len(x.unknownFields) - copy(dAtA[i:], x.unknownFields) - } - if len(x.Key) > 0 { - i -= len(x.Key) - copy(dAtA[i:], x.Key) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Key))) - i-- - dAtA[i] = 0xa - } - if input.Buf != nil { - input.Buf = append(input.Buf, dAtA...) - } else { - input.Buf = dAtA - } - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, nil - } - unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { - x := input.Message.Interface().(*PrivKey) - if x == nil { - return protoiface.UnmarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Flags: input.Flags, - }, nil - } - options := runtime.UnmarshalInputToOptions(input) - _ = options - dAtA := input.Buf - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PrivKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if postIndex > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - x.Key = append(x.Key[:0], dAtA[iNdEx:postIndex]...) - if x.Key == nil { - x.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := runtime.Skip(dAtA[iNdEx:]) - if err != nil { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if (iNdEx + skippy) > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - if !options.DiscardUnknown { - x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - } - iNdEx += skippy - } - } - - if iNdEx > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil - } - return &protoiface.Methods{ - NoUnkeyedLiterals: struct{}{}, - Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, - Size: size, - Marshal: marshal, - Unmarshal: unmarshal, - Merge: nil, - CheckInitialized: nil, - } -} - -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: polaris/crypto/ethsecp256k1/v1/keys.proto - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// `PubKey` defines a type alias for an `ecdsa.PublicKey` that implements -// CometBFT's `PubKey` interface. It represents the 33-byte compressed public -// key format. -type PubKey struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // `key` is the public key in byte form. - Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` -} - -func (x *PubKey) Reset() { - *x = PubKey{} - if protoimpl.UnsafeEnabled { - mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PubKey) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PubKey) ProtoMessage() {} - -// Deprecated: Use PubKey.ProtoReflect.Descriptor instead. -func (*PubKey) Descriptor() ([]byte, []int) { - return file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescGZIP(), []int{0} -} - -func (x *PubKey) GetKey() []byte { - if x != nil { - return x.Key - } - return nil -} - -// `PrivKey` defines a type alias for a n`ecdsa.PrivateKey` that implements -// CometBFT's `PrivateKey` interface. -type PrivKey struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // `key` is the private key in byte form. - Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` -} - -func (x *PrivKey) Reset() { - *x = PrivKey{} - if protoimpl.UnsafeEnabled { - mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PrivKey) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PrivKey) ProtoMessage() {} - -// Deprecated: Use PrivKey.ProtoReflect.Descriptor instead. -func (*PrivKey) Descriptor() ([]byte, []int) { - return file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescGZIP(), []int{1} -} - -func (x *PrivKey) GetKey() []byte { - if x != nil { - return x.Key - } - return nil -} - -var File_polaris_crypto_ethsecp256k1_v1_keys_proto protoreflect.FileDescriptor - -var file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc = []byte{ - 0x0a, 0x29, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x2f, 0x65, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2f, 0x76, 0x31, - 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e, 0x70, 0x6f, 0x6c, - 0x61, 0x72, 0x69, 0x73, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x65, 0x74, 0x68, 0x73, - 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2e, 0x76, 0x31, 0x22, 0x1a, 0x0a, 0x06, 0x50, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x1b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x4b, - 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x42, 0x8a, 0x02, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, - 0x61, 0x72, 0x69, 0x73, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x65, 0x74, 0x68, 0x73, - 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4b, 0x65, 0x79, - 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6c, 0x61, 0x72, - 0x69, 0x73, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x73, 0x65, 0x63, - 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x74, 0x68, 0x73, 0x65, 0x63, - 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x45, 0xaa, 0x02, - 0x1e, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, - 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x1e, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x5c, 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x5c, 0x56, 0x31, - 0xe2, 0x02, 0x2a, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, - 0x6f, 0x5c, 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x21, - 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x3a, 0x3a, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3a, - 0x3a, 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x3a, 0x3a, 0x56, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescOnce sync.Once - file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData = file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc -) - -func file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescGZIP() []byte { - file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescOnce.Do(func() { - file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData = protoimpl.X.CompressGZIP(file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData) - }) - return file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData -} - -var file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_polaris_crypto_ethsecp256k1_v1_keys_proto_goTypes = []interface{}{ - (*PubKey)(nil), // 0: polaris.crypto.ethsecp256k1.v1.PubKey - (*PrivKey)(nil), // 1: polaris.crypto.ethsecp256k1.v1.PrivKey -} -var file_polaris_crypto_ethsecp256k1_v1_keys_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() } -func file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() { - if File_polaris_crypto_ethsecp256k1_v1_keys_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubKey); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrivKey); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_polaris_crypto_ethsecp256k1_v1_keys_proto_goTypes, - DependencyIndexes: file_polaris_crypto_ethsecp256k1_v1_keys_proto_depIdxs, - MessageInfos: file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes, - }.Build() - File_polaris_crypto_ethsecp256k1_v1_keys_proto = out.File - file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc = nil - file_polaris_crypto_ethsecp256k1_v1_keys_proto_goTypes = nil - file_polaris_crypto_ethsecp256k1_v1_keys_proto_depIdxs = nil -} diff --git a/cosmos/crypto/codec/codec.go b/cosmos/crypto/codec/codec.go deleted file mode 100644 index c3daf74901..0000000000 --- a/cosmos/crypto/codec/codec.go +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package codec - -import ( - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - - "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" -) - -// RegisterInterfaces registers the ethsecp256k1 key types. -func RegisterInterfaces(registry codectypes.InterfaceRegistry) { - registry.RegisterImplementations((*cryptotypes.PubKey)(nil), ðsecp256k1.PubKey{}) - registry.RegisterImplementations((*cryptotypes.PrivKey)(nil), ðsecp256k1.PrivKey{}) -} diff --git a/cosmos/crypto/hd/algo.go b/cosmos/crypto/hd/algo.go deleted file mode 100644 index 52f3cd66bb..0000000000 --- a/cosmos/crypto/hd/algo.go +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package hd - -import ( - "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - - "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" -) - -const ( - // EthSecp256k1Type defines the ECDSA secp256k1 used on Ethereum. - EthSecp256k1Type = hd.PubKeyType(ethsecp256k1.KeyType) -) - -var ( - // Compile-time type assertion. - _ keyring.SignatureAlgo = EthSecp256k1 - // EthSecp256k1 uses the Bitcoin secp256k1 ECDSA parameters. - EthSecp256k1 = ethSecp256k1Algo{} -) - -// ethSecp256k1Algo implements the `keyring.SignatureAlgo` interface for the -// eth_secp256k1 algorithm. -type ethSecp256k1Algo struct{} - -// Name returns eth_secp256k1. -func (s ethSecp256k1Algo) Name() hd.PubKeyType { - return EthSecp256k1Type -} - -// Derive derives and returns the eth_secp256k1 private key for the given mnemonic -// and HD path. -func (s ethSecp256k1Algo) Derive() hd.DeriveFn { - return hd.Secp256k1.Derive() -} - -// Generate generates a eth_secp256k1 private key from the given bytes. -func (s ethSecp256k1Algo) Generate() hd.GenerateFn { - return func(bz []byte) cryptotypes.PrivKey { - bzArr := make([]byte, ethsecp256k1.PrivKeySize) - copy(bzArr, bz) - return ðsecp256k1.PrivKey{ - Key: bzArr, - } - } -} diff --git a/cosmos/crypto/hd/algo_test.go b/cosmos/crypto/hd/algo_test.go deleted file mode 100644 index 6534203f99..0000000000 --- a/cosmos/crypto/hd/algo_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package hd - -import ( - "strings" - - "github.com/cosmos/cosmos-sdk/crypto/keyring" - - ethsecp256k1 "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" - "pkg.berachain.dev/polaris/eth/accounts" - "pkg.berachain.dev/polaris/eth/common" - crypto "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/lib/utils" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -const ( - mnemonic = "absurd surge gather author blanket acquire proof struggle runway attract " + - "cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite " + - "verb tank" -) - -var _ = Describe("HD", func() { - It("should derive the correct key", func() { - EthSecp256k1 := EthSecp256k1 - - // Derive the 0'th key from the mnemonic. - bz, err := EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, - accounts.BIP44HDPath) - Expect(err).NotTo(HaveOccurred()) - Expect(bz).NotTo(BeEmpty()) - - badBz, err := EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, - "44'/118'/0'/0/0") - Expect(err).NotTo(HaveOccurred()) - Expect(badBz).NotTo(BeEmpty()) - - Expect(bz).NotTo(Equal(badBz)) - - privkey := EthSecp256k1.Generate()(bz) - badPrivKey := EthSecp256k1.Generate()(badBz) - - Expect(privkey.Equals(badPrivKey)).To(BeFalse()) - - pk, err := utils.MustGetAs[*ethsecp256k1.PrivKey](privkey).ToECDSA() - Expect(err).NotTo(HaveOccurred()) - - wallet, path, err := GenerateWallet(mnemonic) - Expect(err).NotTo(HaveOccurred()) - *path = strings.Replace(*path, "H", "'", 3) // TODO: figure out why this is needed. - Expect(*path).To(Equal(accounts.BIP44HDPath)) - Expect(crypto.FromECDSA(wallet)).To(Equal(privkey.Bytes())) - - // Check to verify that the address is correct. - // Also verified manually with metamask: https://imgur.com/a/Bz2jLaP - Expect(crypto.PubkeyToAddress(pk.PublicKey).String()). - To(Equal("0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4")) - Expect(crypto.PubkeyToAddress(wallet.PublicKey).String()). - To(Equal("0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4")) - Expect(common.BytesToAddress(privkey.PubKey().Address().Bytes()).String()). - To(Equal("0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4")) - Expect(common.BytesToAddress(privkey.PubKey().Address()).String()). - To(Equal(crypto.PubkeyToAddress(wallet.PublicKey).String())) - }) -}) - -var _ = Describe("Prove EDSCAify isn't needed", func() { - It("should round trip", func() { - // Generate a random private key. - key, err := ethsecp256k1.GenPrivKey() - Expect(err).NotTo(HaveOccurred()) - - // Convert the private key to an ECDSA private key. - x, err := ethsecp256k1.PrivKey{Key: key.Key}.ToECDSA() - Expect(err).NotTo(HaveOccurred()) - Expect(key.Key).To(Equal(crypto.FromECDSA(x))) - }) -}) diff --git a/cosmos/crypto/hd/hd.go b/cosmos/crypto/hd/hd.go deleted file mode 100644 index 0588972e67..0000000000 --- a/cosmos/crypto/hd/hd.go +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -// -//nolint:gomnd // ignore magic numbers -package hd - -import ( - "crypto/ecdsa" - - "github.com/btcsuite/btcd/btcutil/hdkeychain" - "github.com/btcsuite/btcd/chaincfg" - "github.com/cosmos/go-bip39" -) - -func GenerateWallet(mnemonic string) (*ecdsa.PrivateKey, *string, error) { - // Generate a Bip32 HD wallet for the mnemonic and a user supplied password - seed := bip39.NewSeed(mnemonic, "") - // Generate a new master node using the seed. - masterKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams) - if err != nil { - return nil, nil, err - } - // This gives the path: m/44H - acc44H, err := masterKey.Derive(hdkeychain.HardenedKeyStart + 44) - if err != nil { - return nil, nil, err - } - // This gives the path: m/44H/60H - acc44H60H, err := acc44H.Derive(hdkeychain.HardenedKeyStart + 60) - if err != nil { - return nil, nil, err - } - // This gives the path: m/44H/60H/0H - acc44H60H0H, err := acc44H60H.Derive(hdkeychain.HardenedKeyStart + 0) - if err != nil { - return nil, nil, err - } - // This gives the path: m/44H/60H/0H/0 - acc44H60H0H0, err := acc44H60H0H.Derive(0) - if err != nil { - return nil, nil, err - } - // This gives the path: m/44H/60H/0H/0/0 - acc44H60H0H00, err := acc44H60H0H0.Derive(0) - if err != nil { - return nil, nil, err - } - btcecPrivKey, err := acc44H60H0H00.ECPrivKey() - if err != nil { - return nil, nil, err - } - privateKey := btcecPrivKey.ToECDSA() - path := "m/44H/60H/0H/0/0" - return privateKey, &path, nil -} diff --git a/cosmos/crypto/keyring/option.go b/cosmos/crypto/keyring/option.go deleted file mode 100644 index e729595b30..0000000000 --- a/cosmos/crypto/keyring/option.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package keyring - -import ( - sdkhd "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - - "pkg.berachain.dev/polaris/cosmos/crypto/hd" -) - -// EthSecp256k1Option defines a function keys options for the ethereum Secp256k1 curve. -// It supports ethsecp256k1 and secp256k1 keys for accounts. -func EthSecp256k1Option() keyring.Option { - return func(options *keyring.Options) { - options.SupportedAlgos = keyring.SigningAlgoList{hd.EthSecp256k1, sdkhd.Secp256k1} - options.SupportedAlgosLedger = keyring.SigningAlgoList{hd.EthSecp256k1, sdkhd.Secp256k1} - } -} diff --git a/cosmos/crypto/keyring/option_test.go b/cosmos/crypto/keyring/option_test.go deleted file mode 100644 index 98ac4ec170..0000000000 --- a/cosmos/crypto/keyring/option_test.go +++ /dev/null @@ -1,178 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package keyring - -import ( - "os" - "strings" - "testing" - - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/std" - - cryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" - "pkg.berachain.dev/polaris/cosmos/crypto/hd" - accounts "pkg.berachain.dev/polaris/eth/accounts" - "pkg.berachain.dev/polaris/eth/common" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var cdc *codec.ProtoCodec - -func registerCodec() { - interfaceRegistry := types.NewInterfaceRegistry() - std.RegisterInterfaces(interfaceRegistry) - cryptocodec.RegisterInterfaces(interfaceRegistry) - cdc = codec.NewProtoCodec(interfaceRegistry) -} - -func TestKeyring(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/crypto/keyring") -} - -var _ = Describe("Keyring", func() { - var ( - dir string - mockIn *strings.Reader - kr keyring.Keyring - ) - - BeforeEach(func() { - var err error - dir, err = os.MkdirTemp("", "keyring_test") - Expect(err).NotTo(HaveOccurred()) - registerCodec() - - mockIn = strings.NewReader("") - - interfaceRegistry := types.NewInterfaceRegistry() - std.RegisterInterfaces(interfaceRegistry) - cryptocodec.RegisterInterfaces(interfaceRegistry) - cdc = codec.NewProtoCodec(interfaceRegistry) - - kr, err = keyring.New("accounts", keyring.BackendTest, dir, mockIn, cdc, EthSecp256k1Option()) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach(func() { - err := os.RemoveAll(dir) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("Key operations", func() { - It("should fail to retrieve key", func() { - info, err := kr.Key("foo") - Expect(err).To(HaveOccurred()) - Expect(info).To(BeNil()) - }) - }) - - Context("NewMnemonic operation", func() { - var ( - info *keyring.Record - mnemonic string - err error - ) - - BeforeEach(func() { - registerCodec() - mockIn.Reset("password\npassword\n") - info, mnemonic, err = kr.NewMnemonic("foo", keyring.English, accounts.BIP44HDPath, - keyring.DefaultBIP39Passphrase, hd.EthSecp256k1) - Expect(err).NotTo(HaveOccurred()) - }) - - It("should create a new mnemonic and info", func() { - Expect(mnemonic).NotTo(BeEmpty()) - Expect(info.Name).To(Equal("foo")) - Expect(info.GetType().String()).To(Equal("local")) - var pubKey cryptotypes.PubKey - pubKey, err = info.GetPubKey() - Expect(err).NotTo(HaveOccurred()) - Expect(pubKey.Type()).To(Equal(string(hd.EthSecp256k1Type))) - }) - }) - - Context("HD path operations", func() { - var ( - mnemonic string - bz []byte - err error - ) - - BeforeEach(func() { - registerCodec() - mockIn.Reset("password\npassword\n") - _, mnemonic, err = kr.NewMnemonic("foo", keyring.English, accounts.BIP44HDPath, - keyring.DefaultBIP39Passphrase, hd.EthSecp256k1) - Expect(err).NotTo(HaveOccurred()) - - hdPath := accounts.BIP44HDPath - - bz, err = hd.EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, hdPath) - Expect(err).NotTo(HaveOccurred()) - }) - - It("should derive the correct HD path", func() { - Expect(bz).NotTo(BeEmpty()) - var wrongBz []byte - wrongBz, err = hd.EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, - "/wrong/hdPath") - Expect(err).To(HaveOccurred()) - Expect(wrongBz).To(BeEmpty()) - }) - - Context("Key generation and retrieval", func() { - var ( - privkey cryptotypes.PrivKey - addr common.Address - ) - - BeforeEach(func() { - registerCodec() - mockIn.Reset("password\npassword\n") - _, mnemonic, err = kr.NewMnemonic("foo", keyring.English, accounts.BIP44HDPath, - keyring.DefaultBIP39Passphrase, hd.EthSecp256k1) - Expect(err).NotTo(HaveOccurred()) - - hdPath := accounts.BIP44HDPath - - bz, err = hd.EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, - hdPath) - Expect(err).NotTo(HaveOccurred()) - - privkey = hd.EthSecp256k1.Generate()(bz) - addr = common.BytesToAddress(privkey.PubKey().Address().Bytes()) - }) - - It("should generate and retrieve the correct private key and address", func() { - Expect(addr.String()).To(Equal(common.Address(privkey.PubKey(). - Address()).String())) - }) - }) - }) -}) diff --git a/cosmos/crypto/keys/ethsecp256k1/keys.go b/cosmos/crypto/keys/ethsecp256k1/keys.go deleted file mode 100644 index 5636e0aea4..0000000000 --- a/cosmos/crypto/keys/ethsecp256k1/keys.go +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package ethsecp256k1 - -import ( - "bytes" - "crypto/ecdsa" - "crypto/subtle" - - cmcrypto "github.com/cometbft/cometbft/crypto" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - - "pkg.berachain.dev/polaris/eth/crypto" -) - -const ( - // PrivKeySize defines the length of the PrivKey byte array. - PrivKeySize = 32 - // PubKeySize defines the length of the PubKey byte array. - PubKeySize = PrivKeySize + 1 - // KeyType is the string constant for the secp256k1 algorithm. - KeyType = "eth_secp256k1" -) - -// =============================================================================================== -// Private Key -// =============================================================================================== - -// PrivKey is a wrapper around the Ethereum secp256k1 private key type. This wrapper conforms to -// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 private key type within the -// Cosmos SDK. - -// Compile-time type assertion. -var _ cryptotypes.PrivKey = &PrivKey{} - -// Bytes returns the byte representation of the ECDSA Private Key. -func (privKey PrivKey) Bytes() []byte { - return privKey.Key -} - -// PubKey returns the ECDSA private key's public key. If the privkey is not valid -// it returns a nil value. -func (privKey PrivKey) PubKey() cryptotypes.PubKey { - ecdsaPrivKey, err := privKey.ToECDSA() - if err != nil { - return nil - } - - return &PubKey{ - Key: crypto.CompressPubkey(&ecdsaPrivKey.PublicKey), - } -} - -// Equals returns true if two ECDSA private keys are equal and false otherwise. -func (privKey PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool { - return privKey.Type() == other.Type() && - subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 -} - -// Type returns eth_secp256k1. -func (privKey PrivKey) Type() string { - return KeyType -} - -// GenPrivKey generates a new random private key. It returns an error upon -// failure. -func GenPrivKey() (*PrivKey, error) { - priv, err := crypto.GenerateEthKey() - if err != nil { - return nil, err - } - - return &PrivKey{ - Key: crypto.FromECDSA(priv), - }, nil -} - -// ToECDSA returns the ECDSA private key as a reference to ecdsa.PrivateKey type. -func (privKey PrivKey) ToECDSA() (*ecdsa.PrivateKey, error) { - return crypto.ToECDSA(privKey.Bytes()) -} - -// =============================================================================================== -// Public Key -// =============================================================================================== - -// Pubkey is a wrapper around the Ethereum secp256k1 public key type. This wrapper conforms to -// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 public key type within the -// Cosmos SDK. - -// Compile-time type assertion. -var _ cryptotypes.PubKey = &PubKey{} - -// Address returns the address of the ECDSA public key. -// The function will return an empty address if the public key is invalid. -func (pubKey PubKey) Address() cmcrypto.Address { - key, err := crypto.DecompressPubkey(pubKey.Key) - if err != nil { - return nil - } - - return cmcrypto.Address(crypto.PubkeyToAddress(*key).Bytes()) -} - -// Bytes returns the pubkey byte format. -func (pubKey *PubKey) Bytes() []byte { - return pubKey.Key -} - -// Type returns eth_secp256k1. -func (pubKey *PubKey) Type() string { - return KeyType -} - -// Equals returns true if the pubkey type is the same and their bytes are deeply equal. -func (pubKey PubKey) Equals(other cryptotypes.PubKey) bool { - return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes()) -} diff --git a/cosmos/crypto/keys/ethsecp256k1/keys.pb.go b/cosmos/crypto/keys/ethsecp256k1/keys.pb.go deleted file mode 100644 index 7ace5fa0b3..0000000000 --- a/cosmos/crypto/keys/ethsecp256k1/keys.pb.go +++ /dev/null @@ -1,499 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: polaris/crypto/ethsecp256k1/v1/keys.proto - -package ethsecp256k1 - -import ( - fmt "fmt" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// `PubKey` defines a type alias for an `ecdsa.PublicKey` that implements -// CometBFT's `PubKey` interface. It represents the 33-byte compressed public -// key format. -type PubKey struct { - // `key` is the public key in byte form. - Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` -} - -func (m *PubKey) Reset() { *m = PubKey{} } -func (m *PubKey) String() string { return proto.CompactTextString(m) } -func (*PubKey) ProtoMessage() {} -func (*PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_e0c989ba1b8717d6, []int{0} -} -func (m *PubKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PubKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_PubKey.Merge(m, src) -} -func (m *PubKey) XXX_Size() int { - return m.Size() -} -func (m *PubKey) XXX_DiscardUnknown() { - xxx_messageInfo_PubKey.DiscardUnknown(m) -} - -var xxx_messageInfo_PubKey proto.InternalMessageInfo - -func (m *PubKey) GetKey() []byte { - if m != nil { - return m.Key - } - return nil -} - -// `PrivKey` defines a type alias for a n`ecdsa.PrivateKey` that implements -// CometBFT's `PrivateKey` interface. -type PrivKey struct { - // `key` is the private key in byte form. - Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` -} - -func (m *PrivKey) Reset() { *m = PrivKey{} } -func (m *PrivKey) String() string { return proto.CompactTextString(m) } -func (*PrivKey) ProtoMessage() {} -func (*PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_e0c989ba1b8717d6, []int{1} -} -func (m *PrivKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PrivKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PrivKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_PrivKey.Merge(m, src) -} -func (m *PrivKey) XXX_Size() int { - return m.Size() -} -func (m *PrivKey) XXX_DiscardUnknown() { - xxx_messageInfo_PrivKey.DiscardUnknown(m) -} - -var xxx_messageInfo_PrivKey proto.InternalMessageInfo - -func (m *PrivKey) GetKey() []byte { - if m != nil { - return m.Key - } - return nil -} - -func init() { - proto.RegisterType((*PubKey)(nil), "polaris.crypto.ethsecp256k1.v1.PubKey") - proto.RegisterType((*PrivKey)(nil), "polaris.crypto.ethsecp256k1.v1.PrivKey") -} - -func init() { - proto.RegisterFile("polaris/crypto/ethsecp256k1/v1/keys.proto", fileDescriptor_e0c989ba1b8717d6) -} - -var fileDescriptor_e0c989ba1b8717d6 = []byte{ - // 182 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0xc8, 0xcf, 0x49, - 0x2c, 0xca, 0x2c, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x4f, 0x2d, 0xc9, 0x28, 0x4e, - 0x4d, 0x2e, 0x30, 0x32, 0x35, 0xcb, 0x36, 0xd4, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, - 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x83, 0x2a, 0xd5, 0x83, 0x28, 0xd5, 0x43, 0x56, 0xaa, - 0x57, 0x66, 0xa8, 0x24, 0xc5, 0xc5, 0x16, 0x50, 0x9a, 0xe4, 0x9d, 0x5a, 0x29, 0x24, 0xc0, 0xc5, - 0x9c, 0x9d, 0x5a, 0x29, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x13, 0x04, 0x62, 0x2a, 0x49, 0x73, 0xb1, - 0x07, 0x14, 0x65, 0x96, 0x61, 0x95, 0x74, 0x0a, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, - 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, - 0x39, 0x86, 0x28, 0xcb, 0x82, 0xec, 0x74, 0xbd, 0xa4, 0xd4, 0xa2, 0xc4, 0xe4, 0x8c, 0xc4, 0xcc, - 0x3c, 0xbd, 0x94, 0xd4, 0x32, 0x7d, 0xb8, 0x7b, 0xf3, 0x8b, 0x73, 0xf3, 0xe1, 0xce, 0x06, 0x39, - 0x13, 0xc5, 0xed, 0x49, 0x6c, 0x60, 0x47, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5e, 0xa7, - 0xc8, 0x46, 0xe1, 0x00, 0x00, 0x00, -} - -func (m *PubKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PrivKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PrivKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { - offset -= sovKeys(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *PubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *PrivKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func sovKeys(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozKeys(x uint64) (n int) { - return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *PubKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PrivKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PrivKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipKeys(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowKeys - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowKeys - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowKeys - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthKeys - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupKeys - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthKeys - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") -) diff --git a/cosmos/crypto/keys/ethsecp256k1/keys_test.go b/cosmos/crypto/keys/ethsecp256k1/keys_test.go deleted file mode 100644 index 5e4e7b5166..0000000000 --- a/cosmos/crypto/keys/ethsecp256k1/keys_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package ethsecp256k1 - -import ( - "testing" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - - ethcrypto "pkg.berachain.dev/polaris/eth/crypto" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestEthSecp256K1(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/crypto/keys/ethsecp256k1") -} - -var _ = Describe("PubPrivKey", func() { - var privKey *PrivKey - - BeforeEach(func() { - var err error - privKey, err = GenPrivKey() - Expect(err).ToNot(HaveOccurred()) - }) - - It("validates type and equality", func() { - Expect(privKey).To(BeAssignableToTypeOf((cryptotypes.PrivKey)(&PrivKey{}))) - }) - - It("validates inequality", func() { - privKey2, err := GenPrivKey() - Expect(err).ToNot(HaveOccurred()) - Expect(privKey.Equals(privKey2)).To(BeFalse()) - }) - - It("validates Ethereum address equality", func() { - addr := privKey.PubKey().Address() - key, err := privKey.ToECDSA() - Expect(err).ToNot(HaveOccurred()) - expectedAddr := ethcrypto.PubkeyToAddress(key.PublicKey) - Expect(expectedAddr.Bytes()).To(Equal(addr.Bytes())) - }) - - It("validates type", func() { - pubKey := &PubKey{ - Key: privKey.PubKey().Bytes(), - } - Expect(pubKey).To(BeAssignableToTypeOf((cryptotypes.PubKey)(&PubKey{}))) - }) - - It("validates equality", func() { - privKey2, err := GenPrivKey() - Expect(err).ToNot(HaveOccurred()) - Expect(privKey).ToNot(Equal(privKey2)) - Expect(privKey.PubKey()).ToNot(Equal(privKey2.PubKey())) - }) - -}) diff --git a/cosmos/crypto/keys/ethsecp256k1/signature_cgo.go b/cosmos/crypto/keys/ethsecp256k1/signature_cgo.go deleted file mode 100644 index 0b02aa042b..0000000000 --- a/cosmos/crypto/keys/ethsecp256k1/signature_cgo.go +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package ethsecp256k1 - -import ( - "pkg.berachain.dev/polaris/eth/crypto" -) - -// Sign signs the provided message using the ECDSA private key. It returns an error if the -// Sign creates a recoverable ECDSA signature on the `secp256k1` curve over the -// provided hash of the message. The produced signature is 65 bytes -// where the last byte contains the recovery ID. -func (privKey PrivKey) Sign(digestBz []byte) ([]byte, error) { - // We hash the provided input since EthSign expects a 32byte hash. - if len(digestBz) != crypto.DigestLength { - digestBz = crypto.Keccak256(digestBz) - } - - key, err := privKey.ToECDSA() - if err != nil { - return nil, err - } - - return crypto.EthSign(digestBz, key) -} - -// VerifySignature verifies that the ECDSA public key created a given signature over -// the provided message. The signature should be in [R || S] format. -func (pubKey PubKey) VerifySignature(msg, sig []byte) bool { - // This is a little hacky, but in order to work around the fact that the Cosmos-SDK typically - // does not hash messages, we have to accept an unhashed message and hash it. - // NOTE: this function will not work correctly if a msg of length 32 is provided, that is actually - // the hash of the message that was signed. - if len(msg) != crypto.DigestLength { - msg = crypto.Keccak256(msg) - } - - // The signature length must be correct. - if len(sig) == crypto.SignatureLength { - // remove recovery ID (V) if contained in the signature - sig = sig[:len(sig)-1] - } - - // The signature needs to be in [R || S] format when provided to `VerifySignature`. - return crypto.VerifySignature(pubKey.Key, msg, sig) -} diff --git a/cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go b/cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go deleted file mode 100644 index 1933a05b88..0000000000 --- a/cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package ethsecp256k1 - -import ( - "crypto/ecdsa" - - "pkg.berachain.dev/polaris/eth/crypto" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("PrivKey_PubKey", func() { - var privKey *PrivKey - var ecdsaPrivKey *ecdsa.PrivateKey - - BeforeEach(func() { - var err error - privKey, err = GenPrivKey() - Expect(err).ToNot(HaveOccurred()) - ecdsaPrivKey, err = privKey.ToECDSA() - Expect(err).ToNot(HaveOccurred()) - }) - - It("validates signing bytes", func() { - msg := []byte("hello world") - // for the eth case, we have to manually hash in the test. - sigHash := crypto.Keccak256(msg) - - expectedSig, err := crypto.EthSign(sigHash, ecdsaPrivKey) - Expect(err).ToNot(HaveOccurred()) - - sig, err := privKey.Sign(msg) - Expect(err).ToNot(HaveOccurred()) - Expect(expectedSig).To(Equal(sig)) - }) - - It("validates signature", func() { - msg := []byte("hello world") - sigHash := crypto.Keccak256(msg) - sig, err := privKey.Sign(sigHash) - Expect(err).ToNot(HaveOccurred()) - - res := privKey.PubKey().VerifySignature(sigHash, sig) - Expect(res).To(BeTrue()) - }) -}) diff --git a/cosmos/go.mod b/cosmos/go.mod index b733b27bd9..c4a5f16e7f 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -20,13 +20,11 @@ require ( cosmossdk.io/math v1.1.3-rc.1 cosmossdk.io/store v1.0.0-rc.0 cosmossdk.io/x/tx v0.10.0 - github.com/btcsuite/btcd v0.23.4 - github.com/btcsuite/btcd/btcutil v1.1.3 github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 github.com/cosmos/cosmos-sdk v0.50.0-rc.1 - github.com/cosmos/go-bip39 v1.0.0 + github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.13.1 github.com/golang/mock v1.6.0 @@ -64,7 +62,6 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/bytedance/sonic v1.10.0 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 27c4eaf465..2b195bfdc7 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -85,7 +85,6 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -121,31 +120,12 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsy github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -259,19 +239,15 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= @@ -607,8 +583,6 @@ github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsD github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -616,7 +590,6 @@ github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -635,7 +608,6 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= @@ -767,7 +739,6 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1024,7 +995,6 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1078,7 +1048,6 @@ 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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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= diff --git a/cosmos/lib/ante/ignore.go b/cosmos/lib/ante/ignore.go deleted file mode 100644 index 52f8990757..0000000000 --- a/cosmos/lib/ante/ignore.go +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package antelib - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/lib/utils" -) - -// IgnoreDecorator is an AnteDecorator that wraps an existing AnteDecorator. It allows -// EthTransactions to skip said Decorator by checking to see if the transaction -// contains a message of the given type. -type IgnoreDecorator[D sdk.AnteDecorator, M sdk.Msg] struct { - decorator D -} - -// NewIgnoreDecorator returns a new IgnoreDecorator[D, M] instance. -func NewIgnoreDecorator[D sdk.AnteDecorator, M sdk.Msg](decorator D) *IgnoreDecorator[D, M] { - return &IgnoreDecorator[D, M]{ - decorator: decorator, - } -} - -// AnteHandle implements the sdk.AnteDecorator interface, it is handle the -// type check for the message type. -func (sd IgnoreDecorator[D, M]) AnteHandle( - ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, -) (sdk.Context, error) { - for _, msg := range tx.GetMsgs() { - if _, ok := utils.GetAs[M](msg); ok { - return next(ctx, tx, simulate) - } - } - - return sd.decorator.AnteHandle(ctx, tx, simulate, next) -} diff --git a/cosmos/lib/ante/ignore_test.go b/cosmos/lib/ante/ignore_test.go deleted file mode 100644 index eb9c450535..0000000000 --- a/cosmos/lib/ante/ignore_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package antelib - -import ( - "errors" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/cosmos/testing/types/mock" - mocktypes "pkg.berachain.dev/polaris/cosmos/testing/types/mock/interfaces/mock" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -// TestAnteDecorator is a mock implementation of sdk.AnteDecorator for testing purposes. -type TestAnteDecorator struct{} - -// AnteHandle returns a custom error if called. -func (f TestAnteDecorator) AnteHandle( - ctx sdk.Context, _ sdk.Tx, _ bool, _ sdk.AnteHandler, -) (sdk.Context, error) { - return ctx, errors.New("ante_handle_called") -} - -func TestAnteLib(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/lib/ante") -} - -var _ = Describe("IgnoreDecorator", func() { - var ( - ignoreDecorator *IgnoreDecorator[TestAnteDecorator, *mocktypes.MsgMock] - fakeAnteDecorator TestAnteDecorator - ) - - BeforeEach(func() { - fakeAnteDecorator = TestAnteDecorator{} - ignoreDecorator = NewIgnoreDecorator[TestAnteDecorator, *mocktypes.MsgMock](fakeAnteDecorator) - }) - - // Test case when the transaction contains the specified message type. - Context("when the transaction contains the specified message type", func() { - It("should bypass the wrapped decorator", func() { - tx := mock.NewTx() - tx.GetMsgsFunc = func() []sdk.Msg { - return []sdk.Msg{mock.NewMsg()} - } - ctx := sdk.Context{} - next := func(sdk.Context, sdk.Tx, bool) (sdk.Context, error) { - return ctx, nil - } - - newCtx, err := ignoreDecorator.AnteHandle(ctx, tx, false, next) - Expect(newCtx).To(Equal(ctx)) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - // Test case when the transaction does not contain the specified message type. - Context("when the transaction does not contain the specified message type", func() { - It("should call the wrapped decorator's AnteHandle", func() { - tx := mock.NewTx() - tx.GetMsgsFunc = func() []sdk.Msg { - return []sdk.Msg{} - } - ctx := sdk.Context{} - next := func(sdk.Context, sdk.Tx, bool) (sdk.Context, error) { - return ctx, nil - } - - _, err := ignoreDecorator.AnteHandle(ctx, tx, false, next) - Expect(err).To(MatchError("ante_handle_called")) - }) - }) -}) diff --git a/cosmos/crypto/hd/hd_test.go b/cosmos/lib/ante/minimal.go similarity index 76% rename from cosmos/crypto/hd/hd_test.go rename to cosmos/lib/ante/minimal.go index 2b0daa5234..02b4f27f35 100644 --- a/cosmos/crypto/hd/hd_test.go +++ b/cosmos/lib/ante/minimal.go @@ -18,16 +18,15 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package hd +package antelib import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/ante" ) -func TestHD(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/crypto/hd") +// NewMinimalHandler produces the absolute minimum handler that can produce valid +// blocks. +func NewMinimalHandler() sdk.AnteHandler { + return sdk.ChainAnteDecorators(ante.NewSetUpContextDecorator()) } diff --git a/cosmos/lib/conversions.go b/cosmos/lib/conversions.go index 876ea95ccc..3028eec560 100644 --- a/cosmos/lib/conversions.go +++ b/cosmos/lib/conversions.go @@ -242,7 +242,7 @@ func SdkProposalToGovProposal( return governance.IGovernanceModuleProposal{}, err } - return governance.IGovernanceModuleProposal{ + output := governance.IGovernanceModuleProposal{ Id: proposal.Id, Messages: messages, Status: int32(proposal.Status), // Status is an alias for int32. @@ -252,16 +252,31 @@ func SdkProposalToGovProposal( NoCount: proposal.FinalTallyResult.NoCount, NoWithVetoCount: proposal.FinalTallyResult.NoWithVetoCount, }, - SubmitTime: uint64(proposal.SubmitTime.Unix()), - DepositEndTime: uint64(proposal.DepositEndTime.Unix()), - VotingStartTime: uint64(proposal.VotingStartTime.Unix()), - VotingEndTime: uint64(proposal.VotingEndTime.Unix()), - TotalDeposit: totalDeposit, - Metadata: proposal.Metadata, - Title: proposal.Title, - Summary: proposal.Summary, - Proposer: proposerAddr, - }, nil + + TotalDeposit: totalDeposit, + Metadata: proposal.Metadata, + Title: proposal.Title, + Summary: proposal.Summary, + Proposer: proposerAddr, + } + + if proposal.SubmitTime != nil { + output.SubmitTime = uint64(proposal.SubmitTime.Unix()) + } + + if proposal.DepositEndTime != nil { + output.DepositEndTime = uint64(proposal.DepositEndTime.Unix()) + } + + if proposal.VotingStartTime != nil { + output.VotingStartTime = uint64(proposal.VotingStartTime.Unix()) + } + + if proposal.VotingEndTime != nil { + output.VotingEndTime = uint64(proposal.VotingEndTime.Unix()) + } + + return output, nil } // ConvertMsgSubmitProposalToSdk is a helper function to convert a `MsgSubmitProposal` to the gov diff --git a/cosmos/crypto/codec/codec_test.go b/cosmos/lib/signing/signers.go similarity index 69% rename from cosmos/crypto/codec/codec_test.go rename to cosmos/lib/signing/signers.go index 6e9542ccc0..7085a678b6 100644 --- a/cosmos/crypto/codec/codec_test.go +++ b/cosmos/lib/signing/signers.go @@ -18,24 +18,22 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package codec +package signing import ( - "testing" + "google.golang.org/protobuf/proto" - "github.com/cosmos/cosmos-sdk/codec/types" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" + "cosmossdk.io/x/tx/signing" ) -func TestCodec(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/crypto/codec") +// ProvideNoopGetSigners returns a CustomGetSigner that always returns 0x0. +func ProvideNoopGetSigners[T proto.Message]() signing.CustomGetSigner { + var t T + return signing.CustomGetSigner{ + MsgType: proto.MessageName(t), + Fn: func(msg proto.Message) ([][]byte, error) { + // Return the signer in the required format. + return [][]byte{{0x0}}, nil + }, + } } - -var _ = Describe("Codec", func() { - It("should not panic", func() { - RegisterInterfaces(types.NewInterfaceRegistry()) - }) -}) diff --git a/cosmos/lib/tx/serializer.go b/cosmos/lib/tx/serializer.go new file mode 100644 index 0000000000..bf9887a199 --- /dev/null +++ b/cosmos/lib/tx/serializer.go @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package libtx + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + sdk "github.com/cosmos/cosmos-sdk/types" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" +) + +// TxSerializer provides an interface to serialize ethereum transactions +// to sdk.Tx's and bytes that can be used by CometBFT. +type TxSerializer[I any] interface { + ToSdkTx(input I, gasLimit uint64) (sdk.Tx, error) + ToSdkTxBytes(input I, gasLimit uint64) ([]byte, error) +} + +type serializer[I any, O sdk.Msg] struct { + txConfig client.TxConfig + wrapFn func(I) (O, error) +} + +// NewSerializer returns a new instance of TxSerializer. +func NewSerializer[I any, O sdk.Msg]( + txConfig client.TxConfig, wrapFn func(I) (O, error), +) TxSerializer[I] { + return &serializer[I, O]{ + txConfig: txConfig, + wrapFn: wrapFn, + } +} + +func (s *serializer[I, O]) ToSdkTx(input I, gasLimit uint64) (sdk.Tx, error) { + var err error + // TODO: do we really need to use extensions for anything? Since we + // are using the standard ante handler stuff I don't think we actually need to. + tx := s.txConfig.NewTxBuilder() + + // Set the tx gas limit to the block gas limit in the payload + tx.SetGasLimit(gasLimit) + + wrapped, err := s.wrapFn(input) + if err != nil { + return nil, err + } + // TODO: figure out if we can ignore setting sigs. + if err = tx.SetSignatures( + signingtypes.SignatureV2{ + Sequence: 0, + Data: &signingtypes.SingleSignatureData{ + Signature: []byte{0x01}, + }, + PubKey: &secp256k1.PubKey{Key: []byte{0x01}}, + }, + ); err != nil { + return nil, err + } + + // Lastly, we inject the signed ethereum transaction as a message into the Cosmos Tx. + if err = tx.SetMsgs(wrapped); err != nil { + return nil, err + } + + // Finally, we return the Cosmos Tx. + return tx.GetTx(), nil +} + +// SerializeToBytes converts an Ethereum transaction to Cosmos formatted +// txBytes which allows for it to broadcast it to CometBFT. +func (s *serializer[I, O]) ToSdkTxBytes( + input I, gasLimit uint64, +) ([]byte, error) { + // First, we convert the Ethereum transaction to a Cosmos transaction. + cosmosTx, err := s.ToSdkTx(input, gasLimit) + if err != nil { + return nil, err + } + + // Then we use the clientCtx.TxConfig.TxEncoder() to encode the Cosmos transaction into bytes. + return s.txConfig.TxEncoder()(cosmosTx) +} diff --git a/cosmos/miner/miner.go b/cosmos/miner/miner.go index fdd20854cb..930c037583 100644 --- a/cosmos/miner/miner.go +++ b/cosmos/miner/miner.go @@ -31,17 +31,23 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/miner" - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/core/types" ) // emptyHash is a common.Hash initialized to all zeros. var emptyHash = common.Hash{} +// EthTxSerializer represents a struct that can serialize ethereum transactions +// to valid sdk.Tx's and bytes that can be used by CometBFT. +type EthTxSerializer interface { + ToSdkTx(input *types.Transaction, gasLimit uint64) (sdk.Tx, error) + ToSdkTxBytes(input *types.Transaction, gasLimit uint64) ([]byte, error) +} + // Miner implements the baseapp.TxSelector interface. type Miner struct { *miner.Miner - serializer evmtypes.TxSerializer + serializer EthTxSerializer currentPayload *miner.Payload } @@ -53,7 +59,7 @@ func New(gm *miner.Miner) *Miner { } // Init sets the transaction serializer. -func (m *Miner) Init(serializer evmtypes.TxSerializer) { +func (m *Miner) Init(serializer EthTxSerializer) { m.serializer = serializer } @@ -123,7 +129,7 @@ func (m *Miner) resolveTxs() [][]byte { if err := tx.UnmarshalBinary(ethTxBz); err != nil { return nil } - bz, err := m.serializer.SerializeToBytes(&tx) + bz, err := m.serializer.ToSdkTxBytes(&tx, tx.Gas()) if err != nil { panic(err) } diff --git a/cosmos/precompile/bank/bank.go b/cosmos/precompile/bank/bank.go index 7f63ecc095..27d3210c1f 100644 --- a/cosmos/precompile/bank/bank.go +++ b/cosmos/precompile/bank/bank.go @@ -32,7 +32,6 @@ import ( "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" bankgenerated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" cosmlib "pkg.berachain.dev/polaris/cosmos/lib" - "pkg.berachain.dev/polaris/cosmos/precompile" "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/vm" @@ -188,56 +187,6 @@ func (c *Contract) GetAllSupply( return cosmlib.SdkCoinsToEvmCoins(res.Supply), nil } -// GetDenomMetadata implements `getDenomMetadata(string)` method. -func (c *Contract) GetDenomMetadata( - ctx context.Context, - denom string, -) (bankgenerated.IBankModuleDenomMetadata, error) { - res, err := c.querier.DenomMetadata(ctx, &banktypes.QueryDenomMetadataRequest{ - Denom: denom, - }) - if err != nil { - return bankgenerated.IBankModuleDenomMetadata{}, err - } - - denomUnits := make([]bankgenerated.IBankModuleDenomUnit, len(res.Metadata.DenomUnits)) - for i, d := range res.Metadata.DenomUnits { - denomUnits[i] = bankgenerated.IBankModuleDenomUnit{ - Denom: d.Denom, - Aliases: d.Aliases, - Exponent: d.Exponent, - } - } - - result := bankgenerated.IBankModuleDenomMetadata{ - Description: res.Metadata.Description, - DenomUnits: denomUnits, - Base: res.Metadata.Base, - Display: res.Metadata.Display, - Name: res.Metadata.Name, - Symbol: res.Metadata.Symbol, - } - return result, nil -} - -// GetSendEnabled implements `getSendEnabled(string)` method. -func (c *Contract) GetSendEnabled( - ctx context.Context, - denom string, -) (bool, error) { - res, err := c.querier.SendEnabled(ctx, &banktypes.QuerySendEnabledRequest{ - Denoms: []string{denom}, - }) - if err != nil { - return false, err - } - if len(res.SendEnabled) == 0 { - return false, precompile.ErrInvalidString - } - - return res.SendEnabled[0].Enabled, nil -} - // Send implements `send(address,(uint256,string)[])` method. func (c *Contract) Send( ctx context.Context, diff --git a/cosmos/precompile/bank/bank_test.go b/cosmos/precompile/bank/bank_test.go index d9c1554cf6..afd570d95b 100644 --- a/cosmos/precompile/bank/bank_test.go +++ b/cosmos/precompile/bank/bank_test.go @@ -34,7 +34,6 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/bank" "pkg.berachain.dev/polaris/cosmos/precompile" "pkg.berachain.dev/polaris/cosmos/precompile/bank" testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" @@ -389,61 +388,6 @@ var _ = Describe("Bank Precompile Test", func() { }) }) - When("GetDenomMetadata", func() { - - It("should fail if input denom is not a valid Denom", func() { - res, err := contract.GetDenomMetadata( - ctx, - "_invalid_denom", - ) - - Expect(err).To(HaveOccurred()) - Expect(res).To(Equal(generated.IBankModuleDenomMetadata{})) - }) - - It("should succeed", func() { - expectedResult := generated.IBankModuleDenomMetadata{ - Name: "Berachain bera", - Symbol: "BERA", - Description: "The Bera.", - DenomUnits: []generated.IBankModuleDenomUnit{ - {Denom: "bera", Exponent: uint32(0), Aliases: []string{"bera"}}, - {Denom: "nbera", Exponent: uint32(9), Aliases: []string{"nanobera"}}, - {Denom: "abera", Exponent: uint32(18), Aliases: []string{"attobera"}}, - }, - Base: "abera", - Display: "bera", - } - - metadata := getTestMetadata() - bk.SetDenomMetaData(ctx, metadata[0]) - - res, err := contract.GetDenomMetadata( - ctx, - metadata[0].Base, - ) - Expect(err).ToNot(HaveOccurred()) - Expect(res).To(Equal(expectedResult)) - }) - }) - - When("GetSendEnabled", func() { - It("should succeed", func() { - enabledDenom := "enabledDenom" - // disabledDenom := "disabledDenom" - - bk.SetSendEnabled(ctx, enabledDenom, true) - - res, err := contract.GetSendEnabled( - ctx, - enabledDenom, - ) - Expect(err).ToNot(HaveOccurred()) - - Expect(res).To(BeTrue()) - }) - }) - When("Send", func() { It("should succeed", func() { @@ -531,36 +475,6 @@ func FundAccount( } return bk.SendCoinsFromModuleToAccount(ctx, evmtypes.ModuleName, account, coins) } - -func getTestMetadata() []banktypes.Metadata { - return []banktypes.Metadata{ - { - Name: "Berachain bera", - Symbol: "BERA", - Description: "The Bera.", - DenomUnits: []*banktypes.DenomUnit{ - {Denom: "bera", Exponent: uint32(0), Aliases: []string{"bera"}}, - {Denom: "nbera", Exponent: uint32(9), Aliases: []string{"nanobera"}}, - {Denom: "abera", Exponent: uint32(18), Aliases: []string{"attobera"}}, - }, - Base: "abera", - Display: "bera", - }, - { - Name: "Token", - Symbol: "TOKEN", - Description: "The native staking token of the Token Hub.", - DenomUnits: []*banktypes.DenomUnit{ - {Denom: "1token", Exponent: uint32(5), Aliases: []string{"decitoken"}}, - {Denom: "2token", Exponent: uint32(4), Aliases: []string{"centitoken"}}, - {Denom: "3token", Exponent: uint32(7), Aliases: []string{"dekatoken"}}, - }, - Base: "utoken", - Display: "token", - }, - } -} - func sdkCoinsToEvmCoins(sdkCoins sdk.Coins) []struct { Amount *big.Int `json:"amount"` Denom string `json:"denom"` diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index abe947a19c..614cf7f8bc 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -505,7 +505,11 @@ var _ = Describe("Governance Precompile", func() { // Embed the send msg into a proposal. proposal := v1.MsgSubmitProposal{ - Messages: []*codectypes.Any{msgAny}, + InitialDeposit: sdk.NewCoins(sdk.NewCoin("abera", sdkmath.NewInt(100))), + Messages: []*codectypes.Any{msgAny}, + Proposer: sdk.AccAddress([]byte("proposer")).String(), + Metadata: "metadata", + Title: "title", } // Marshal the proposal. diff --git a/cosmos/precompile/governance/testutil.go b/cosmos/precompile/governance/testutil.go index 07e5a46d0c..d0b8dca0b3 100644 --- a/cosmos/precompile/governance/testutil.go +++ b/cosmos/precompile/governance/testutil.go @@ -80,7 +80,7 @@ func setupGovTest(ctrl *gomock.Controller, caller sdk.AccAddress) ( msr := baseapp.NewMsgServiceRouter() stakingParams := stakingtypes.DefaultParams() - stakingParams.BondDenom = "abgt" + stakingParams.BondDenom = "abera" err := sk.SetParams(ctx, stakingParams) if err != nil { panic(err) diff --git a/cosmos/proto/polaris/crypto/ethsecp256k1/v1/keys.proto b/cosmos/proto/polaris/crypto/ethsecp256k1/v1/keys.proto deleted file mode 100644 index e6414ace25..0000000000 --- a/cosmos/proto/polaris/crypto/ethsecp256k1/v1/keys.proto +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -syntax = "proto3"; - -package polaris.crypto.ethsecp256k1.v1; - -option go_package = "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1"; - -// `PubKey` defines a type alias for an `ecdsa.PublicKey` that implements -// CometBFT's `PubKey` interface. It represents the 33-byte compressed public -// key format. -message PubKey { - // `key` is the public key in byte form. - bytes key = 1; -} - -// `PrivKey` defines a type alias for a n`ecdsa.PrivateKey` that implements -// CometBFT's `PrivateKey` interface. -message PrivKey { - // `key` is the private key in byte form. - bytes key = 1; -} diff --git a/cosmos/testing/utils/setup.go b/cosmos/testing/utils/setup.go index b48a3004c7..8c84ee9552 100644 --- a/cosmos/testing/utils/setup.go +++ b/cosmos/testing/utils/setup.go @@ -89,8 +89,8 @@ type TestEncodingConfig struct { func MakeTestEncodingConfig(modules ...module.AppModuleBasic) TestEncodingConfig { aminoCodec := codec.NewLegacyAmino() interfaceRegistry := codectestutil.CodecOptions{ - AccAddressPrefix: "polar", - ValAddressPrefix: "polarvaloper", + AccAddressPrefix: "cosmos", + ValAddressPrefix: "cosmosvaloper", }.NewInterfaceRegistry() codec := codec.NewProtoCodec(interfaceRegistry) @@ -146,7 +146,7 @@ func SetupMinimalKeepers() ( }, // TODO: switch to eip-55 fuck bech32. addrCodec, - types.Bech32Prefix, + "cosmos", authority, ) diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index 8bc50b673d..8c1c25dd21 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -50,8 +50,8 @@ type TxSubProvider interface { // TxSerializer provides an interface to Serialize Geth Transactions to Bytes (via sdk.Tx). type TxSerializer interface { - SerializeToSdkTx(signedTx *coretypes.Transaction) (sdk.Tx, error) - SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) + ToSdkTx(signedTx *coretypes.Transaction, gasLimit uint64) (sdk.Tx, error) + ToSdkTxBytes(signedTx *coretypes.Transaction, gasLimit uint64) ([]byte, error) } // TxBroadcaster provides an interface to broadcast TxBytes to the comet p2p layer. @@ -163,7 +163,7 @@ func (h *handler) broadcastTransactions(txs coretypes.Transactions) { h.logger.Debug("broadcasting transactions", "num_txs", len(txs)) for _, signedEthTx := range txs { // Serialize the transaction to Bytes - txBytes, err := h.serializer.SerializeToBytes(signedEthTx) + txBytes, err := h.serializer.ToSdkTxBytes(signedEthTx, signedEthTx.Gas()) if err != nil { h.logger.Error("failed to serialize transaction", "err", err) continue diff --git a/cosmos/txpool/handler_test.go b/cosmos/txpool/handler_test.go index 18c9c71df5..6e31d95859 100644 --- a/cosmos/txpool/handler_test.go +++ b/cosmos/txpool/handler_test.go @@ -43,7 +43,6 @@ func TestTxpool(t *testing.T) { var _ = Describe("", func() { var h *handler - t := GinkgoT() var subscription *mocks.Subscription var serializer *mocks.TxSerializer @@ -51,6 +50,8 @@ var _ = Describe("", func() { var subprovider *mocks.TxSubProvider BeforeEach(func() { + t := GinkgoT() + defer GinkgoRecover() subscription = mocks.NewSubscription(t) subscription.On("Err").Return(nil) subscription.On("Unsubscribe").Return() @@ -80,21 +81,23 @@ var _ = Describe("", func() { When("", func() { It("should handle 1 tx", func() { - serializer.On("SerializeToBytes", mock.Anything).Return([]byte{123}, nil).Once() + defer GinkgoRecover() + serializer.On("ToSdkTxBytes", mock.Anything, mock.Anything).Return([]byte{123}, nil).Once() broadcaster.On("BroadcastTxSync", []byte{123}).Return(nil, nil).Once() h.txsCh <- core.NewTxsEvent{ - Txs: []*coretypes.Transaction{coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5})}, + Txs: []*coretypes.Transaction{coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5, Gas: 100})}, } }) It("should handle multiple tx", func() { - serializer.On("SerializeToBytes", mock.Anything).Return([]byte{123}, nil).Twice() + defer GinkgoRecover() + serializer.On("ToSdkTxBytes", mock.Anything, mock.Anything).Return([]byte{123}, nil).Twice() broadcaster.On("BroadcastTxSync", []byte{123}).Return(nil, nil).Twice() h.txsCh <- core.NewTxsEvent{Txs: []*coretypes.Transaction{ - coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5}), - coretypes.NewTx(&coretypes.LegacyTx{Nonce: 6}), + coretypes.NewTx(&coretypes.LegacyTx{Nonce: 5, Gas: 10}), + coretypes.NewTx(&coretypes.LegacyTx{Nonce: 6, Gas: 10}), }} }) }) diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index 7d99c3d929..98b389f086 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -104,7 +104,7 @@ func (m *Mempool) Insert(ctx context.Context, sdkTx sdk.Tx) error { if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); !ok { return errors.New("only WrappedEthereumTransactions are supported") } else if errs := m.txpool.Add( - []*coretypes.Transaction{wet.AsTransaction()}, false, false, + []*coretypes.Transaction{wet.Unwrap()}, false, false, ); len(errs) != 0 { // Handle case where a node broadcasts to itself, we don't want it to fail CheckTx. if errors.Is(errs[0], legacypool.ErrAlreadyKnown) && sCtx.IsCheckTx() { diff --git a/cosmos/txpool/mempool_test.go b/cosmos/txpool/mempool_test.go index dd8742310e..0cdf156b12 100644 --- a/cosmos/txpool/mempool_test.go +++ b/cosmos/txpool/mempool_test.go @@ -43,19 +43,21 @@ var _ = Describe("", func() { sdkTx *mocks.SdkTx mempool *Mempool ctx = sdk.Context{}.WithIsCheckTx(true) + wet *evmtypes.WrappedEthereumTransaction ) BeforeEach(func() { txPool = mocks.NewGethTxPool(t) sdkTx = mocks.NewSdkTx(t) mempool = &Mempool{txpool: txPool} + wet, _ = evmtypes.WrapTx(coretypes.NewTx(&coretypes.LegacyTx{})) }) When("we call insert", func() { When("the txpool does not error", func() { It("does not error", func() { sdkTx.On("GetMsgs"). - Return([]sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}). + Return([]sdk.Msg{wet}). Once() txPool.On("Add", mock.Anything, mock.Anything, mock.Anything). Return(nil).Once() @@ -65,7 +67,7 @@ var _ = Describe("", func() { When("the txpool errors", func() { It("does error", func() { sdkTx.On("GetMsgs").Return( - []sdk.Msg{evmtypes.NewFromTransaction(coretypes.NewTx(&coretypes.LegacyTx{}))}).Once() + []sdk.Msg{wet}).Once() txPool.On("Add", mock.Anything, mock.Anything, mock.Anything). Return([]error{errors.New("mock error")}).Once() diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 6a8449633a..19d4e5142d 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -22,25 +22,25 @@ func (_m *TxSerializer) EXPECT() *TxSerializer_Expecter { return &TxSerializer_Expecter{mock: &_m.Mock} } -// SerializeToBytes provides a mock function with given fields: signedTx -func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, error) { - ret := _m.Called(signedTx) +// ToSdkTx provides a mock function with given fields: signedTx, gasLimit +func (_m *TxSerializer) ToSdkTx(signedTx *types.Transaction, gasLimit uint64) (cosmos_sdktypes.Tx, error) { + ret := _m.Called(signedTx, gasLimit) - var r0 []byte + var r0 cosmos_sdktypes.Tx var r1 error - if rf, ok := ret.Get(0).(func(*types.Transaction) ([]byte, error)); ok { - return rf(signedTx) + if rf, ok := ret.Get(0).(func(*types.Transaction, uint64) (cosmos_sdktypes.Tx, error)); ok { + return rf(signedTx, gasLimit) } - if rf, ok := ret.Get(0).(func(*types.Transaction) []byte); ok { - r0 = rf(signedTx) + if rf, ok := ret.Get(0).(func(*types.Transaction, uint64) cosmos_sdktypes.Tx); ok { + r0 = rf(signedTx, gasLimit) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]byte) + r0 = ret.Get(0).(cosmos_sdktypes.Tx) } } - if rf, ok := ret.Get(1).(func(*types.Transaction) error); ok { - r1 = rf(signedTx) + if rf, ok := ret.Get(1).(func(*types.Transaction, uint64) error); ok { + r1 = rf(signedTx, gasLimit) } else { r1 = ret.Error(1) } @@ -48,53 +48,54 @@ func (_m *TxSerializer) SerializeToBytes(signedTx *types.Transaction) ([]byte, e return r0, r1 } -// TxSerializer_SerializeToBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToBytes' -type TxSerializer_SerializeToBytes_Call struct { +// TxSerializer_ToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ToSdkTx' +type TxSerializer_ToSdkTx_Call struct { *mock.Call } -// SerializeToBytes is a helper method to define mock.On call +// ToSdkTx is a helper method to define mock.On call // - signedTx *types.Transaction -func (_e *TxSerializer_Expecter) SerializeToBytes(signedTx interface{}) *TxSerializer_SerializeToBytes_Call { - return &TxSerializer_SerializeToBytes_Call{Call: _e.mock.On("SerializeToBytes", signedTx)} +// - gasLimit uint64 +func (_e *TxSerializer_Expecter) ToSdkTx(signedTx interface{}, gasLimit interface{}) *TxSerializer_ToSdkTx_Call { + return &TxSerializer_ToSdkTx_Call{Call: _e.mock.On("ToSdkTx", signedTx, gasLimit)} } -func (_c *TxSerializer_SerializeToBytes_Call) Run(run func(signedTx *types.Transaction)) *TxSerializer_SerializeToBytes_Call { +func (_c *TxSerializer_ToSdkTx_Call) Run(run func(signedTx *types.Transaction, gasLimit uint64)) *TxSerializer_ToSdkTx_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*types.Transaction)) + run(args[0].(*types.Transaction), args[1].(uint64)) }) return _c } -func (_c *TxSerializer_SerializeToBytes_Call) Return(_a0 []byte, _a1 error) *TxSerializer_SerializeToBytes_Call { +func (_c *TxSerializer_ToSdkTx_Call) Return(_a0 cosmos_sdktypes.Tx, _a1 error) *TxSerializer_ToSdkTx_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *TxSerializer_SerializeToBytes_Call) RunAndReturn(run func(*types.Transaction) ([]byte, error)) *TxSerializer_SerializeToBytes_Call { +func (_c *TxSerializer_ToSdkTx_Call) RunAndReturn(run func(*types.Transaction, uint64) (cosmos_sdktypes.Tx, error)) *TxSerializer_ToSdkTx_Call { _c.Call.Return(run) return _c } -// SerializeToSdkTx provides a mock function with given fields: signedTx -func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sdktypes.Tx, error) { - ret := _m.Called(signedTx) +// ToSdkTxBytes provides a mock function with given fields: signedTx, gasLimit +func (_m *TxSerializer) ToSdkTxBytes(signedTx *types.Transaction, gasLimit uint64) ([]byte, error) { + ret := _m.Called(signedTx, gasLimit) - var r0 cosmos_sdktypes.Tx + var r0 []byte var r1 error - if rf, ok := ret.Get(0).(func(*types.Transaction) (cosmos_sdktypes.Tx, error)); ok { - return rf(signedTx) + if rf, ok := ret.Get(0).(func(*types.Transaction, uint64) ([]byte, error)); ok { + return rf(signedTx, gasLimit) } - if rf, ok := ret.Get(0).(func(*types.Transaction) cosmos_sdktypes.Tx); ok { - r0 = rf(signedTx) + if rf, ok := ret.Get(0).(func(*types.Transaction, uint64) []byte); ok { + r0 = rf(signedTx, gasLimit) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(cosmos_sdktypes.Tx) + r0 = ret.Get(0).([]byte) } } - if rf, ok := ret.Get(1).(func(*types.Transaction) error); ok { - r1 = rf(signedTx) + if rf, ok := ret.Get(1).(func(*types.Transaction, uint64) error); ok { + r1 = rf(signedTx, gasLimit) } else { r1 = ret.Error(1) } @@ -102,30 +103,31 @@ func (_m *TxSerializer) SerializeToSdkTx(signedTx *types.Transaction) (cosmos_sd return r0, r1 } -// TxSerializer_SerializeToSdkTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SerializeToSdkTx' -type TxSerializer_SerializeToSdkTx_Call struct { +// TxSerializer_ToSdkTxBytes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ToSdkTxBytes' +type TxSerializer_ToSdkTxBytes_Call struct { *mock.Call } -// SerializeToSdkTx is a helper method to define mock.On call +// ToSdkTxBytes is a helper method to define mock.On call // - signedTx *types.Transaction -func (_e *TxSerializer_Expecter) SerializeToSdkTx(signedTx interface{}) *TxSerializer_SerializeToSdkTx_Call { - return &TxSerializer_SerializeToSdkTx_Call{Call: _e.mock.On("SerializeToSdkTx", signedTx)} +// - gasLimit uint64 +func (_e *TxSerializer_Expecter) ToSdkTxBytes(signedTx interface{}, gasLimit interface{}) *TxSerializer_ToSdkTxBytes_Call { + return &TxSerializer_ToSdkTxBytes_Call{Call: _e.mock.On("ToSdkTxBytes", signedTx, gasLimit)} } -func (_c *TxSerializer_SerializeToSdkTx_Call) Run(run func(signedTx *types.Transaction)) *TxSerializer_SerializeToSdkTx_Call { +func (_c *TxSerializer_ToSdkTxBytes_Call) Run(run func(signedTx *types.Transaction, gasLimit uint64)) *TxSerializer_ToSdkTxBytes_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*types.Transaction)) + run(args[0].(*types.Transaction), args[1].(uint64)) }) return _c } -func (_c *TxSerializer_SerializeToSdkTx_Call) Return(_a0 cosmos_sdktypes.Tx, _a1 error) *TxSerializer_SerializeToSdkTx_Call { +func (_c *TxSerializer_ToSdkTxBytes_Call) Return(_a0 []byte, _a1 error) *TxSerializer_ToSdkTxBytes_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *TxSerializer_SerializeToSdkTx_Call) RunAndReturn(run func(*types.Transaction) (cosmos_sdktypes.Tx, error)) *TxSerializer_SerializeToSdkTx_Call { +func (_c *TxSerializer_ToSdkTxBytes_Call) RunAndReturn(run func(*types.Transaction, uint64) ([]byte, error)) *TxSerializer_ToSdkTxBytes_Call { _c.Call.Return(run) return _c } diff --git a/cosmos/types/config.go b/cosmos/types/config.go index fd304d2eb9..e478bd7628 100644 --- a/cosmos/types/config.go +++ b/cosmos/types/config.go @@ -28,25 +28,6 @@ import ( "pkg.berachain.dev/polaris/eth/accounts" ) -const ( - // Bech32Prefix defines the Bech32 prefix used for EthAccounts. - Bech32Prefix = "polar" - // Bech32PrefixAccAddr defines the Bech32 prefix of an account's address. - Bech32PrefixAccAddr = Bech32Prefix - // Bech32PrefixAccPub defines the Bech32 prefix of an account's public key. - Bech32PrefixAccPub = Bech32Prefix + sdk.PrefixPublic - // Bech32PrefixValAddr defines the Bech32 prefix of a validator's operator address. - Bech32PrefixValAddr = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixOperator - // Bech32PrefixValPub defines the Bech32 prefix of a validator's operator public key. - Bech32PrefixValPub = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixOperator + - sdk.PrefixPublic - // Bech32PrefixConsAddr defines the Bech32 prefix of a consensus node address. - Bech32PrefixConsAddr = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixConsensus - // Bech32PrefixConsPub defines the Bech32 prefix of a consensus node public key. - Bech32PrefixConsPub = Bech32Prefix + sdk.PrefixValidator + sdk.PrefixConsensus + - sdk.PrefixPublic -) - var initConfig sync.Once // SetupCosmosConfig sets up the Cosmos SDK configuration to be compatible with the @@ -55,20 +36,11 @@ func SetupCosmosConfig() { initConfig.Do(func() { // set the address prefixes config := sdk.GetConfig() - SetBech32Prefixes(config) SetBip44CoinType(config) config.Seal() }) } -// SetBech32Prefixes sets the global prefixes to be used when serializing addresses and -// public keys to Bech32 strings. -func SetBech32Prefixes(config *sdk.Config) { - config.SetBech32PrefixForAccount(Bech32PrefixAccAddr, Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(Bech32PrefixValAddr, Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(Bech32PrefixConsAddr, Bech32PrefixConsPub) -} - // SetBip44CoinType sets the global coin type to be used in hierarchical deterministic wallets. func SetBip44CoinType(config *sdk.Config) { config.SetCoinType(accounts.Bip44CoinType) diff --git a/cosmos/types/config_test.go b/cosmos/types/config_test.go index 8fa35fa819..9f548eae1e 100644 --- a/cosmos/types/config_test.go +++ b/cosmos/types/config_test.go @@ -49,15 +49,6 @@ var _ = Describe("Configuration", func() { Expect(config.GetBech32ConsensusAddrPrefix()).To(Equal(sdk.Bech32PrefixConsAddr)) Expect(config.GetBech32ConsensusPubPrefix()).To(Equal(sdk.Bech32PrefixConsPub)) - sgconfig.SetBech32Prefixes(config) - - Expect(config.GetBech32AccountAddrPrefix()).To(Equal(sgconfig.Bech32PrefixAccAddr)) - Expect(config.GetBech32AccountPubPrefix()).To(Equal(sgconfig.Bech32PrefixAccPub)) - Expect(config.GetBech32ValidatorAddrPrefix()).To(Equal(sgconfig.Bech32PrefixValAddr)) - Expect(config.GetBech32ValidatorPubPrefix()).To(Equal(sgconfig.Bech32PrefixValPub)) - Expect(config.GetBech32ConsensusAddrPrefix()).To(Equal(sgconfig.Bech32PrefixConsAddr)) - Expect(config.GetBech32ConsensusPubPrefix()).To(Equal(sgconfig.Bech32PrefixConsPub)) - Expect(config.GetBech32AccountAddrPrefix()). To(Equal(sdk.GetConfig().GetBech32AccountAddrPrefix())) Expect(config.GetBech32AccountPubPrefix()). diff --git a/cosmos/x/evm/ante/ante.go b/cosmos/x/evm/ante/ante.go deleted file mode 100644 index e20a509566..0000000000 --- a/cosmos/x/evm/ante/ante.go +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package ante - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - - antelib "pkg.berachain.dev/polaris/cosmos/lib/ante" - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/lib/errors" -) - -// NewAnteHandler returns an AnteHandler that checks and increments sequence -// numbers, checks signatures & account numbers, and deducts fees from the first -// signer. -func NewAnteHandler(options ante.HandlerOptions) (sdk.AnteHandler, error) { - if options.AccountKeeper == nil { - return nil, errors.Wrap(sdkerrors.ErrLogic, "account keeper is required for ante builder") - } - - if options.BankKeeper == nil { - return nil, errors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for ante builder") - } - - if options.SignModeHandler == nil { - return nil, errors.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") - } - - anteDecorators := []sdk.AnteDecorator{ - ante.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first - ante.NewExtensionOptionsDecorator(options.ExtensionOptionChecker), - ante.NewValidateBasicDecorator(), - ante.NewTxTimeoutHeightDecorator(), - ante.NewValidateMemoDecorator(options.AccountKeeper), - // EthTransactions can skip consuming transaction gas as it will be done - // in the StateTransition. - antelib.NewIgnoreDecorator[ante.ConsumeTxSizeGasDecorator, *types.WrappedEthereumTransaction]( - ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - ), - // EthTransaction can skip deduct fee transactions as they are done in the - // StateTransition. // TODO: check to make sure this doesn't cause spam. - antelib.NewIgnoreDecorator[ante.DeductFeeDecorator, *types.WrappedEthereumTransaction]( - ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, - options.FeegrantKeeper, options.TxFeeChecker), - ), - ante.NewSetPubKeyDecorator(options.AccountKeeper), - ante.NewValidateSigCountDecorator(options.AccountKeeper), - // In order to match ethereum gas consumption, we do not consume any gas when - // verifying the signature. - antelib.NewIgnoreDecorator[ante.SigGasConsumeDecorator, *types.WrappedEthereumTransaction]( - ante.NewSigGasConsumeDecorator(options.AccountKeeper, options.SigGasConsumer), - ), - // EthTransaction can skip Signature Verification as we do this in the mempool. - // TODO: // check with Marko to make sure this is okay (ties into the one below) - antelib.NewIgnoreDecorator[ante.SigVerificationDecorator, *types.WrappedEthereumTransaction]( - ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), - ), - // EthTransactions are allowed to skip sequence verification as we do this in the - // state transition. - // NOTE: we may need to change this as it could cause issues if a client is intertwining - // Ethreum and Cosmos transactions within a close timeframe. - // By skipping this for Eth Transactions, the Account Seq of the sender does not get updated - // in checkState during checkTx, but only in DeliverTx, since we are upping in nonce during the - // actual execution of the block and not during the ante handler. - // TODO: // check with Marko to make sure this is okay. - antelib.NewIgnoreDecorator[ante.IncrementSequenceDecorator, *types.WrappedEthereumTransaction]( - ante.NewIncrementSequenceDecorator(options.AccountKeeper), - ), - } - return sdk.ChainAnteDecorators(anteDecorators...), nil -} diff --git a/cosmos/x/evm/ante/sigverify.go b/cosmos/x/evm/ante/sigverify.go deleted file mode 100644 index 4267818a24..0000000000 --- a/cosmos/x/evm/ante/sigverify.go +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package ante - -import ( - "fmt" - - storetypes "cosmossdk.io/store/types" - - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - - "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" -) - -const ( - // secp256k1GasCostEIP155 is the cost of a secp256k1 signature verification - // with the `EIP155` replay protection. - secp256k1GasCostEIP155 = 21000 -) - -// SigVerificationGasConsumer is a custom gas consumer for Cosmos-SDK chains that -// use Ethereum secp256k1 signatures. -func SigVerificationGasConsumer( - meter storetypes.GasMeter, sig signing.SignatureV2, params authtypes.Params, -) error { - // Then check to see if the pubkey is a secp256k1 pubkey - switch pubkey := sig.PubKey.(type) { - case *secp256k1.PubKey: - meter.ConsumeGas(secp256k1GasCostEIP155, "ante verify: secp256k1") - return nil - case *ethsecp256k1.PubKey: - meter.ConsumeGas(secp256k1GasCostEIP155, "ante verify: secp256k1") - return nil - default: - // If we are using any other key type, we will use the default gas consumer. - if err := ante.DefaultSigVerificationGasConsumer(meter, sig, params); err == nil { - return fmt.Errorf("unsupported pubkey type: %T", pubkey) - } - } - return nil -} diff --git a/cosmos/x/evm/genesis.go b/cosmos/x/evm/genesis.go index 3e13c6406c..2ac0db955d 100644 --- a/cosmos/x/evm/genesis.go +++ b/cosmos/x/evm/genesis.go @@ -54,18 +54,7 @@ func (AppModuleBasic) ValidateGenesis( return err } - // TODO: this code actually needs to be removed as it will cause issues. - // for address, account := range ethGen.Alloc { - // if ethGen.Config.IsEIP155(big.NewInt(0)) && account.Code != nil && - // account.Nonce == 0 { - // // NOTE: EIP 161 was released at the same block as EIP 155. - // return fmt.Errorf( - // "EIP-161 requires an account with code (%s) to have nonce of at - // least 1, given (0)", - // address.Hex(), - // ) - // } - // } + // TODO: figure out what in geth we need to call in order to validate the genesis. return nil } diff --git a/cosmos/x/evm/keeper/msg_server.go b/cosmos/x/evm/keeper/msg_server.go index 8a471d753d..c4741db300 100644 --- a/cosmos/x/evm/keeper/msg_server.go +++ b/cosmos/x/evm/keeper/msg_server.go @@ -37,7 +37,7 @@ func (k *Keeper) EthTransaction( ctx context.Context, msg *types.WrappedEthereumTransaction, ) (*types.WrappedEthereumTransactionResult, error) { // Process the transaction and return the result. - receipt, err := k.ProcessTransaction(ctx, msg.AsTransaction()) + receipt, err := k.ProcessTransaction(ctx, msg.Unwrap()) if err != nil { return &types.WrappedEthereumTransactionResult{ Status: types.Status_STATUS_NOT_INCLUDED, diff --git a/cosmos/x/evm/types/tx.go b/cosmos/x/evm/types/tx.go index c2518ed307..1691dfef73 100644 --- a/cosmos/x/evm/types/tx.go +++ b/cosmos/x/evm/types/tx.go @@ -21,174 +21,33 @@ package types import ( - "errors" - "sync" - - "google.golang.org/protobuf/proto" - - "cosmossdk.io/x/tx/signing" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/txpool" - - v1alpha1evm "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" - "pkg.berachain.dev/polaris/eth/common" coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/lib/utils" ) // WrappedEthereumTransaction defines a Cosmos SDK message for Ethereum transactions. var _ sdk.Msg = (*WrappedEthereumTransaction)(nil) -// NewFromTransaction sets the transaction data from an `coretypes.Transaction`. -func NewFromTransaction(tx *coretypes.Transaction) *WrappedEthereumTransaction { +// WrapTx sets the transaction data from an `coretypes.Transaction`. +func WrapTx(tx *coretypes.Transaction) (*WrappedEthereumTransaction, error) { bz, err := tx.MarshalBinary() if err != nil { - panic(err) + return nil, fmt.Errorf("failed to wrap transaction: %w", err) } return &WrappedEthereumTransaction{ Data: bz, - } -} - -// GetSigners returns the address(es) that must sign over the transaction. -func (etr *WrappedEthereumTransaction) GetSigners() []sdk.AccAddress { - sender, err := etr.GetSender() - if err != nil { - return nil - } - return []sdk.AccAddress{sdk.AccAddress(sender.Bytes())} + }, nil } -// AsTransaction extracts the transaction as an `coretypes.Transaction`. -func (etr *WrappedEthereumTransaction) AsTransaction() *coretypes.Transaction { +// Unwrap extracts the transaction as an `coretypes.Transaction`. +func (etr *WrappedEthereumTransaction) Unwrap() *coretypes.Transaction { tx := new(coretypes.Transaction) if err := tx.UnmarshalBinary(etr.Data); err != nil { return nil } return tx } - -// GetSignBytes returns the bytes to sign over for the transaction. -func (etr *WrappedEthereumTransaction) GetSignBytes() ([]byte, error) { - tx := etr.AsTransaction() - return coretypes.LatestSignerForChainID(tx.ChainId()). - Hash(tx).Bytes(), nil -} - -// GetSender extracts the sender address from the signature values using the -// latest signer for the given chainID. -func (etr *WrappedEthereumTransaction) GetSender() (common.Address, error) { - tx := etr.AsTransaction() - signer := coretypes.LatestSignerForChainID(tx.ChainId()) - return signer.Sender(tx) -} - -// GetSender extracts the sender address from the signature values using the -// latest signer for the given chainID. -func (etr *WrappedEthereumTransaction) GetPubKey() ([]byte, error) { - tx := etr.AsTransaction() - signer := coretypes.LatestSignerForChainID(tx.ChainId()) - return signer.PubKey(tx) -} - -// GetSender extracts the sender address from the signature values using the -// latest signer for the given chainID. -func (etr *WrappedEthereumTransaction) GetSignature() ([]byte, error) { - tx := etr.AsTransaction() - signer := coretypes.LatestSignerForChainID(tx.ChainId()) - return signer.Signature(tx) -} - -// GetGas returns the gas limit of the transaction. -func (etr *WrappedEthereumTransaction) GetGas() uint64 { - var tx *coretypes.Transaction - if tx = etr.AsTransaction(); tx == nil { - return 0 - } - return tx.Gas() -} - -// GetGasPrice returns the gas price of the transaction. -func (etr *WrappedEthereumTransaction) ValidateBasic() error { - // Ensure the transaction is signed properly - tx := etr.AsTransaction() - if tx == nil { - return errors.New("transaction data is invalid") - } - - // Ensure the transaction does not have a negative value. - if tx.Value().Sign() < 0 { - return txpool.ErrNegativeValue - } - - // Sanity check for extremely large numbers. - if tx.GasFeeCap().BitLen() > 256 { //nolint:gomnd // 256 bits. - return core.ErrFeeCapVeryHigh - } - - // Sanity check for extremely large numbers. - if tx.GasTipCap().BitLen() > 256 { //nolint:gomnd // 256 bits. - return core.ErrTipVeryHigh - } - - // Ensure gasFeeCap is greater than or equal to gasTipCap. - if tx.GasFeeCapIntCmp(tx.GasTipCap()) < 0 { - return core.ErrTipAboveFeeCap - } - - return nil -} - -// GetAsEthTx is a helper function to get an EthTx from a sdk.Tx. -func GetAsEthTx(tx sdk.Tx) *coretypes.Transaction { - if len(tx.GetMsgs()) == 0 { - return nil - } - etr, ok := utils.GetAs[*WrappedEthereumTransaction](tx.GetMsgs()[0]) - if !ok { - return nil - } - return etr.AsTransaction() -} - -// ProvideEthereumTransactionGetSigners defines a custom function for -// utilizing custom signer handling for `WrappedEthereumTransaction`s. -func ProvideEthereumTransactionGetSigners() signing.CustomGetSigner { - // Utilize a sync pool to reduce memory usage. - txSyncPool := sync.Pool{ - New: func() any { return new(coretypes.Transaction) }, - } - - // The actual function. - return signing.CustomGetSigner{ - MsgType: proto.MessageName(&v1alpha1evm.WrappedEthereumTransaction{}), - Fn: func(msg proto.Message) ([][]byte, error) { - // Pull the raw ethereum bytes from pulsar. - ethTxData := msg.(*v1alpha1evm.WrappedEthereumTransaction).Data - - // Get a new empty Transaction. - ethTx, ok := txSyncPool.Get().(*coretypes.Transaction) - if !ok { - return nil, errors.New("failed to get sync pool when getting signers") - } - - // Fill it with the data. - if err := ethTx.UnmarshalBinary(ethTxData); err != nil { - return nil, err - } - - // Extract the signer from the signature. - signer, err := coretypes.LatestSignerForChainID(ethTx.ChainId()).Sender(ethTx) - if err != nil { - return nil, err - } - - // Return the signer in the required format. - return [][]byte{signer.Bytes()}, nil - }, - } -} diff --git a/cosmos/x/evm/types/tx_serializer.go b/cosmos/x/evm/types/tx_serializer.go deleted file mode 100644 index 19bf3a5a98..0000000000 --- a/cosmos/x/evm/types/tx_serializer.go +++ /dev/null @@ -1,121 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package types - -import ( - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" - - "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" - coretypes "pkg.berachain.dev/polaris/eth/core/types" -) - -// TxSerializer provides an interface to serialize ethereum transactions -// to sdk.Tx's and bytes that can be used by CometBFT. -type TxSerializer interface { - SerializeToSdkTx(signedTx *coretypes.Transaction) (sdk.Tx, error) - SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) -} - -// serializer implements TxSerializer. -type serializer struct { - txConfig client.TxConfig -} - -// NewSerializer returns a new instance of TxSerializer. -func NewSerializer(txConfig client.TxConfig) TxSerializer { - return &serializer{ - txConfig: txConfig, - } -} - -// SerializeToSdkTx converts an ethereum transaction to a Cosmos native transaction. -func (s *serializer) SerializeToSdkTx(signedTx *coretypes.Transaction) (sdk.Tx, error) { - // TODO: do we really need to use extensions for anything? Since we - // are using the standard ante handler stuff I don't think we actually need to. - tx := s.txConfig.NewTxBuilder() - - // We can also retrievepothe gaslimit for the transaction from the ethereum transaction. - tx.SetGasLimit(signedTx.Gas()) - - // Thirdly, we set the nonce equal to the nonce of the transaction and also derive the PubKey - // from the V,R,S values of the transaction. This allows us for a little trick to allow - // ethereum transactions to work in the standard cosmos app-side mempool with no modifications. - // Some gigabrain shit tbh. - pkBz, err := coretypes.PubkeyFromTx( - signedTx, coretypes.LatestSignerForChainID(signedTx.ChainId()), - ) - if err != nil { - return nil, err - } - - // Create the WrappedEthereumTransaction message. - wrappedEthTx := NewFromTransaction(signedTx) - sig, err := wrappedEthTx.GetSignature() - if err != nil { - return nil, err - } - - // Lastly, we set the signature. We can pull the sequence from the nonce of the ethereum tx. - if err = tx.SetSignatures( - signingtypes.SignatureV2{ - Sequence: signedTx.Nonce(), - Data: &signingtypes.SingleSignatureData{ - // We retrieve the hash of the signed transaction from the ethereum transaction - // objects, as this was the bytes that were signed. We pass these into the - // SingleSignatureData as the SignModeHandler needs to know what data was signed - // over so that it can verify the signature in the ante handler. - Signature: sig, - }, - PubKey: ðsecp256k1.PubKey{Key: pkBz}, - }, - ); err != nil { - return nil, err - } - - // Lastly, we inject the signed ethereum transaction as a message into the Cosmos Tx. - if err = tx.SetMsgs(wrappedEthTx); err != nil { - return nil, err - } - - // Finally, we return the Cosmos Tx. - return tx.GetTx(), nil -} - -// SerializeToBytes converts an Ethereum transaction to Cosmos formatted txBytes which allows for -// it to broadcast it to CometBFT. -func (s *serializer) SerializeToBytes(signedTx *coretypes.Transaction) ([]byte, error) { - // First, we convert the Ethereum transaction to a Cosmos transaction. - cosmosTx, err := s.SerializeToSdkTx(signedTx) - if err != nil { - return nil, err - } - - // Then we use the clientCtx.TxConfig.TxEncoder() to encode the Cosmos transaction into bytes. - txBytes, err := s.txConfig.TxEncoder()(cosmosTx) - if err != nil { - return nil, err - } - - // Finally, we return the txBytes. - return txBytes, nil -} diff --git a/cosmos/x/evm/types/tx_test.go b/cosmos/x/evm/types/tx_test.go deleted file mode 100644 index 13a287aa24..0000000000 --- a/cosmos/x/evm/types/tx_test.go +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package types_test - -import ( - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/eth/params" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("WrappedEthereumTransaction", func() { - var ( - key, _ = crypto.GenerateEthKey() - address = crypto.PubkeyToAddress(key.PublicKey) - signer = coretypes.LatestSignerForChainID(params.DefaultChainConfig.ChainID) - ) - When("it is a legacy tx", func() { - var etr *types.WrappedEthereumTransaction - BeforeEach(func() { - - ltxData := &coretypes.LegacyTx{ - Nonce: 0, - GasPrice: big.NewInt(2), - Data: []byte("abcdef"), - To: nil, - Value: new(big.Int), - } - tx, err := coretypes.SignNewTx(key, signer, ltxData) - Expect(err).ToNot(HaveOccurred()) - etr = types.NewFromTransaction(tx) - }) - - It("should return the correct signer", func() { - Expect(etr.GetSender()).To(Equal(address)) - Expect(etr.GetSigners()).To(Equal([]sdk.AccAddress{address.Bytes()})) - _, err := etr.GetSignature() - Expect(err).ToNot(HaveOccurred()) - }) - }) - - When("it is a dynamic fee tx", func() { - var etr *types.WrappedEthereumTransaction - BeforeEach(func() { - dtxData := &coretypes.DynamicFeeTx{ - ChainID: params.DefaultChainConfig.ChainID, - Nonce: 0, - Gas: 10, - GasTipCap: new(big.Int), - GasFeeCap: new(big.Int), - To: nil, - Value: new(big.Int), - Data: nil, - } - etr = types.NewFromTransaction(coretypes.MustSignNewTx(key, signer, dtxData)) - }) - - It("should return the correct signer", func() { - Expect(etr.GetSender()).To(Equal(address)) - Expect(etr.GetSigners()).To(Equal([]sdk.AccAddress{address.Bytes()})) - _, err := etr.GetSignature() - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/e2e/hive/clients/README.md b/e2e/hive/clients/README.md new file mode 100644 index 0000000000..e710972aab --- /dev/null +++ b/e2e/hive/clients/README.md @@ -0,0 +1,7 @@ +# Hive Clients + +An Ethereum Hive client refers to the use of the Hive testing framework in the context of Ethereum. Hive is a system for running integration tests or simulations to test client logic and behavior under specific conditions. It is designed to validate that Ethereum clients conform to baseline quality and can interact properly in a multi-client environment. + +## Clients + +Currently we only have a single client `polard`. \ No newline at end of file diff --git a/e2e/hive/clients/polard/Dockerfile b/e2e/hive/clients/polard/Dockerfile index edfc95e707..a275b1b669 100644 --- a/e2e/hive/clients/polard/Dockerfile +++ b/e2e/hive/clients/polard/Dockerfile @@ -23,7 +23,8 @@ WORKDIR / # Add a default genesis file + Inject the startup script ADD version.txt /version.txt ADD hive-init.sh /hive-init.sh -ADD config /config + +ADD config/config.toml config/config.toml RUN export HIVE_CHAIN_ID=2061 RUN export HIVE_NETWORK_ID=2061 diff --git a/e2e/hive/clients/polard/config/app.toml b/e2e/hive/clients/polard/config/app.toml deleted file mode 100644 index cc91de3f25..0000000000 --- a/e2e/hive/clients/polard/config/app.toml +++ /dev/null @@ -1,515 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -############################################################################### -### Base Configuration ### -############################################################################### - -# The minimum gas prices a validator is willing to accept for processing a -# transaction. A transaction's fees must meet the minimum of any denomination -# specified in this config (e.g. 0.25token1;0.0001token2). -minimum-gas-prices = "0stake" - -# The maximum gas a query coming over rest/grpc may consume. -# If this is set to zero, the query can consume an unbounded amount of gas. -query-gas-limit = "0" - -# default: the last 362880 states are kept, pruning at 10 block intervals -# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) -# everything: 2 latest states will be kept; pruning at 10 block intervals. -# custom: allow pruning options to be manually specified through 'pruning-keep-recent', and 'pruning-interval' -pruning = "default" - -# These are applied if and only if the pruning strategy is custom. -pruning-keep-recent = "0" -pruning-interval = "0" - -# HaltHeight contains a non-zero block height at which a node will gracefully -# halt and shutdown that can be used to assist upgrades and testing. -# -# Note: Commitment of state will be attempted on the corresponding block. -halt-height = 0 - -# HaltTime contains a non-zero minimum block time (in Unix seconds) at which -# a node will gracefully halt and shutdown that can be used to assist upgrades -# and testing. -# -# Note: Commitment of state will be attempted on the corresponding block. -halt-time = 0 - -# MinRetainBlocks defines the minimum block height offset from the current -# block being committed, such that all blocks past this offset are pruned -# from CometBFT. It is used as part of the process of determining the -# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates -# that no blocks should be pruned. -# -# This configuration value is only responsible for pruning CometBFT blocks. -# It has no bearing on application state pruning which is determined by the -# "pruning-*" configurations. -# -# Note: CometBFT block pruning is dependant on this parameter in conjunction -# with the unbonding (safety threshold) period, state pruning and state sync -# snapshot parameters to determine the correct minimum value of -# ResponseCommit.RetainHeight. -min-retain-blocks = 0 - -# InterBlockCache enables inter-block caching. -inter-block-cache = true - -# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, -# which informs CometBFT what to index. If empty, all events will be indexed. -# -# Example: -# ["message.sender", "message.recipient"] -index-events = [] - -# IavlCacheSize set the size of the iavl tree cache (in number of nodes). -iavl-cache-size = 10000 - -# IAVLDisableFastNode enables or disables the fast node feature of IAVL. -# Default is false. -iavl-disable-fastnode = false - -# AppDBBackend defines the database backend type to use for the application and snapshots DBs. -# An empty string indicates that a fallback will be used. -# The fallback is the db_backend value set in CometBFT's config.toml. -app-db-backend = "" - -############################################################################### -### Telemetry Configuration ### -############################################################################### - -[telemetry] - -# Prefixed with keys to separate services. -service-name = "" - -# Enabled enables the application telemetry functionality. When enabled, -# an in-memory sink is also enabled by default. Operators may also enabled -# other sinks such as Prometheus. -enabled = false - -# Enable prefixing gauge values with hostname. -enable-hostname = false - -# Enable adding hostname to labels. -enable-hostname-label = false - -# Enable adding service to labels. -enable-service-label = false - -# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. -prometheus-retention-time = 0 - -# GlobalLabels defines a global set of name/value label tuples applied to all -# metrics emitted using the wrapper functions defined in telemetry package. -# -# Example: -# [["chain_id", "cosmoshub-1"]] -global-labels = [] - -############################################################################### -### API Configuration ### -############################################################################### - -[api] - -# Enable defines if the API server should be enabled. -enable = false - -# Swagger defines if swagger documentation should automatically be registered. -swagger = false - -# Address defines the API server to listen on. -address = "tcp://localhost:1317" - -# MaxOpenConnections defines the number of maximum open connections. -max-open-connections = 1000 - -# RPCReadTimeout defines the CometBFT RPC read timeout (in seconds). -rpc-read-timeout = 10 - -# RPCWriteTimeout defines the CometBFT RPC write timeout (in seconds). -rpc-write-timeout = 0 - -# RPCMaxBodyBytes defines the CometBFT maximum request body (in bytes). -rpc-max-body-bytes = 1000000 - -# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). -enabled-unsafe-cors = false - -############################################################################### -### gRPC Configuration ### -############################################################################### - -[grpc] - -# Enable defines if the gRPC server should be enabled. -enable = true - -# Address defines the gRPC server address to bind to. -address = "localhost:9090" - -# MaxRecvMsgSize defines the max message size in bytes the server can receive. -# The default value is 10MB. -max-recv-msg-size = "10485760" - -# MaxSendMsgSize defines the max message size in bytes the server can send. -# The default value is math.MaxInt32. -max-send-msg-size = "2147483647" - -############################################################################### -### gRPC Web Configuration ### -############################################################################### - -[grpc-web] - -# GRPCWebEnable defines if the gRPC-web should be enabled. -# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. -# NOTE: gRPC-Web uses the same address as the API server. -enable = true - -############################################################################### -### State Sync Configuration ### -############################################################################### - -# State sync snapshots allow other nodes to rapidly join the network without replaying historical -# blocks, instead downloading and applying a snapshot of the application state at a given height. -[state-sync] - -# snapshot-interval specifies the block interval at which local state sync snapshots are -# taken (0 to disable). -snapshot-interval = 0 - -# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). -snapshot-keep-recent = 2 - -############################################################################### -### State Streaming ### -############################################################################### - -# Streaming allows nodes to stream state to external systems. -[streaming] - -# streaming.abci specifies the configuration for the ABCI Listener streaming service. -[streaming.abci] - -# List of kv store keys to stream out via gRPC. -# The store key names MUST match the module's StoreKey name. -# -# Example: -# ["acc", "bank", "gov", "staking", "mint"[,...]] -# ["*"] to expose all keys. -keys = [] - -# The plugin name used for streaming via gRPC. -# Streaming is only enabled if this is set. -# Supported plugins: abci -plugin = "" - -# stop-node-on-err specifies whether to stop the node on message delivery error. -stop-node-on-err = true - -############################################################################### -### Mempool ### -############################################################################### - -[mempool] -# Setting max-txs to 0 will allow for a unbounded amount of transactions in the mempool. -# Setting max_txs to negative 1 (-1) will disable transactions from being inserted into the mempool. -# Setting max_txs to a positive number (> 0) will limit the number of transactions in the mempool, by the specified amount. -# -# Note, this configuration only applies to SDK built-in app-side mempool -# implementations. -max-txs = 5000 - -############################################################################### -### Polaris ### -############################################################################### -# General Polaris settings -[polaris] - -[polaris.polar] -# Gas cap for RPC requests -rpc-gas-cap = "50000000" - -# Timeout setting for EVM operations via RPC -rpc-evm-timeout = "5s" - -# Transaction fee cap for RPC requests -rpc-tx-fee-cap = "1" - - -# Chain config -[polaris.polar.chain] -chain-id = "2061" - -# Homestead switch block -homestead-block = "0" - -# DAO fork switch block -dao-fork-block = "0" - -# Whether to support DAO fork -dao-fork-support = true - -# EIP150 switch block -eip150-block = "0" - -# EIP155 switch block -eip155-block = "0" - -# EIP158 switch block -eip158-block = "0" - -# Byzanitum switch block -byzantium-block = "0" - -# Constantinople switch block -constantinople-block = "0" - -# Petersburg switch block -petersburg-block = "0" - -# Istanbul switch block -istanbul-block = "0" - -# Muir Glacier switch block -muir-glacier-block = "0" - -# Berlin switch block -berlin-block = "0" - -# London switch block -london-block = "0" - -# Arrow Glacier switch block -arrow-glacier-block = "0" - -# Gray Glacier switch block -gray-glacier-block = "0" - -# Merge Netsplit switch block -merge-netsplit-block = "0" - -# Shanghai switch time (nil == no fork, 0 = already on shanghai) -shanghai-time = "0" - -# Cancun switch time (nil == no fork, 0 = already on cancun) -cancun-time = "" - -# Prague switch time (nil == no fork, 0 = already on prague) -prague-time = "" - -# Verkle switch time (nil == no fork, 0 = already on verkle) -verkle-time = "" - -# Terminal total difficulty -terminal-total-difficulty = "0" - -# Whether terminal total difficulty has passed -terminal-total-difficulty-passed = "true" - -# DevMode enabled -is-dev-mode = false - - -# Miner config -[polaris.polar.miner] -# The address to which mining rewards will be sent -etherbase = "0x0000000000000000000000000000000000000000" - -# Extra data included in mined blocks -extra-data = "0x" - -# Gas price for transactions included in blocks -gas-price = "1000000000" - -# Minimum gas limit for transactions included in blocks -gas-floor = "0" - -# Maximum gas limit for transactions included in blocks -gas-ceil = "30000000" - -# Whether to enable recommit feature -recommit = "2s" - -# Timeout for creating a new payload -new-payload-timeout = "2s" - - -# Gas price oracle settings for Polaris -[polaris.polar.gpo] -# Number of blocks to check for gas prices -blocks = "20" - -# Percentile of gas price to use -percentile = "60" - -# Maximum header history for gas price determination -max-header-history = "1024" - -# Maximum block history for gas price determination -max-block-history = "1024" - -# Default gas price value -default = "1000000000" - -# Maximum gas price value -max-price = "500000000000" - -# Prices to ignore for gas price determination -ignore-price = "2" - -# LegacyTxPool settings -[polaris.polar.legacy-tx-pool] - -# Addresses that should be treated by default as local -locals = [] - -# Whether local transaction handling should be disabled -no-locals = false - -# Journal of local transactions to survive node restarts -journal = "transactions.rlp" - -# Time interval to regenerate the local transaction journal -rejournal = "1h0m0s" - -# Minimum gas price to enforce for acceptance into the pool -price-limit = "1" - -# Minimum price bump percentage to replace an already existing transaction (nonce) -price-bump = "10" - -# Number of executable transaction slots guaranteed per account -account-slots = "16" - -# Maximum number of executable transaction slots for all accounts -account-queue = "64" - -# Maximum number of non-executable transaction slots permitted per account -global-slots = "5120" - -# Maximum number of non-executable transaction slots for all accounts -global-queue = "1024" - -# Maximum amount of time non-executable transaction are queued -lifetime = "3h0m0s" - - -# Node-specific settings -[polaris.node] -# Name of the node -name = "polaris-geth" - -# User identity associated with the node -user-ident = "" - -# Version of the node -version = "" - -# Directory for storing node data -data-dir = "" - -# Directory for storing node keys -key-store-dir = "" - -# Path to the external signer -external-signer = "" - -# Whether to use lightweight KDF -use-lightweight-kdf = false - -# Allow insecure unlock -insecure-unlock-allowed = false - -# USB setting for the node -usb = false - -# Path to smart card daemon -smart-card-daemon-path = "" - -# IPC path for the node -ipc-path = "" - -# Host for HTTP requests -http-host = "0.0.0.0" - -# Port for HTTP requests -http-port = 8545 - -# CORS settings for HTTP -http-cors = ["*"] - -# Virtual hosts for HTTP -http-virtual-hosts = ["*"] - -# Enabled modules for HTTP -http-modules = ["net", "web3", "eth", "web3", "net", "txpool", "debug"] - -# Path prefix for HTTP -http-path-prefix = "" - -# Address for authentication -auth-addr = "localhost" - -# Port for authentication -auth-port = 8551 - -# Virtual hosts for authentication -auth-virtual-hosts = ["localhost"] - -# Host for WebSockets -ws-host = "0.0.0.0" - -# Port for WebSockets -ws-port = 8546 - -# Path prefix for WebSockets -ws-path-prefix = "" - -# Origins allowed for WebSockets -ws-origins = ["*"] - -# Enabled modules for WebSockets -ws-modules = ["net", "web3", "eth"] - -# Expose all settings for WebSockets -ws-expose-all = false - -# CORS settings for GraphQL -graphql-cors = [] - -# Virtual hosts for GraphQL -graphql-virtual-hosts = ["localhost"] - -# Allow unprotected transactions -allow-unprotected-txs = false - -# Limit for batch requests -batch-request-limit = 1000 - -# Maximum size for batch responses -batch-response-max-size = 25000000 - -# JWT secret for authentication -jwt-secret = "" - -# Database engine for the node -db-engine = "" - - -# HTTP timeout settings for the node -[polaris.node.http-timeouts] -# Timeout for reading HTTP requests -read-timeout = "30s" - -# Timeout for reading HTTP request headers -read-header-timeout = "30s" - -# Timeout for writing HTTP responses -write-timeout = "30s" - -# Timeout for idle HTTP connections -idle-timeout = "2m0s" diff --git a/e2e/hive/clients/polard/config/genesis.json b/e2e/hive/clients/polard/config/genesis.json deleted file mode 100644 index 5cab532775..0000000000 --- a/e2e/hive/clients/polard/config/genesis.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "app_name": "polaris-cosmos", - "app_version": "v0.0.0", - "genesis_time": "2023-05-30T23:14:44.991554Z", - "chain_id": "polaris-2061", - "initial_height": 1, - "app_hash": null, - "app_state": { - "auth": { - "params": { - "max_memo_characters": "256", - "tx_sig_limit": "7", - "tx_size_cost_per_byte": "10", - "sig_verify_cost_ed25519": "590", - "sig_verify_cost_secp256k1": "1000" - }, - "accounts": [ - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1qk36tw89pgf5f8jhxf4hcug3q20u35x2p4jmm5", - "pub_key": null, - "account_number": "0", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1l4qr3q3535su2ggy7kh2j04a35wd8vyshtuafh", - "pub_key": null, - "account_number": "1", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar16z3wul8jkjksw60kr2gumsv7hk9l5ck5597nwa", - "pub_key": null, - "account_number": "2", - "sequence": "0" - } - ] - }, - "bank": { - "params": { - "send_enabled": [], - "default_send_enabled": true - }, - "balances": [ - { - "address": "polar1qk36tw89pgf5f8jhxf4hcug3q20u35x2p4jmm5", - "coins": [ - { - "denom": "abera", - "amount": "100000000000000000000000000" - }, - { - "denom": "abgt", - "amount": "100000000000000000000000000" - } - ] - }, - { - "address": "polar16z3wul8jkjksw60kr2gumsv7hk9l5ck5597nwa", - "coins": [ - { - "denom": "abera", - "amount": "100000000000000000000000000" - }, - { - "denom": "abgt", - "amount": "100000000000000000000000000" - } - ] - }, - { - "address": "polar1l4qr3q3535su2ggy7kh2j04a35wd8vyshtuafh", - "coins": [ - { - "denom": "abera", - "amount": "100000000000000000000000000" - }, - { - "denom": "abgt", - "amount": "100000000000000000000000000" - } - ] - } - ], - "supply": [ - { - "denom": "abera", - "amount": "300000000000000000000000000" - }, - { - "denom": "abgt", - "amount": "300000000000000000000000000" - } - ], - "denom_metadata": [], - "send_enabled": [] - }, - "consensus": null, - "crisis": { - "constant_fee": { - "denom": "abera", - "amount": "1000" - } - }, - "distribution": { - "params": { - "community_tax": "0.020000000000000000", - "base_proposer_reward": "0.000000000000000000", - "bonus_proposer_reward": "0.000000000000000000", - "withdraw_addr_enabled": true - }, - "fee_pool": { - "community_pool": [] - }, - "delegator_withdraw_infos": [], - "previous_proposer": "", - "outstanding_rewards": [], - "validator_accumulated_commissions": [], - "validator_historical_rewards": [], - "validator_current_rewards": [], - "delegator_starting_infos": [], - "validator_slash_events": [] - }, - "erc20": { - "params": {} - }, - "evidence": { - "evidence": [] - }, - "evm": { - "config": { - "chainId": 2061, - "homesteadBlock": 0, - "daoForkBlock": 0, - "daoForkSupport": true, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "arrowGlacierBlock": 0, - "grayGlacierBlock": 0, - "mergeNetsplitBlock": 0, - "terminalTotalDifficulty": 0, - "terminalTotalDifficultyPassed": true - }, - "nonce": "0x0", - "timestamp": "0x0", - "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", - "gasLimit": "0x1c9c380", - "difficulty": "0x0", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "20f33ce90a13a4b5e7697e3544c3083b8f8a51d4": { - "balance": "0x4563918244f40000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "baseFeePerGas": null - }, - "genutil": { - "gen_txs": [ - { - "body": { - "messages": [ - { - "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", - "description": { - "moniker": "localtestnet", - "identity": "", - "website": "", - "security_contact": "", - "details": "" - }, - "commission": { - "rate": "0.100000000000000000", - "max_rate": "0.200000000000000000", - "max_change_rate": "0.010000000000000000" - }, - "min_self_delegation": "1", - "delegator_address": "", - "validator_address": "polarvaloper1qk36tw89pgf5f8jhxf4hcug3q20u35x2a8zasm", - "pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "/GmlSP30BD2b713XWL2l3O3hMlDKH1FxmBlIP6Ox47E=" - }, - "value": { - "denom": "abera", - "amount": "1000000000000000000000" - } - } - ], - "memo": "5361432688d620acfdc2d425c1430f0c01048b7c@192.168.0.220:26656", - "timeout_height": "0", - "extension_options": [], - "non_critical_extension_options": [] - }, - "auth_info": { - "signer_infos": [ - { - "public_key": { - "@type": "/polaris.crypto.ethsecp256k1.v1.PubKey", - "key": "AwjItkzy4rgPzJypyOxK2YmjNhQJtLfAKQhRgBccZGDW" - }, - "mode_info": { - "single": { - "mode": "SIGN_MODE_DIRECT" - } - }, - "sequence": "0" - } - ], - "fee": { - "amount": [], - "gas_limit": "200000", - "payer": "", - "granter": "" - }, - "tip": null - }, - "signatures": [ - "btJah6+IcP/MrNqy+bjxVNsa28cFTZAXI2ON/c6O13NvF762yw9rzBzhWjLbjW5cWll4rR1IbvSWtElLG/733gA=" - ] - } - ] - }, - "gov": { - "starting_proposal_id": "1", - "deposits": [], - "votes": [], - "proposals": [], - "deposit_params": { - "min_deposit": [ - { - "denom": "abgt", - "amount": "0" - } - ] - }, - "voting_params": null, - "tally_params": null, - "params": { - "min_deposit": [ - { - "denom": "abgt", - "amount": "10000000" - } - ], - "max_deposit_period": "172800s", - "voting_period": "172800s", - "quorum": "0.334000000000000000", - "threshold": "0.500000000000000000", - "veto_threshold": "0.334000000000000000", - "min_initial_deposit_ratio": "0.000000000000000000", - "proposal_cancel_ratio": "0.500000000000000000", - "proposal_cancel_dest": "", - "expedited_voting_period": "86400s", - "expedited_threshold": "0.667000000000000000", - "expedited_min_deposit": [ - { - "denom": "abgt", - "amount": "50000000" - } - ], - "burn_vote_quorum": false, - "burn_proposal_deposit_prevote": false, - "burn_vote_veto": true - }, - "constitution": "" - }, - "group": { - "group_seq": "0", - "groups": [], - "group_members": [], - "group_policy_seq": "0", - "group_policies": [], - "proposal_seq": "0", - "proposals": [], - "votes": [] - }, - "mint": { - "minter": { - "inflation": "0.130000000000000000", - "annual_provisions": "0.000000000000000000" - }, - "params": { - "mint_denom": "abera", - "inflation_rate_change": "0.130000000000000000", - "inflation_max": "0.200000000000000000", - "inflation_min": "0.070000000000000000", - "goal_bonded": "0.670000000000000000", - "blocks_per_year": "6311520" - } - }, - "slashing": { - "params": { - "signed_blocks_window": "100", - "min_signed_per_window": "0.500000000000000000", - "downtime_jail_duration": "600s", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": [], - "missed_blocks": [] - }, - "staking": { - "params": { - "unbonding_time": "1814400s", - "max_validators": 100, - "max_entries": 7, - "historical_entries": 10000, - "bond_denom": "abera", - "min_commission_rate": "0.000000000000000000" - }, - "last_total_power": "0", - "last_validator_powers": [], - "validators": [], - "delegations": [], - "unbonding_delegations": [], - "redelegations": [], - "exported": false - }, - "upgrade": {}, - "vesting": {} - }, - "consensus": { - "params": { - "block": { - "max_bytes": "22020096", - "max_gas": "30000000" - }, - "evidence": { - "max_age_num_blocks": "100000", - "max_age_duration": "172800000000000", - "max_bytes": "1048576" - }, - "validator": { - "pub_key_types": [ - "ed25519" - ] - }, - "version": { - "app": "0" - }, - "abci": { - "vote_extensions_enable_height": "0" - } - } - } -} \ No newline at end of file diff --git a/e2e/hive/clients/polard/hive-init.sh b/e2e/hive/clients/polard/hive-init.sh index 74817995c8..4dc5dcd0d9 100644 --- a/e2e/hive/clients/polard/hive-init.sh +++ b/e2e/hive/clients/polard/hive-init.sh @@ -28,7 +28,7 @@ MONIKER="localtestnet" # otherwise your balance will be wiped quickly # The keyring test does not require private key to steal tokens from you KEYRING="test" -KEYALGO="eth_secp256k1" +KEYALGO="secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./bin/polard instance HOMEDIR="/" @@ -43,7 +43,7 @@ GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json # used to exit on first error (any non-zero exit code) -set +set -e # Reinstall daemon # make build @@ -162,4 +162,4 @@ cat $APP_TOML echo "BINGBONG" # Start the node (remove the --pruning=nothing flag if historical queries are not needed)m -polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" +polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" \ No newline at end of file diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 2608c527eb..d9af6139c2 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -9,193 +9,61 @@ require ( github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a ) require ( - cosmossdk.io/api v0.7.1 // indirect - cosmossdk.io/collections v0.4.0 // indirect - cosmossdk.io/core v0.11.0 // indirect - cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/errors v1.0.0 // indirect - cosmossdk.io/log v1.2.1 // indirect - cosmossdk.io/math v1.1.3-rc.1 // indirect - cosmossdk.io/store v1.0.0-rc.0 // indirect - cosmossdk.io/x/tx v0.10.0 // indirect - filippo.io/edwards25519 v1.0.0 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.2.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cometbft/cometbft v0.38.0 // indirect - github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/containerd/continuity v0.3.0 // indirect - github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-db v1.0.0 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.1 // indirect - github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/gogoproto v1.4.11 // indirect - github.com/cosmos/iavl v1.0.0-rc.1 // indirect - github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect - github.com/danieljoos/wincred v1.2.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect - github.com/emicklei/dot v1.6.0 // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/getsentry/sentry-go v0.23.0 // indirect - github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.0 // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/handlers v1.5.1 // indirect - github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-metrics v0.5.1 // indirect - github.com/hashicorp/go-plugin v1.5.1 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect - github.com/hdevalence/ed25519consensus v0.1.0 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect github.com/holiman/uint256 v1.2.3 // indirect - github.com/huandu/skiplist v1.2.0 // indirect - github.com/iancoleman/strcase v0.3.0 // indirect - github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.8.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect - github.com/oklog/run v1.1.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/opencontainers/runc v1.1.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.9 // indirect - github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.9.0 // indirect - github.com/rs/zerolog v1.30.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.16.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.2 // indirect github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect - github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tidwall/btree v1.7.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect - go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect - google.golang.org/grpc v1.58.1 // indirect - google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.0 // indirect - nhooyr.io/websocket v1.8.6 // indirect - pgregory.net/rapid v1.1.0 // indirect + gotest.tools v2.2.0+incompatible // indirect rsc.io/tmplfunc v0.0.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 232654947e..4d5386876b 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -1,170 +1,30 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= -cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= -cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= -cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= -cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= -cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= -cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= -cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= -cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= -cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= -cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= -cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= -cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= -cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= -cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= -cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= -filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= -github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= -github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= -github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= -github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= -github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= @@ -173,11 +33,6 @@ github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= -github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= -github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= @@ -185,46 +40,13 @@ github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5U github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= -github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= -github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= -github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= -github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= -github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= -github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= -github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= -github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= -github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= -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/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -234,17 +56,6 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5il github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= @@ -254,348 +65,70 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= -github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= -github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -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= github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= -github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= -github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= -github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -607,55 +140,16 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= @@ -666,59 +160,15 @@ github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFV github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= @@ -727,718 +177,150 @@ github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/ github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= -github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= -github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= -golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -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= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -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= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -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= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a h1:QMJRzQpU3/i5WBakrL5V0TE5CcEshC60nw1Ek+bJpJg= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/e2e/localnet/network/fixture.go b/e2e/localnet/network/fixture.go index 77f786a8c3..79512f58d6 100644 --- a/e2e/localnet/network/fixture.go +++ b/e2e/localnet/network/fixture.go @@ -33,12 +33,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" - cosmlib "pkg.berachain.dev/polaris/cosmos/lib" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" - "pkg.berachain.dev/polaris/cosmos/types" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/lib/encoding" ) const ( @@ -198,32 +194,5 @@ func (tf *TestFixture) setupTestAccounts(config *FixtureConfig) error { tf.keysMap[strings.Split(keyFileName, ".")[0]] = privKey } - // read the validator public key from the genesis file - genFile := filepath.Join(config.path, genFilePath) - genBz, err := os.ReadFile(filepath.Clean(genFile)) - if err != nil { - return err - } - - valAddr := encoding.MustUnmarshalJSON[struct { - AppState struct { - GenUtil struct { - GenTxs []struct { - Body struct { - Messages []struct { - ValidatorAddress string `json:"validator_address"` - } `json:"messages"` - } `json:"body"` - } `json:"gen_txs"` - } `json:"genutil"` - } `json:"app_state"` - }](genBz).AppState.GenUtil.GenTxs[0].Body.Messages[0].ValidatorAddress - types.SetupCosmosConfig() - _, _, _, sk := testutil.SetupMinimalKeepers() - tf.valAddr, err = cosmlib.EthAddressFromString(sk.ValidatorAddressCodec(), valAddr) - if err != nil { - return err - } - return nil } diff --git a/e2e/localnet/network/node.go b/e2e/localnet/network/node.go index c57f05ee30..4fe08647df 100644 --- a/e2e/localnet/network/node.go +++ b/e2e/localnet/network/node.go @@ -38,7 +38,7 @@ import ( const ( defaultTimeout = 30 * time.Second - nodeStartTime = 7 * time.Second + nodeStartTime = 10 * time.Second ) // ContainerizedNode is an interface for a containerized network. diff --git a/e2e/precompile/contracts/bank/bank_test.go b/e2e/precompile/contracts/bank/bank_test.go index 98028fac2c..c4215005cc 100644 --- a/e2e/precompile/contracts/bank/bank_test.go +++ b/e2e/precompile/contracts/bank/bank_test.go @@ -72,7 +72,7 @@ var _ = Describe("Bank", func() { }) It("should call functions on the precompile directly", func() { - numberOfDenoms := 8 + numberOfDenoms := 7 coinsToBeSent := []bindings.CosmosCoin{ { Denom: denom, @@ -93,18 +93,6 @@ var _ = Describe("Bank", func() { Amount: big.NewInt(1000000000000000000), }, } - evmDenomMetadata := bindings.IBankModuleDenomMetadata{ - Name: "Berachain bera", - Symbol: "BERA", - Description: "The Bera.", - DenomUnits: []bindings.IBankModuleDenomUnit{ - {Denom: "bera", Exponent: uint32(0), Aliases: []string{"bera"}}, - {Denom: "nbera", Exponent: uint32(9), Aliases: []string{"nanobera"}}, - {Denom: "abera", Exponent: uint32(18), Aliases: []string{"attobera"}}, - }, - Base: "bera", - Display: "bera", - } // charlie initially has 1000000000000000000 abera balance, err := bankPrecompile.GetBalance(nil, tf.Address("charlie"), denom) @@ -149,13 +137,5 @@ var _ = Describe("Bank", func() { totalSupply, err := bankPrecompile.GetAllSupply(nil) Expect(err).ShouldNot(HaveOccurred()) Expect(totalSupply).To(HaveLen(numberOfDenoms)) - - denomMetadata, err := bankPrecompile.GetDenomMetadata(nil, "bera") - Expect(err).ShouldNot(HaveOccurred()) - Expect(denomMetadata).To(Equal(evmDenomMetadata)) - - sendEnabled, err := bankPrecompile.GetSendEnabled(nil, "abera") - Expect(err).ShouldNot(HaveOccurred()) - Expect(sendEnabled).To(BeTrue()) }) }) diff --git a/e2e/precompile/contracts/gov/governance_test.go b/e2e/precompile/contracts/gov/governance_test.go index d29d55e743..4edf932523 100644 --- a/e2e/precompile/contracts/gov/governance_test.go +++ b/e2e/precompile/contracts/gov/governance_test.go @@ -98,7 +98,7 @@ var _ = Describe("Call the Precompile Directly", func() { // Send coins to the wrapper. coins := []bbindings.CosmosCoin{ { - Denom: "abgt", + Denom: "abera", Amount: amt, }, } @@ -110,7 +110,7 @@ var _ = Describe("Call the Precompile Directly", func() { // Wrapper submits a proposal. prop = getProposal(wrapperAddr, amt) txr = tf.GenerateTransactOpts("alice") - tx, err = wrapper.Submit(txr, getTestProposal(prop), "abgt", amt) + tx, err = wrapper.Submit(txr, getTestProposal(prop), "abera", amt) Expect(err).ToNot(HaveOccurred()) ExpectSuccessReceipt(tf.EthClient(), tx) @@ -222,7 +222,7 @@ func getProposal( }, InitialDeposit: []bindings.CosmosCoin{ { - Denom: "abgt", + Denom: "abera", Amount: amount, }, }, diff --git a/e2e/precompile/contracts/staking/staking_test.go b/e2e/precompile/contracts/staking/staking_test.go index 581596b400..0f7c6e5138 100644 --- a/e2e/precompile/contracts/staking/staking_test.go +++ b/e2e/precompile/contracts/staking/staking_test.go @@ -55,21 +55,23 @@ var _ = Describe("Staking", func() { tf *network.TestFixture stakingPrecompile *bindings.StakingModule bankPrecompile *bbindings.BankModule - validator common.Address delegateAmt = big.NewInt(123450000000) + validator common.Address ) BeforeEach(func() { // Setup the network and clients here. tf = network.NewTestFixture(GinkgoT(), utils.NewPolarisFixtureConfig()) - - validator = tf.ValAddr() stakingPrecompile, _ = bindings.NewStakingModule( common.HexToAddress("0xd9A998CaC66092748FfEc7cFBD155Aae1737C2fF"), tf.EthClient()) bankPrecompile, _ = bbindings.NewBankModule( common.BytesToAddress(authtypes.NewModuleAddress(banktypes.ModuleName)), tf.EthClient(), ) + validators, _, err := stakingPrecompile.GetBondedValidators(nil, bindings.CosmosPageRequest{}) + Expect(err).ToNot(HaveOccurred()) + Expect(validators).To(HaveLen(1)) + validator = common.BytesToAddress(validators[0].OperatorAddr[:]) }) AfterEach(func() { @@ -83,10 +85,6 @@ var _ = Describe("Staking", func() { }) It("should call functions on the precompile directly", func() { - validators, _, err := stakingPrecompile.GetBondedValidators(nil, bindings.CosmosPageRequest{}) - Expect(err).ToNot(HaveOccurred()) - Expect(validators[0].OperatorAddr).To(Equal(validator)) - delegated, err := stakingPrecompile.GetDelegation(nil, tf.Address("alice"), validator) Expect(err).ToNot(HaveOccurred()) Expect(delegated.Cmp(big.NewInt(0))).To(Equal(0)) diff --git a/e2e/precompile/polard/config/addrbook.json b/e2e/precompile/polard/config/addrbook.json deleted file mode 100644 index cac3f62607..0000000000 --- a/e2e/precompile/polard/config/addrbook.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key": "3d4757e585691cecb11a7c37", - "addrs": [] -} \ No newline at end of file diff --git a/e2e/precompile/polard/config/app.toml b/e2e/precompile/polard/config/app.toml deleted file mode 100644 index cc91de3f25..0000000000 --- a/e2e/precompile/polard/config/app.toml +++ /dev/null @@ -1,515 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -############################################################################### -### Base Configuration ### -############################################################################### - -# The minimum gas prices a validator is willing to accept for processing a -# transaction. A transaction's fees must meet the minimum of any denomination -# specified in this config (e.g. 0.25token1;0.0001token2). -minimum-gas-prices = "0stake" - -# The maximum gas a query coming over rest/grpc may consume. -# If this is set to zero, the query can consume an unbounded amount of gas. -query-gas-limit = "0" - -# default: the last 362880 states are kept, pruning at 10 block intervals -# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) -# everything: 2 latest states will be kept; pruning at 10 block intervals. -# custom: allow pruning options to be manually specified through 'pruning-keep-recent', and 'pruning-interval' -pruning = "default" - -# These are applied if and only if the pruning strategy is custom. -pruning-keep-recent = "0" -pruning-interval = "0" - -# HaltHeight contains a non-zero block height at which a node will gracefully -# halt and shutdown that can be used to assist upgrades and testing. -# -# Note: Commitment of state will be attempted on the corresponding block. -halt-height = 0 - -# HaltTime contains a non-zero minimum block time (in Unix seconds) at which -# a node will gracefully halt and shutdown that can be used to assist upgrades -# and testing. -# -# Note: Commitment of state will be attempted on the corresponding block. -halt-time = 0 - -# MinRetainBlocks defines the minimum block height offset from the current -# block being committed, such that all blocks past this offset are pruned -# from CometBFT. It is used as part of the process of determining the -# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates -# that no blocks should be pruned. -# -# This configuration value is only responsible for pruning CometBFT blocks. -# It has no bearing on application state pruning which is determined by the -# "pruning-*" configurations. -# -# Note: CometBFT block pruning is dependant on this parameter in conjunction -# with the unbonding (safety threshold) period, state pruning and state sync -# snapshot parameters to determine the correct minimum value of -# ResponseCommit.RetainHeight. -min-retain-blocks = 0 - -# InterBlockCache enables inter-block caching. -inter-block-cache = true - -# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, -# which informs CometBFT what to index. If empty, all events will be indexed. -# -# Example: -# ["message.sender", "message.recipient"] -index-events = [] - -# IavlCacheSize set the size of the iavl tree cache (in number of nodes). -iavl-cache-size = 10000 - -# IAVLDisableFastNode enables or disables the fast node feature of IAVL. -# Default is false. -iavl-disable-fastnode = false - -# AppDBBackend defines the database backend type to use for the application and snapshots DBs. -# An empty string indicates that a fallback will be used. -# The fallback is the db_backend value set in CometBFT's config.toml. -app-db-backend = "" - -############################################################################### -### Telemetry Configuration ### -############################################################################### - -[telemetry] - -# Prefixed with keys to separate services. -service-name = "" - -# Enabled enables the application telemetry functionality. When enabled, -# an in-memory sink is also enabled by default. Operators may also enabled -# other sinks such as Prometheus. -enabled = false - -# Enable prefixing gauge values with hostname. -enable-hostname = false - -# Enable adding hostname to labels. -enable-hostname-label = false - -# Enable adding service to labels. -enable-service-label = false - -# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. -prometheus-retention-time = 0 - -# GlobalLabels defines a global set of name/value label tuples applied to all -# metrics emitted using the wrapper functions defined in telemetry package. -# -# Example: -# [["chain_id", "cosmoshub-1"]] -global-labels = [] - -############################################################################### -### API Configuration ### -############################################################################### - -[api] - -# Enable defines if the API server should be enabled. -enable = false - -# Swagger defines if swagger documentation should automatically be registered. -swagger = false - -# Address defines the API server to listen on. -address = "tcp://localhost:1317" - -# MaxOpenConnections defines the number of maximum open connections. -max-open-connections = 1000 - -# RPCReadTimeout defines the CometBFT RPC read timeout (in seconds). -rpc-read-timeout = 10 - -# RPCWriteTimeout defines the CometBFT RPC write timeout (in seconds). -rpc-write-timeout = 0 - -# RPCMaxBodyBytes defines the CometBFT maximum request body (in bytes). -rpc-max-body-bytes = 1000000 - -# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). -enabled-unsafe-cors = false - -############################################################################### -### gRPC Configuration ### -############################################################################### - -[grpc] - -# Enable defines if the gRPC server should be enabled. -enable = true - -# Address defines the gRPC server address to bind to. -address = "localhost:9090" - -# MaxRecvMsgSize defines the max message size in bytes the server can receive. -# The default value is 10MB. -max-recv-msg-size = "10485760" - -# MaxSendMsgSize defines the max message size in bytes the server can send. -# The default value is math.MaxInt32. -max-send-msg-size = "2147483647" - -############################################################################### -### gRPC Web Configuration ### -############################################################################### - -[grpc-web] - -# GRPCWebEnable defines if the gRPC-web should be enabled. -# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. -# NOTE: gRPC-Web uses the same address as the API server. -enable = true - -############################################################################### -### State Sync Configuration ### -############################################################################### - -# State sync snapshots allow other nodes to rapidly join the network without replaying historical -# blocks, instead downloading and applying a snapshot of the application state at a given height. -[state-sync] - -# snapshot-interval specifies the block interval at which local state sync snapshots are -# taken (0 to disable). -snapshot-interval = 0 - -# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). -snapshot-keep-recent = 2 - -############################################################################### -### State Streaming ### -############################################################################### - -# Streaming allows nodes to stream state to external systems. -[streaming] - -# streaming.abci specifies the configuration for the ABCI Listener streaming service. -[streaming.abci] - -# List of kv store keys to stream out via gRPC. -# The store key names MUST match the module's StoreKey name. -# -# Example: -# ["acc", "bank", "gov", "staking", "mint"[,...]] -# ["*"] to expose all keys. -keys = [] - -# The plugin name used for streaming via gRPC. -# Streaming is only enabled if this is set. -# Supported plugins: abci -plugin = "" - -# stop-node-on-err specifies whether to stop the node on message delivery error. -stop-node-on-err = true - -############################################################################### -### Mempool ### -############################################################################### - -[mempool] -# Setting max-txs to 0 will allow for a unbounded amount of transactions in the mempool. -# Setting max_txs to negative 1 (-1) will disable transactions from being inserted into the mempool. -# Setting max_txs to a positive number (> 0) will limit the number of transactions in the mempool, by the specified amount. -# -# Note, this configuration only applies to SDK built-in app-side mempool -# implementations. -max-txs = 5000 - -############################################################################### -### Polaris ### -############################################################################### -# General Polaris settings -[polaris] - -[polaris.polar] -# Gas cap for RPC requests -rpc-gas-cap = "50000000" - -# Timeout setting for EVM operations via RPC -rpc-evm-timeout = "5s" - -# Transaction fee cap for RPC requests -rpc-tx-fee-cap = "1" - - -# Chain config -[polaris.polar.chain] -chain-id = "2061" - -# Homestead switch block -homestead-block = "0" - -# DAO fork switch block -dao-fork-block = "0" - -# Whether to support DAO fork -dao-fork-support = true - -# EIP150 switch block -eip150-block = "0" - -# EIP155 switch block -eip155-block = "0" - -# EIP158 switch block -eip158-block = "0" - -# Byzanitum switch block -byzantium-block = "0" - -# Constantinople switch block -constantinople-block = "0" - -# Petersburg switch block -petersburg-block = "0" - -# Istanbul switch block -istanbul-block = "0" - -# Muir Glacier switch block -muir-glacier-block = "0" - -# Berlin switch block -berlin-block = "0" - -# London switch block -london-block = "0" - -# Arrow Glacier switch block -arrow-glacier-block = "0" - -# Gray Glacier switch block -gray-glacier-block = "0" - -# Merge Netsplit switch block -merge-netsplit-block = "0" - -# Shanghai switch time (nil == no fork, 0 = already on shanghai) -shanghai-time = "0" - -# Cancun switch time (nil == no fork, 0 = already on cancun) -cancun-time = "" - -# Prague switch time (nil == no fork, 0 = already on prague) -prague-time = "" - -# Verkle switch time (nil == no fork, 0 = already on verkle) -verkle-time = "" - -# Terminal total difficulty -terminal-total-difficulty = "0" - -# Whether terminal total difficulty has passed -terminal-total-difficulty-passed = "true" - -# DevMode enabled -is-dev-mode = false - - -# Miner config -[polaris.polar.miner] -# The address to which mining rewards will be sent -etherbase = "0x0000000000000000000000000000000000000000" - -# Extra data included in mined blocks -extra-data = "0x" - -# Gas price for transactions included in blocks -gas-price = "1000000000" - -# Minimum gas limit for transactions included in blocks -gas-floor = "0" - -# Maximum gas limit for transactions included in blocks -gas-ceil = "30000000" - -# Whether to enable recommit feature -recommit = "2s" - -# Timeout for creating a new payload -new-payload-timeout = "2s" - - -# Gas price oracle settings for Polaris -[polaris.polar.gpo] -# Number of blocks to check for gas prices -blocks = "20" - -# Percentile of gas price to use -percentile = "60" - -# Maximum header history for gas price determination -max-header-history = "1024" - -# Maximum block history for gas price determination -max-block-history = "1024" - -# Default gas price value -default = "1000000000" - -# Maximum gas price value -max-price = "500000000000" - -# Prices to ignore for gas price determination -ignore-price = "2" - -# LegacyTxPool settings -[polaris.polar.legacy-tx-pool] - -# Addresses that should be treated by default as local -locals = [] - -# Whether local transaction handling should be disabled -no-locals = false - -# Journal of local transactions to survive node restarts -journal = "transactions.rlp" - -# Time interval to regenerate the local transaction journal -rejournal = "1h0m0s" - -# Minimum gas price to enforce for acceptance into the pool -price-limit = "1" - -# Minimum price bump percentage to replace an already existing transaction (nonce) -price-bump = "10" - -# Number of executable transaction slots guaranteed per account -account-slots = "16" - -# Maximum number of executable transaction slots for all accounts -account-queue = "64" - -# Maximum number of non-executable transaction slots permitted per account -global-slots = "5120" - -# Maximum number of non-executable transaction slots for all accounts -global-queue = "1024" - -# Maximum amount of time non-executable transaction are queued -lifetime = "3h0m0s" - - -# Node-specific settings -[polaris.node] -# Name of the node -name = "polaris-geth" - -# User identity associated with the node -user-ident = "" - -# Version of the node -version = "" - -# Directory for storing node data -data-dir = "" - -# Directory for storing node keys -key-store-dir = "" - -# Path to the external signer -external-signer = "" - -# Whether to use lightweight KDF -use-lightweight-kdf = false - -# Allow insecure unlock -insecure-unlock-allowed = false - -# USB setting for the node -usb = false - -# Path to smart card daemon -smart-card-daemon-path = "" - -# IPC path for the node -ipc-path = "" - -# Host for HTTP requests -http-host = "0.0.0.0" - -# Port for HTTP requests -http-port = 8545 - -# CORS settings for HTTP -http-cors = ["*"] - -# Virtual hosts for HTTP -http-virtual-hosts = ["*"] - -# Enabled modules for HTTP -http-modules = ["net", "web3", "eth", "web3", "net", "txpool", "debug"] - -# Path prefix for HTTP -http-path-prefix = "" - -# Address for authentication -auth-addr = "localhost" - -# Port for authentication -auth-port = 8551 - -# Virtual hosts for authentication -auth-virtual-hosts = ["localhost"] - -# Host for WebSockets -ws-host = "0.0.0.0" - -# Port for WebSockets -ws-port = 8546 - -# Path prefix for WebSockets -ws-path-prefix = "" - -# Origins allowed for WebSockets -ws-origins = ["*"] - -# Enabled modules for WebSockets -ws-modules = ["net", "web3", "eth"] - -# Expose all settings for WebSockets -ws-expose-all = false - -# CORS settings for GraphQL -graphql-cors = [] - -# Virtual hosts for GraphQL -graphql-virtual-hosts = ["localhost"] - -# Allow unprotected transactions -allow-unprotected-txs = false - -# Limit for batch requests -batch-request-limit = 1000 - -# Maximum size for batch responses -batch-response-max-size = 25000000 - -# JWT secret for authentication -jwt-secret = "" - -# Database engine for the node -db-engine = "" - - -# HTTP timeout settings for the node -[polaris.node.http-timeouts] -# Timeout for reading HTTP requests -read-timeout = "30s" - -# Timeout for reading HTTP request headers -read-header-timeout = "30s" - -# Timeout for writing HTTP responses -write-timeout = "30s" - -# Timeout for idle HTTP connections -idle-timeout = "2m0s" diff --git a/e2e/precompile/polard/config/client.toml b/e2e/precompile/polard/config/client.toml deleted file mode 100644 index ae8bf7217a..0000000000 --- a/e2e/precompile/polard/config/client.toml +++ /dev/null @@ -1,21 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -############################################################################### -### Client Configuration ### -############################################################################### - -# The network chain ID -chain-id = "polaris-2061" - -# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) -keyring-backend = "test" - -# CLI output format (text|json) -output = "text" - -# : to CometBFT RPC interface for this chain -node = "tcp://localhost:26657" - -# Transaction broadcasting mode (sync|async) -broadcast-mode = "sync" diff --git a/e2e/precompile/polard/config/config.toml b/e2e/precompile/polard/config/config.toml deleted file mode 100644 index 608a74f812..0000000000 --- a/e2e/precompile/polard/config/config.toml +++ /dev/null @@ -1,473 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or -# relative to the home directory (e.g. "data"). The home directory is -# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable -# or --home cmd flag. - -# The version of the CometBFT binary that created or -# last modified the config file. Do not modify this. -version = "0.38.0-rc2" - -####################################################################### -### Main Base Config Options ### -####################################################################### - -# TCP or UNIX socket address of the ABCI application, -# or the name of an ABCI application compiled in with the CometBFT binary -proxy_app = "tcp://0.0.0.0:26658" - -# A custom human readable name for this node -moniker = "localtestnet" - -# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb -# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) -# - pure go -# - stable -# * cleveldb (uses levigo wrapper) -# - fast -# - requires gcc -# - use cleveldb build tag (go build -tags cleveldb) -# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) -# - EXPERIMENTAL -# - may be faster is some use-cases (random reads - indexer) -# - use boltdb build tag (go build -tags boltdb) -# * rocksdb (uses github.com/tecbot/gorocksdb) -# - EXPERIMENTAL -# - requires gcc -# - use rocksdb build tag (go build -tags rocksdb) -# * badgerdb (uses github.com/dgraph-io/badger) -# - EXPERIMENTAL -# - use badgerdb build tag (go build -tags badgerdb) -db_backend = "goleveldb" - -# Database directory -db_dir = "data" - -# Output level for logging, including package level options -log_level = "info" - -# Output format: 'plain' (colored text) or 'json' -log_format = "plain" - -##### additional base config options ##### - -# Path to the JSON file containing the initial validator set and other meta data -genesis_file = "config/genesis.json" - -# Path to the JSON file containing the private key to use as a validator in the consensus protocol -priv_validator_key_file = "config/priv_validator_key.json" - -# Path to the JSON file containing the last sign state of a validator -priv_validator_state_file = "config/priv_validator_state.json" - -# TCP or UNIX socket address for CometBFT to listen on for -# connections from an external PrivValidator process -priv_validator_laddr = "" - -# Path to the JSON file containing the private key to use for node authentication in the p2p protocol -node_key_file = "config/node_key.json" - -# Mechanism to connect to the ABCI application: socket | grpc -abci = "socket" - -# If true, query the ABCI app on connecting to a new peer -# so the app can decide if we should keep the connection or not -filter_peers = false - - -####################################################################### -### Advanced Configuration Options ### -####################################################################### - -####################################################### -### RPC Server Configuration Options ### -####################################################### -[rpc] - -# TCP or UNIX socket address for the RPC server to listen on -laddr = "tcp://0.0.0.0:26657" - -# A list of origins a cross-domain request can be executed from -# Default value '[]' disables cors support -# Use '["*"]' to allow any origin -cors_allowed_origins = [] - -# A list of methods the client is allowed to use with cross-domain requests -cors_allowed_methods = ["HEAD", "GET", "POST"] - -# A list of non simple headers the client is allowed to use with cross-domain requests -cors_allowed_headers = [ - "Origin", - "Accept", - "Content-Type", - "X-Requested-With", - "X-Server-Time", -] - -# TCP or UNIX socket address for the gRPC server to listen on -# NOTE: This server only supports /broadcast_tx_commit -grpc_laddr = "" - -# Maximum number of simultaneous connections. -# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -grpc_max_open_connections = 900 - -# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool -unsafe = false - -# Maximum number of simultaneous connections (including WebSocket). -# Does not include gRPC connections. See grpc_max_open_connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -max_open_connections = 900 - -# Maximum number of unique clientIDs that can /subscribe -# If you're using /broadcast_tx_commit, set to the estimated maximum number -# of broadcast_tx_commit calls per block. -max_subscription_clients = 100 - -# Maximum number of unique queries a given client can /subscribe to -# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to -# the estimated # maximum number of broadcast_tx_commit calls per block. -max_subscriptions_per_client = 5 - -# Experimental parameter to specify the maximum number of events a node will -# buffer, per subscription, before returning an error and closing the -# subscription. Must be set to at least 100, but higher values will accommodate -# higher event throughput rates (and will use more memory). -experimental_subscription_buffer_size = 200 - -# Experimental parameter to specify the maximum number of RPC responses that -# can be buffered per WebSocket client. If clients cannot read from the -# WebSocket endpoint fast enough, they will be disconnected, so increasing this -# parameter may reduce the chances of them being disconnected (but will cause -# the node to use more memory). -# -# Must be at least the same as "experimental_subscription_buffer_size", -# otherwise connections could be dropped unnecessarily. This value should -# ideally be somewhat higher than "experimental_subscription_buffer_size" to -# accommodate non-subscription-related RPC responses. -experimental_websocket_write_buffer_size = 200 - -# If a WebSocket client cannot read fast enough, at present we may -# silently drop events instead of generating an error or disconnecting the -# client. -# -# Enabling this experimental parameter will cause the WebSocket connection to -# be closed instead if it cannot read fast enough, allowing for greater -# predictability in subscription behavior. -experimental_close_on_slow_client = false - -# How long to wait for a tx to be committed during /broadcast_tx_commit. -# WARNING: Using a value larger than 10s will result in increasing the -# global HTTP write timeout, which applies to all connections and endpoints. -# See https://github.com/tendermint/tendermint/issues/3435 -timeout_broadcast_tx_commit = "15s" - -# Maximum size of request body, in bytes -max_body_bytes = 1000000 - -# Maximum size of request header, in bytes -max_header_bytes = 1048576 - -# The path to a file containing certificate that is used to create the HTTPS server. -# Might be either absolute path or path related to CometBFT's config directory. -# If the certificate is signed by a certificate authority, -# the certFile should be the concatenation of the server's certificate, any intermediates, -# and the CA's certificate. -# NOTE: both tls_cert_file and tls_key_file must be present for CometBFT to create HTTPS server. -# Otherwise, HTTP server is run. -tls_cert_file = "" - -# The path to a file containing matching private key that is used to create the HTTPS server. -# Might be either absolute path or path related to CometBFT's config directory. -# NOTE: both tls-cert-file and tls-key-file must be present for CometBFT to create HTTPS server. -# Otherwise, HTTP server is run. -tls_key_file = "" - -# pprof listen address (https://golang.org/pkg/net/http/pprof) -pprof_laddr = "0.0.0.0:6060" - -####################################################### -### P2P Configuration Options ### -####################################################### -[p2p] - -# Address to listen for incoming connections -laddr = "tcp://0.0.0.0:26656" - -# Address to advertise to peers for them to dial -# If empty, will use the same port as the laddr, -# and will introspect on the listener or use UPnP -# to figure out the address. ip and port are required -# example: 159.89.10.97:26656 -external_address = "" - -# Comma separated list of seed nodes to connect to -seeds = "" - -# Comma separated list of peers to be added to the peer store -# on startup. Either BootstrapPeers or PersistentPeers are -# needed for peer discovery -bootstrap_peers = "" - -# Comma separated list of nodes to keep persistent connections to -persistent_peers = "" - -# UPNP port forwarding -upnp = false - -# Path to address book -addr_book_file = "config/addrbook.json" - -# Set true for strict address routability rules -# Set false for private or local networks -addr_book_strict = true - -# Maximum number of inbound peers -max_num_inbound_peers = 40 - -# Maximum number of outbound peers to connect to, excluding persistent peers -max_num_outbound_peers = 10 - -# List of node IDs, to which a connection will be (re)established ignoring any existing limits -unconditional_peer_ids = "" - -# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) -persistent_peers_max_dial_period = "0s" - -# Time to wait before flushing messages out on the connection -flush_throttle_timeout = "100ms" - -# Maximum size of a message packet payload, in bytes -max_packet_msg_payload_size = 1024 - -# Rate at which packets can be sent, in bytes/second -send_rate = 5120000 - -# Rate at which packets can be received, in bytes/second -recv_rate = 5120000 - -# Set true to enable the peer-exchange reactor -pex = true - -# Seed mode, in which node constantly crawls the network and looks for -# peers. If another node asks it for addresses, it responds and disconnects. -# -# Does not work if the peer-exchange reactor is disabled. -seed_mode = false - -# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) -private_peer_ids = "" - -# Toggle to disable guard against peers connecting from the same ip. -allow_duplicate_ip = false - -# Peer connection configuration. -handshake_timeout = "20s" -dial_timeout = "3s" - -####################################################### -### Mempool Configuration Option ### -####################################################### -[mempool] - -# Recheck (default: true) defines whether CometBFT should recheck the -# validity for all remaining transaction in the mempool after a block. -# Since a block affects the application state, some transactions in the -# mempool may become invalid. If this does not apply to your application, -# you can disable rechecking. -recheck = true - -# Broadcast (default: true) defines whether the mempool should relay -# transactions to other peers. Setting this to false will stop the mempool -# from relaying transactions to other peers until they are included in a -# block. In other words, if Broadcast is disabled, only the peer you send -# the tx to will see it until it is included in a block. -broadcast = true - -# WalPath (default: "") configures the location of the Write Ahead Log -# (WAL) for the mempool. The WAL is disabled by default. To enable, set -# WalPath to where you want the WAL to be written (e.g. -# "data/mempool.wal"). -wal_dir = "" - -# Maximum number of transactions in the mempool -size = 5000 - -# Limit the total size of all txs in the mempool. -# This only accounts for raw transactions (e.g. given 1MB transactions and -# max_txs_bytes=5MB, mempool will only accept 5 transactions). -max_txs_bytes = 1073741824 - -# Size of the cache (used to filter transactions we saw earlier) in transactions -cache_size = 10000 - -# Do not remove invalid transactions from the cache (default: false) -# Set to true if it's not possible for any invalid transaction to become valid -# again in the future. -keep-invalid-txs-in-cache = false - -# Maximum size of a single transaction. -# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. -max_tx_bytes = 1048576 - -# Maximum size of a batch of transactions to send to a peer -# Including space needed by encoding (one varint per transaction). -# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 -max_batch_bytes = 0 - -####################################################### -### State Sync Configuration Options ### -####################################################### -[statesync] -# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine -# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in -# the network to take and serve state machine snapshots. State sync is not attempted if the node -# has any local state (LastBlockHeight > 0). The node will have a truncated block history, -# starting from the height of the snapshot. -enable = false - -# RPC servers (comma-separated) for light client verification of the synced state machine and -# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding -# header hash obtained from a trusted source, and a period during which validators can be trusted. -# -# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 -# weeks) during which they can be financially punished (slashed) for misbehavior. -rpc_servers = "" -trust_height = 0 -trust_hash = "" -trust_period = "168h0m0s" - -# Time to spend discovering snapshots before initiating a restore. -discovery_time = "15s" - -# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). -# Will create a new, randomly named directory within, and remove it when done. -temp_dir = "" - -# The timeout duration before re-requesting a chunk, possibly from a different -# peer (default: 1 minute). -chunk_request_timeout = "10s" - -# The number of concurrent chunk fetchers to run (default: 1). -chunk_fetchers = "4" - -####################################################### -### Block Sync Configuration Options ### -####################################################### -[blocksync] - -# Block Sync version to use: -# -# In v0.37, v1 and v2 of the block sync protocols were deprecated. -# Please use v0 instead. -# -# 1) "v0" - the default block sync implementation -version = "v0" - -####################################################### -### Consensus Configuration Options ### -####################################################### -[consensus] - -wal_file = "data/cs.wal/wal" - -# How long we wait for a proposal block before prevoting nil -timeout_propose = "1s" -# How much timeout_propose increases with each round -timeout_propose_delta = "1s" -# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) -timeout_prevote = "1s" -# How much the timeout_prevote increases with each round -timeout_prevote_delta = "1s" -# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) -timeout_precommit = "1s" -# How much the timeout_precommit increases with each round -timeout_precommit_delta = "1s" -# How long we wait after committing a block, before starting on the new -# height (this gives us a chance to receive some more precommits, even -# though we already have +2/3). -timeout_commit = "1s" - -# How many blocks to look back to check existence of the node's consensus votes before joining consensus -# When non-zero, the node will panic upon restart -# if the same consensus key was used to sign {double_sign_check_height} last blocks. -# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. -double_sign_check_height = 0 - -# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) -skip_timeout_commit = false - -# EmptyBlocks mode and possible interval between empty blocks -create_empty_blocks = true -create_empty_blocks_interval = "0s" - -# Reactor sleep duration parameters -peer_gossip_sleep_duration = "100ms" -peer_query_maj23_sleep_duration = "2s" - -####################################################### -### Storage Configuration Options ### -####################################################### -[storage] - -# Set to true to discard ABCI responses from the state store, which can save a -# considerable amount of disk space. Set to false to ensure ABCI responses are -# persisted. ABCI responses are required for /block_results RPC queries, and to -# reindex events in the command-line tool. -discard_abci_responses = false - -####################################################### -### Transaction Indexer Configuration Options ### -####################################################### -[tx_index] - -# What indexer to use for transactions -# -# The application will set which txs to index. In some cases a node operator will be able -# to decide which txs to index based on configuration set in the application. -# -# Options: -# 1) "null" -# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). -# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. -# 3) "psql" - the indexer services backed by PostgreSQL. -# When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. -indexer = "null" - -# The PostgreSQL connection configuration, the connection format: -# postgresql://:@:/? -psql-conn = "" - -####################################################### -### Instrumentation Configuration Options ### -####################################################### -[instrumentation] - -# When true, Prometheus metrics are served under /metrics on -# PrometheusListenAddr. -# Check out the documentation for the list of available metrics. -prometheus = false - -# Address to listen for Prometheus collector(s) connections -prometheus_listen_addr = ":26660" - -# Maximum number of simultaneous connections. -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -max_open_connections = 3 - -# Instrumentation namespace -namespace = "cometbft" diff --git a/e2e/precompile/polard/config/genesis.json b/e2e/precompile/polard/config/genesis.json deleted file mode 100644 index c0182436b5..0000000000 --- a/e2e/precompile/polard/config/genesis.json +++ /dev/null @@ -1,604 +0,0 @@ -{ - "app_name": "polaris-cosmos", - "app_version": "v0.0.0", - "genesis_time": "2023-07-12T20:36:17.455523Z", - "chain_id": "polaris-2061", - "initial_height": 1, - "app_hash": null, - "app_state": { - "auth": { - "params": { - "max_memo_characters": "256", - "tx_sig_limit": "7", - "tx_size_cost_per_byte": "10", - "sig_verify_cost_ed25519": "590", - "sig_verify_cost_secp256k1": "1000" - }, - "accounts": [ - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1495yj0z9uvfa0q6vr9egd6cdv6d93qtfqv45p6", - "pub_key": null, - "account_number": "0", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1ymets0a3x3acej049mgk084f0zuq4g0nngdk0v", - "pub_key": null, - "account_number": "1", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1xst3m55fkvlrnm0nqekca70yh70ffsz8dlhtrj", - "pub_key": null, - "account_number": "2", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1yrene6g2zwjttemf0c65fscg8w8c55w5vhc9hd", - "pub_key": null, - "account_number": "3", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1dgtgps0vxwt90hu6f3cceqypc5k664cz2kml8y", - "pub_key": null, - "account_number": "4", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar1h08vp7xt40nks7d0mlg47duyv54ewdxryjqtp8", - "pub_key": null, - "account_number": "5", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "polar14nqnr8l8y2se3uu47qtyqehdfccfgwdlsrc04n", - "pub_key": null, - "account_number": "6", - "sequence": "0" - } - ] - }, - "bank": { - "params": { - "send_enabled": [], - "default_send_enabled": true - }, - "balances": [ - { - "address": "polar1yrene6g2zwjttemf0c65fscg8w8c55w5vhc9hd", - "coins": [ - { - "denom": "abera", - "amount": "69000000000000000000000000" - } - ] - }, - { - "address": "polar1ymets0a3x3acej049mgk084f0zuq4g0nngdk0v", - "coins": [ - { - "denom": "abera", - "amount": "100000000000000000000000000" - } - ] - }, - { - "address": "polar1xst3m55fkvlrnm0nqekca70yh70ffsz8dlhtrj", - "coins": [ - { - "denom": "abera", - "amount": "100000000000000000000000000" - } - ] - }, - { - "address": "polar1495yj0z9uvfa0q6vr9egd6cdv6d93qtfqv45p6", - "coins": [ - { - "denom": "abera", - "amount": "100000000000000000000000000" - } - ] - }, - { - "address": "polar1dgtgps0vxwt90hu6f3cceqypc5k664cz2kml8y", - "coins": [ - { - "denom": "abera", - "amount": "1000000000000000000" - }, - { - "denom": "abgt", - "amount": "1000000000000000000" - }, - { - "denom": "asupply", - "amount": "1000000000000000000" - }, - { - "denom": "atoken", - "amount": "1000000000000000000" - }, - { - "denom": "bAKT", - "amount": "12345" - }, - { - "denom": "bATOM", - "amount": "1000000000000000000" - }, - { - "denom": "bOSMO", - "amount": "24690" - }, - { - "denom": "stake", - "amount": "1000000000000000000" - } - ] - }, - { - "address": "polar1h08vp7xt40nks7d0mlg47duyv54ewdxryjqtp8", - "coins": [ - { - "denom": "abera", - "amount": "100" - }, - { - "denom": "atoken", - "amount": "100" - }, - { - "denom": "stake", - "amount": "1000000000000000000" - } - ] - }, - { - "address": "polar14nqnr8l8y2se3uu47qtyqehdfccfgwdlsrc04n", - "coins": [ - { - "denom": "abera", - "amount": "1000000000000000000" - } - ] - } - ], - "supply": [ - { - "denom": "abera", - "amount": "369000002000000000000000100" - }, - { - "denom": "abgt", - "amount": "1000000000000000000" - }, - { - "denom": "asupply", - "amount": "1000000000000000000" - }, - { - "denom": "atoken", - "amount": "1000000000000000100" - }, - { - "denom": "bAKT", - "amount": "12345" - }, - { - "denom": "bATOM", - "amount": "1000000000000000000" - }, - { - "denom": "bOSMO", - "amount": "24690" - }, - { - "denom": "stake", - "amount": "2000000000000000000" - } - ], - "denom_metadata": [ - { - "name": "Berachain bera", - "symbol": "BERA", - "description": "The Bera.", - "denom_units": [ - { - "denom": "bera", - "exponent": 0, - "aliases": [ - "bera" - ] - }, - { - "denom": "nbera", - "exponent": 9, - "aliases": [ - "nanobera" - ] - }, - { - "denom": "abera", - "exponent": 18, - "aliases": [ - "attobera" - ] - } - ], - "base": "bera", - "display": "bera" - }, - { - "name": "Berachain bgt", - "symbol": "BGT", - "description": "The BGT.", - "denom_units": [ - { - "denom": "bgt", - "exponent": 0, - "aliases": [ - "bgt" - ] - }, - { - "denom": "nbgt", - "exponent": 9, - "aliases": [ - "nanobgt" - ] - }, - { - "denom": "abgt", - "exponent": 18, - "aliases": [ - "attobgt" - ] - } - ], - "base": "bgt", - "display": "bgt" - }, - { - "name": "Osmosis", - "symbol": "bOSMO", - "denom_units": [ - { - "denom": "osmo", - "exponent": 0, - "aliases": [ - "osmo" - ] - }, - { - "denom": "nosmo", - "exponent": 9, - "aliases": [ - "nanoosmo" - ] - }, - { - "denom": "aosmo", - "exponent": 18, - "aliases": [ - "attoosmo" - ] - } - ], - "base": "osmo", - "display": "osmo" - }, - { - "name": "Akash", - "symbol": "AKT", - "denom_units": [ - { - "denom": "akt", - "exponent": 0, - "aliases": [ - "akt" - ] - }, - { - "denom": "nakt", - "exponent": 9, - "aliases": [ - "nanoakt" - ] - }, - { - "denom": "aakt", - "exponent": 18, - "aliases": [ - "attoakt" - ] - } - ], - "base": "akt", - "display": "akt" - } - ], - "send_enabled": [ - { - "denom": "abera", - "enabled": true - }, - { - "denom": "atoken", - "enabled": true - }, - { - "denom": "stake", - "enabled": true - } - ] - }, - "consensus": null, - "crisis": { - "constant_fee": { - "denom": "abera", - "amount": "1000" - } - }, - "distribution": { - "params": { - "community_tax": "0.020000000000000000", - "base_proposer_reward": "0.000000000000000000", - "bonus_proposer_reward": "0.000000000000000000", - "withdraw_addr_enabled": true - }, - "fee_pool": { - "community_pool": [] - }, - "delegator_withdraw_infos": [], - "previous_proposer": "", - "outstanding_rewards": [], - "validator_accumulated_commissions": [], - "validator_historical_rewards": [], - "validator_current_rewards": [], - "delegator_starting_infos": [], - "validator_slash_events": [] - }, - "erc20": { - "params": {} - }, - "evidence": { - "evidence": [] - }, - "evm": { - "config": { - "chainId": 2061, - "homesteadBlock": 0, - "daoForkBlock": 0, - "daoForkSupport": true, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "arrowGlacierBlock": 0, - "grayGlacierBlock": 0, - "mergeNetsplitBlock": 0, - "terminalTotalDifficulty": 0, - "terminalTotalDifficultyPassed": true - }, - "nonce": "0x0", - "timestamp": "0x0", - "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", - "gasLimit": "0x1c9c380", - "difficulty": "0x0", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "20f33ce90a13a4b5e7697e3544c3083b8f8a51d4": { - "balance": "0x1b1ae4d6e2ef500000" - }, - "6A1680c1Ec339657df9a4c718C8081C52daD5702": { - "balance": "0x4563918244f40000" - }, - "bBcec0f8cBAbe76879AfdfD15F3784652B9734C3": { - "balance": "0x4563918244f40000" - }, - "acc1319Fe722A198F395F0164066ED4E309439Bf": { - "balance": "0x4563918244f40000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "baseFeePerGas": "0x3b9aca00" - }, - "genutil": { - "gen_txs": [ - { - "body": { - "messages": [ - { - "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", - "description": { - "moniker": "localtestnet", - "identity": "", - "website": "", - "security_contact": "", - "details": "" - }, - "commission": { - "rate": "0.100000000000000000", - "max_rate": "0.200000000000000000", - "max_change_rate": "0.010000000000000000" - }, - "min_self_delegation": "1", - "delegator_address": "", - "validator_address": "polarvaloper1495yj0z9uvfa0q6vr9egd6cdv6d93qtfu79j24", - "pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "kJ7vtR1OBWtyG8XGqSYA/kmCsB6dd4kfDlubmvps4AU=" - }, - "value": { - "denom": "abera", - "amount": "1000000000000000000000" - } - } - ], - "memo": "4354a78701907c06155caf2bf230ba7988115799@192.168.0.226:26656", - "timeout_height": "0", - "extension_options": [], - "non_critical_extension_options": [] - }, - "auth_info": { - "signer_infos": [ - { - "public_key": { - "@type": "/polaris.crypto.ethsecp256k1.v1.PubKey", - "key": "AzdysLoPMtCAH1HKf+HkCnZY5JRF91ufsyi2T5VGeWtK" - }, - "mode_info": { - "single": { - "mode": "SIGN_MODE_DIRECT" - } - }, - "sequence": "0" - } - ], - "fee": { - "amount": [], - "gas_limit": "200000", - "payer": "", - "granter": "" - }, - "tip": null - }, - "signatures": [ - "qDKf04Is1Ag3r7N3TGQmHhy5HQuw5b4i8ZoaTm0nVFt5xsaidxam2iqVBQfK4MQQAMP4CztrToojOzPRqXkeQQE=" - ] - } - ] - }, - "gov": { - "starting_proposal_id": "1", - "deposits": [], - "votes": [], - "proposals": [], - "deposit_params": { - "min_deposit": [ - { - "denom": "abgt", - "amount": "0" - } - ] - }, - "voting_params": null, - "tally_params": null, - "params": { - "min_deposit": [ - { - "denom": "abgt", - "amount": "10000000" - } - ], - "max_deposit_period": "172800s", - "voting_period": "172800s", - "quorum": "0.334000000000000000", - "threshold": "0.500000000000000000", - "veto_threshold": "0.334000000000000000", - "min_initial_deposit_ratio": "0.000000000000000000", - "proposal_cancel_ratio": "0.500000000000000000", - "proposal_cancel_dest": "", - "expedited_voting_period": "86400s", - "expedited_threshold": "0.667000000000000000", - "expedited_min_deposit": [ - { - "denom": "abgt", - "amount": "50000000" - } - ], - "burn_vote_quorum": false, - "burn_proposal_deposit_prevote": false, - "burn_vote_veto": true - }, - "constitution": "" - }, - "mint": { - "minter": { - "inflation": "0.130000000000000000", - "annual_provisions": "0.000000000000000000" - }, - "params": { - "mint_denom": "abera", - "inflation_rate_change": "0.130000000000000000", - "inflation_max": "0.200000000000000000", - "inflation_min": "0.070000000000000000", - "goal_bonded": "0.670000000000000000", - "blocks_per_year": "6311520" - } - }, - "params": null, - "runtime": null, - "slashing": { - "params": { - "signed_blocks_window": "100", - "min_signed_per_window": "0.500000000000000000", - "downtime_jail_duration": "600s", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": [], - "missed_blocks": [] - }, - "staking": { - "params": { - "unbonding_time": "1814400s", - "max_validators": 100, - "max_entries": 7, - "historical_entries": 10000, - "bond_denom": "abera", - "min_commission_rate": "0.000000000000000000" - }, - "last_total_power": "0", - "last_validator_powers": [], - "validators": [], - "delegations": [], - "unbonding_delegations": [], - "redelegations": [], - "exported": false - }, - "upgrade": {}, - "vesting": {} - }, - "consensus": { - "params": { - "block": { - "max_bytes": "22020096", - "max_gas": "30000000" - }, - "evidence": { - "max_age_num_blocks": "100000", - "max_age_duration": "172800000000000", - "max_bytes": "1048576" - }, - "validator": { - "pub_key_types": [ - "ed25519" - ] - }, - "version": { - "app": "0" - }, - "abci": { - "vote_extensions_enable_height": "0" - } - } - } -} \ No newline at end of file diff --git a/e2e/precompile/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json b/e2e/precompile/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json deleted file mode 100644 index 4b2df2531f..0000000000 --- a/e2e/precompile/polard/config/gentx/gentx-4354a78701907c06155caf2bf230ba7988115799.json +++ /dev/null @@ -1 +0,0 @@ -{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"localtestnet","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"","validator_address":"polarvaloper1495yj0z9uvfa0q6vr9egd6cdv6d93qtfu79j24","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"kJ7vtR1OBWtyG8XGqSYA/kmCsB6dd4kfDlubmvps4AU="},"value":{"denom":"abera","amount":"1000000000000000000000"}}],"memo":"4354a78701907c06155caf2bf230ba7988115799@192.168.0.226:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/polaris.crypto.ethsecp256k1.v1.PubKey","key":"AzdysLoPMtCAH1HKf+HkCnZY5JRF91ufsyi2T5VGeWtK"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""},"tip":null},"signatures":["qDKf04Is1Ag3r7N3TGQmHhy5HQuw5b4i8ZoaTm0nVFt5xsaidxam2iqVBQfK4MQQAMP4CztrToojOzPRqXkeQQE="]} diff --git a/e2e/precompile/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address b/e2e/precompile/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address deleted file mode 100644 index 97397b9a48..0000000000 --- a/e2e/precompile/polard/config/keyring-test/26f2b83fb1347b8cc9f52ed1679ea978b80aa1f3.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNy0xMiAxODoxMToyMi4wMTI0MzkgLTA0MDAgRURUIG09KzAuMDQ3MzE2MjkzIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiN3Zfbmk2dUhQNVJKOFdraiJ9.SmemtJsU4a2Xizvls0qw3qd08u7kEKuqmXijwf-mkKjdt8rOPQWNmA.y90QPh6CNqXOfVgK.7bT7EOj2WzwDxLSc87DM1JYrjegd06FKfncrVGdUYduUNj41GBkM9V-f_y9C945vDdwQAGDNh98W8vxrlmtScTwxU59D22YNJ2BBZCIw8Bh2pjZzbRuoT_W9JoezjcuWFu-B8WatBDEjfDfHutXgTgH92mcvzNGJUeDH_PuSV0dlEZ_ZjtSn1BozrZtHeGHqH7XuIo6CnW1e3MK_5YQyLNZ_eqb-q0meTBbSiekKBCZ8mw.oYjuXnbRfeWBPsGCTUk6yg \ No newline at end of file diff --git a/e2e/precompile/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address b/e2e/precompile/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address deleted file mode 100644 index 1a303610e4..0000000000 --- a/e2e/precompile/polard/config/keyring-test/34171dd289b33e39edf3066d8ef9e4bf9e94c047.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNy0xMiAxODoxMToyMi4wNzIxOTcgLTA0MDAgRURUIG09KzAuMDQ2MzE1NTg0IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoib0EtNXB0Ynh1c2V4YVZpMyJ9.oRXm03kzb_wMTvWknVoqfqVN1u9srGNKHGtg_AxQxmKGUq3dEs8Bgg.npb6d683oVHQE5cN.4j7Az5qB409GgSlIikZfGwJ4DspzTk2d94G5Xhy1iQsEuwnIpCqNSkLXJ_SJwrtKrsRu7A7wFjbn8wc-s6DMJT-LIzta3JWMjAG4MTRtkriDnL6LsGx6sAtw-ZuhxvQTi5WNLN3mxwz-YlKEBLQrzpUn3Ob1KkFHhJNuTebxmRsa28u5-ViDur_JMpTHc-3FX9haD_LOS8GlU2G-0BoyCQZasMcOjyJoDqm3dEUs0KOZOQ.4QhuaEidllFrFSQuYhkyng \ No newline at end of file diff --git a/e2e/precompile/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address b/e2e/precompile/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address deleted file mode 100644 index efce56f091..0000000000 --- a/e2e/precompile/polard/config/keyring-test/a968493c45e313d7834c197286eb0d669a588169.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNy0xMiAxODoxMToyMS45NTIxMjggLTA0MDAgRURUIG09KzAuMDQ3MzU3NzA5IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTG9NRllxaTh5cWt2WWFEcyJ9.NP5jzEsR7SJ_CQYiJsRi-_Rfg62EW6TnVwfpgm_MKR_0YjoyW4mqpA.v6pRGWB0RXsUZ761.h16eMaQihhWI9s8-a3NTq1rEcH08CJ-LN1mQiJHrkcZ1PngNc0bhiYecg4qOiAlujCSXL-EWZk7LWx9hV6HKZ8O_Cwm3VIwN60MpU2VkEFC93XdLOO2q3sAQrCgQj6jt74AbKyvS7CxC7HBnjPzUO4UgtHdHqU38EWzAyM0Z0scwQt3Z6YvwTYtX0ksgDEtARYrMWWce8AOZEXSeAmgsvDcgZ58OdCSI36RovKRxcm2_lQ.GhM1V7052xQ5mGutKzR4-A \ No newline at end of file diff --git a/e2e/precompile/polard/config/keyring-test/dev0.info b/e2e/precompile/polard/config/keyring-test/dev0.info deleted file mode 100644 index 3f44b6200d..0000000000 --- a/e2e/precompile/polard/config/keyring-test/dev0.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNy0xMiAxODoxMToyMS45NTA2MTUgLTA0MDAgRURUIG09KzAuMDQ1ODQ0MjA5IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiU1NYajBpNm16b3VnTkF0eSJ9.LlhkONEdULWZu07tGnADeH9Ic0wOQA4jykXPHqdsldqoKmAq2yc3rQ.KBn6V7ibCQnuB664.VT8QFhAejNK-WqoSVgNMPHn6JMzxcmPi6yte0ppHqzAkIYDcpRIk3oAIdZNA0JYoc4pzgxgqOxWKPc04cigxjLeZAuZ1hcSWSDbtS520jhG-_Yj_eDg7oLabP0sE1LSm-LlxXO73FfquyejSATqhNmF2YUNv1v2O3fJ4Vx4Nnft87O9LErghTbH7BixtA_wOo_GJQbBmFpTBGKni2692x6N2i2kziXBky-TopedE6Pa1s2alnPMgjaP7GYINp_YkmzLaG-fzB1Lu8cTSanXN3UbVLFP61uAhIWiqRo2Qrr02Upxn63mR9A5RkwnKGUSyAHR9o26tSPiUpSehk8R6g4CPsQgFHA_1FeV4rxNqNwY3UQ7S-OEVj33FEIoO3p9Imd2LnHO_rQucDbJ9MpI8wphYn_OGcnlyvzVi27XQROHq8M-bfQ_klefdaBv6u9M5inymrqKs2LngE4uzysZ0.4Pnq4eJ3DNSPllobaI2ugQ \ No newline at end of file diff --git a/e2e/precompile/polard/config/keyring-test/dev1.info b/e2e/precompile/polard/config/keyring-test/dev1.info deleted file mode 100644 index 37697a882d..0000000000 --- a/e2e/precompile/polard/config/keyring-test/dev1.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNy0xMiAxODoxMToyMi4wMTEwMjEgLTA0MDAgRURUIG09KzAuMDQ1ODk4NjY4IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiU3kzT1FwTDB3Z1R5X0J5LSJ9.TxrHZHLwQOs6i76XZL6GRxFYzHODyrWRakKtDTWcOX2P9oVfZcdZDQ.OIBpmN0B5WJ6aaxh.ANK0BGJRqKUSXgoNI5Crm-chmiMJNoZV4V3HtnCjMvgwrn2Pez6rKuJlTL7MY-mOvCrph9abyg_IQIoIyIr1PAjwRxYjyt6EygxdLsGSRYzzG3fmTZ7NGhz-N0rabpVlDyyT5LWGpwwYG_MAlQQfkgIkm2pyfKwlgouC7SO9BIvmLpyIJ-jvDbvkBb4PN_uaVR_5z0o6OrAit9zBREFYOY07SwnGS3puTQa_riS5I-f5rwTq_LKTjovKdd4_VppmK4fw-S63sDytcbp3VsKfGOL8y68dGmrOuKCRjFxIPx7YjC6RlIOF86mrCKwjO5R7wmKWFEdXylE3PxUcy2FZxGWp1l9JbtL2iQyWtuEvgHdpdEJDoZmhtQ48qMqMPBDBzQamkNthKd20o7maL9OqRtnvv_K55WbUj6AkQmH2b64T5Elf7z0VeIThx0FMmXSjOye-nQD28MO0rueKQpuA.kFwfvcOAwU_Nolz013ryZg \ No newline at end of file diff --git a/e2e/precompile/polard/config/keyring-test/dev2.info b/e2e/precompile/polard/config/keyring-test/dev2.info deleted file mode 100644 index af9dee5f6e..0000000000 --- a/e2e/precompile/polard/config/keyring-test/dev2.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNy0xMiAxODoxMToyMi4wNzA0MTYgLTA0MDAgRURUIG09KzAuMDQ0NTM0MjkzIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiZVZ3M1dOc0tDWVFTYnBHMiJ9.tSsdNEXBsmu8U_88urb4tQO6cXikw4ZQyRMb9PYUfvM2gw358kLvGA.SzsDUSTuuxrL82cd.uSUWTyYHn7R5Tikxzm1SYO_gYxp3uBqDXHTkQpz5x5Z5XDLlc6AU5bVngaxWOm2OA8w5YPZhG83IWOP911U4M2x05xnkHlLIyjuLaAl61zHAP3LCcJYs08hp4DaAAnPtolp83PgZ3g3XEwZbc-4Z9spwUdbKq-1NfznGHzb3cnLfcI20gzewFOCZM2s7v-eHn6fJRv5put115RMFyr-I3Uszw0I0lzevMsWRTsgm4Lj4xkaLE49EFgYXwUXhl9ZX5Wscymno9QI8kmWNHV3unsonejxHbz3vVx4xeMDtFyrApWOrpXuOFirHxwEdtwIU74Yx7UZdWf1ieBIbX7Qe0r9_peyzpHlQ36zc-Pkkt3BZLpympG1zAmIv25RLNctNCu5mAMd1ukTJWmqj7HWQ5dlHxI1nCgU5TmWLW-toaYrWEMoPLzHaFL5bgxqgNuJvRV8e7IqHJGeKaI68leWj.WGc-tSI5x3qXLUAezVYwcw \ No newline at end of file diff --git a/e2e/precompile/polard/config/node_key.json b/e2e/precompile/polard/config/node_key.json deleted file mode 100644 index cd76249a8a..0000000000 --- a/e2e/precompile/polard/config/node_key.json +++ /dev/null @@ -1 +0,0 @@ -{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"8gsddDNUroA1RA+KLrsatcbUW5iFnO6IWpPOvpH6gwpw3s3tDPFnqkVUIxwSWYbm/u8VXwJDbYZqzb07DYdQ+A=="}} \ No newline at end of file diff --git a/e2e/precompile/polard/config/priv_validator_key.json b/e2e/precompile/polard/config/priv_validator_key.json deleted file mode 100644 index 8df3445b36..0000000000 --- a/e2e/precompile/polard/config/priv_validator_key.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "address": "5A5D95E9CB8B675E387A120FCF0549D98BA91D1B", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "kJ7vtR1OBWtyG8XGqSYA/kmCsB6dd4kfDlubmvps4AU=" - }, - "priv_key": { - "type": "tendermint/PrivKeyEd25519", - "value": "sXuG/o+AupFMFu/E8Mo6D82EkkHCuqbAaMpSjS+tGdmQnu+1HU4Fa3IbxcapJgD+SYKwHp13iR8OW5ua+mzgBQ==" - } -} \ No newline at end of file diff --git a/e2e/precompile/polard/config/priv_validator_state.json b/e2e/precompile/polard/config/priv_validator_state.json deleted file mode 100644 index 48f3b67e3f..0000000000 --- a/e2e/precompile/polard/config/priv_validator_state.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "height": "0", - "round": 0, - "step": 0 -} \ No newline at end of file diff --git a/e2e/precompile/polard/start-node.sh b/e2e/precompile/polard/start-node.sh index aac4cac071..1e542fcf93 100755 --- a/e2e/precompile/polard/start-node.sh +++ b/e2e/precompile/polard/start-node.sh @@ -19,27 +19,85 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. +KEYS[0]="dev0" +KEYS[1]="dev1" +KEYS[2]="dev2" CHAINID="polaris-2061" MONIKER="localtestnet" - +# Remember to change to other types of keyring like 'file' in-case exposing to outside world, +# otherwise your balance will be wiped quickly +# The keyring test does not require private key to steal tokens from you +KEYRING="test" +KEYALGO="secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./bin/polard instance -HOMEDIR="./polard" -# to trace evm +HOMEDIR="/" +# to trace evm #TRACE="--trace" TRACE="" +# Path variables +CONFIG_TOML=$HOMEDIR/config/config.toml +APP_TOML=$HOMEDIR/config/app.toml +GENESIS=$HOMEDIR/config/genesis.json +TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json + # used to exit on first error (any non-zero exit code) set -e -GENESIS=$HOMEDIR/config/genesis.json -TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json -cp $GENESIS $TMP_GENESIS +# Reinstall daemon +# make build + +# Remove the previous folder + + # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) +polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" +# Set client config +polard config set client keyring-backend $KEYRING --home "$HOMEDIR" +polard config set client chain-id "$CHAINID" --home "$HOMEDIR" -# set the current time as genesis time -CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S.000000Z") -cat "$GENESIS" | jq --arg curr_time "$CURRENT_TIME" '.genesis_time = $curr_time' > "$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +# If keys exist they should be deleted +for KEY in "${KEYS[@]}"; do + polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" +done +# echo "UPDATED FILE" + +# Change parameter token denominations to abera +jq '.app_state["staking"]["params"]["bond_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.app_state["crisis"]["constant_fee"]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.app_state["gov"]["params"]["min_deposit"][0]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["min_deposit"][0]["amount"]="1"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["expedited_min_deposit"][0]["denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["gov"]["params"]["expedited_min_deposit"][0]["amount"]="2"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS"; +jq '.app_state["mint"]["params"]["mint_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.consensus["params"]["block"]["max_gas"]="30000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" + +# Dump genesis +# echo "genesis state:" +# cat $GENESIS + +# Allocate genesis accounts (cosmos formatted addresses) +for KEY in "${KEYS[@]}"; do + polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" +done + +# alice cosmos1dgtgps0vxwt90hu6f3cceqypc5k664czp95ank +# bob cosmos1h08vp7xt40nks7d0mlg47duyv54ewdxr0p0f44 +# charlie cosmos14nqnr8l8y2se3uu47qtyqehdfccfgwdlmshdpp + +# Give alice, bob and charlie some bank tokens. +polard genesis add-genesis-account cosmos1dgtgps0vxwt90hu6f3cceqypc5k664czp95ank 1000000000000000000abera,1000000000000000000asupply,1000000000000000000atoken,12345bAKT,1000000000000000000bATOM,24690bOSMO,1000000000000000000stake --keyring-backend $KEYRING --home "$HOMEDIR" +polard genesis add-genesis-account cosmos1h08vp7xt40nks7d0mlg47duyv54ewdxr0p0f44 100abera,100atoken,1000000000000000000stake --keyring-backend $KEYRING --home "$HOMEDIR" +polard genesis add-genesis-account cosmos14nqnr8l8y2se3uu47qtyqehdfccfgwdlmshdpp 1000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + +# Give alice, bob and charlie some evm tokens. +jq '.app_state["evm"]["alloc"]["6A1680c1Ec339657df9a4c718C8081C52daD5702"]["balance"]="0x4563918244f40000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.app_state["evm"]["alloc"]["bBcec0f8cBAbe76879AfdfD15F3784652B9734C3"]["balance"]="0x4563918244f40000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" +jq '.app_state["evm"]["alloc"]["acc1319Fe722A198F395F0164066ED4E309439Bf"]["balance"]="0x4563918244f40000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" + +# Sign genesis transaction +polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis ## 1. Back to `./bin/polard keys add` step, init more keys ## 2. Back to `./bin/polard add-genesis-account` step, add balance for those @@ -47,6 +105,9 @@ cat "$GENESIS" | jq --arg curr_time "$CURRENT_TIME" '.genesis_time = $curr_time' ## 4. Run `gentx` in each of those folders ## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` +# Collect genesis tx +polard genesis collect-gentxs --home "$HOMEDIR" + # Run this to ensure everything worked and that the genesis file is setup correctly polard genesis validate-genesis --home "$HOMEDIR" diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 889ed92b59..e6610cc89a 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -43,7 +43,6 @@ import ( "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" @@ -56,13 +55,16 @@ import ( "github.com/ethereum/go-ethereum/node" + evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" - ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" + antelib "pkg.berachain.dev/polaris/cosmos/lib/ante" + signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" + libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" "pkg.berachain.dev/polaris/cosmos/txpool" - evmante "pkg.berachain.dev/polaris/cosmos/x/evm/ante" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + coretypes "pkg.berachain.dev/polaris/eth/core/types" ) // DefaultNodeHome default home directories for the application daemon. @@ -132,7 +134,9 @@ func NewPolarisApp( // merge the AppConfig and other configuration in one config appConfig = depinject.Configs( MakeAppConfig(bech32Prefix), - depinject.Provide(evmtypes.ProvideEthereumTransactionGetSigners), + depinject.Provide( + signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], + ), depinject.Supply( // supply the application options appOpts, @@ -205,22 +209,10 @@ func NewPolarisApp( app.SetPrepareProposal(app.mm.PrepareProposal) // Setup Custom Ante Handler - ch, _ := evmante.NewAnteHandler( - ante.HandlerOptions{ - AccountKeeper: app.AccountKeeper, - BankKeeper: app.BankKeeper, - SignModeHandler: app.txConfig.SignModeHandler(), - FeegrantKeeper: nil, - SigGasConsumer: evmante.SigVerificationGasConsumer, - }, - ) app.SetAnteHandler( - ch, + antelib.NewMinimalHandler(), ) - // Register eth_secp256k1 keys - ethcryptocodec.RegisterInterfaces(app.interfaceRegistry) - // ----- END EVM SETUP ------------------------------------------------- // register streaming services @@ -280,7 +272,8 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon } // Create a TxSerializer. - serializer := evmtypes.NewSerializer(apiSvr.ClientCtx.TxConfig) + serializer := libtx.NewSerializer[*coretypes.Transaction]( + apiSvr.ClientCtx.TxConfig, evmtypes.WrapTx) // Initialize services. app.mm.Init(serializer) diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index a482943161..611d480c7e 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -111,7 +111,7 @@ var ( //nolint:funlen // long config func MakeAppConfig(bech32Prefix string) depinject.Config { if len(bech32Prefix) == 0 { - bech32Prefix = "polar" + bech32Prefix = "cosmos" } return depinject.Configs(appconfig.Compose(&appv1alpha1.Config{ Modules: []*appv1alpha1.ModuleConfig{ diff --git a/e2e/testapp/docker/local/docker-init.sh b/e2e/testapp/docker/local/docker-init.sh index 346833b884..e79ee85d89 100644 --- a/e2e/testapp/docker/local/docker-init.sh +++ b/e2e/testapp/docker/local/docker-init.sh @@ -29,7 +29,7 @@ MONIKER="localtestnet" # otherwise your balance will be wiped quickly # The keyring test does not require private key to steal tokens from you KEYRING="test" -KEYALGO="eth_secp256k1" +KEYALGO="secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./bin/polard instance HOMEDIR="/" @@ -77,7 +77,7 @@ done # Test Account # absurd surge gather author blanket acquire proof struggle runway attract cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite verb tank # 0xfffdbb37105441e14b0ee6330d855d8504ff39e705c3afa8f859ac9865f99306 -polard genesis add-genesis-account polar1yrene6g2zwjttemf0c65fscg8w8c55w5vhc9hd 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" +polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" # Sign genesis transaction polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/docker/seed/init.sh b/e2e/testapp/docker/seed/init.sh index 0ad79711ca..118c453695 100755 --- a/e2e/testapp/docker/seed/init.sh +++ b/e2e/testapp/docker/seed/init.sh @@ -22,7 +22,7 @@ KEY="brick" CHAINID="berachain-666" MONIKER="brickchain" KEYRING="test" -KEYALGO="eth_secp256k1" +KEYALGO="secp256k1" LOGLEVEL="info" HOMEDIR="data/.polard" TRACE="" diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh index 4aa4cd5f09..7778ec2ff3 100755 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh @@ -25,7 +25,7 @@ if [ -z "$KEYRING" ]; then KEYRING="test" fi if [ -z "$KEYALGO" ]; then - KEYALGO="eth_secp256k1" + KEYALGO="secp256k1" fi if [ -z "$LOGLEVEL" ]; then LOGLEVEL="info" diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh index 6267490110..9dc9be441f 100644 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh @@ -25,7 +25,7 @@ if [ -z "$KEYRING" ]; then KEYRING="test" fi if [ -z "$KEYALGO" ]; then - KEYALGO="eth_secp256k1" + KEYALGO="secp256k1" fi HOMEDIR="/.polard" diff --git a/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh b/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh index 0f784b4b7d..6042f44524 100644 --- a/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh +++ b/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh @@ -25,7 +25,7 @@ if [ -z "$KEYRING" ]; then KEYRING="test" fi if [ -z "$KEYALGO" ]; then - KEYALGO="eth_secp256k1" + KEYALGO="secp256k1" fi if [ -z "$LOGLEVEL" ]; then LOGLEVEL="info" diff --git a/e2e/testapp/docker/validator/scripts/val0-init-step1.sh b/e2e/testapp/docker/validator/scripts/val0-init-step1.sh index 1c5ce6f7a5..0049b9c4ed 100644 --- a/e2e/testapp/docker/validator/scripts/val0-init-step1.sh +++ b/e2e/testapp/docker/validator/scripts/val0-init-step1.sh @@ -22,7 +22,7 @@ KEY1="val0" CHAINID="brickchain-666" MONIKER1="val-0" KEYRING="test" -KEYALGO="eth_secp256k1" +KEYALGO="secp256k1" HOMEDIR="/.polard" polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/docker/validator/scripts/val1-init-step1.sh b/e2e/testapp/docker/validator/scripts/val1-init-step1.sh index e11b397216..68a49db78c 100644 --- a/e2e/testapp/docker/validator/scripts/val1-init-step1.sh +++ b/e2e/testapp/docker/validator/scripts/val1-init-step1.sh @@ -22,7 +22,7 @@ KEY2="val1" CHAINID="brickchain-666" MONIKER1="val-1" KEYRING="test" -KEYALGO="eth_secp256k1" +KEYALGO="secp256k1" HOMEDIR="/.polard" polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index 4a7d60d835..7828daf835 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -28,7 +28,7 @@ MONIKER="localtestnet" # otherwise your balance will be wiped quickly # The keyring test does not require private key to steal tokens from you KEYRING="test" -KEYALGO="eth_secp256k1" +KEYALGO="secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./bin/polard instance HOMEDIR="./.tmp/polard" @@ -59,10 +59,10 @@ fi # Setup local node if overwrite is set to Yes, otherwise skip setup if [[ $overwrite == "y" || $overwrite == "Y" ]]; then - # Remove the previous folder + # # Remove the previous folder rm -rf "$HOMEDIR" - # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) + # # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) ./bin/polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" # Set client config @@ -89,7 +89,7 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Test Account # absurd surge gather author blanket acquire proof struggle runway attract cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite verb tank # 0xfffdbb37105441e14b0ee6330d855d8504ff39e705c3afa8f859ac9865f99306 - ./bin/polard genesis add-genesis-account polar1yrene6g2zwjttemf0c65fscg8w8c55w5vhc9hd 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + ./bin/polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" # Sign genesis transaction ./bin/polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index e3a3900745..2205fc6c96 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -29,8 +29,6 @@ require ( cosmossdk.io/math v1.1.3-rc.1 // indirect cosmossdk.io/store v1.0.0-rc.0 cosmossdk.io/x/tx v0.10.0 // indirect - github.com/btcsuite/btcd v0.23.4 // indirect - github.com/btcsuite/btcd/btcutil v1.1.3 // indirect github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect @@ -74,7 +72,6 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/bytedance/sonic v1.10.0 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 2a7c7f0d58..50360a259f 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -245,7 +245,6 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 728edec249..34344700d4 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -61,10 +61,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" - ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" - "pkg.berachain.dev/polaris/cosmos/crypto/keyring" - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" testapp "pkg.berachain.dev/polaris/e2e/testapp" ) @@ -81,15 +80,19 @@ func NewRootCmd() *cobra.Command { moduleBasicManager module.BasicManager ) - if err := depinject.Inject(depinject.Configs( - testapp.MakeAppConfig(""), - depinject.Supply( - testapp.PolarisConfigFn(evmconfig.DefaultConfig()), - testapp.QueryContextFn((&testapp.SimApp{})), - log.NewNopLogger(), - simtestutil.NewAppOptionsWithFlagHome(tempDir()), + if err := depinject.Inject( + depinject.Configs( + testapp.MakeAppConfig(""), + depinject.Supply( + testapp.PolarisConfigFn(evmconfig.DefaultConfig()), + testapp.QueryContextFn((&testapp.SimApp{})), + log.NewNopLogger(), + simtestutil.NewAppOptionsWithFlagHome(tempDir()), + ), + depinject.Provide( + signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], + ), ), - depinject.Provide(evmtypes.ProvideEthereumTransactionGetSigners)), &interfaceRegistry, &appCodec, &txConfig, @@ -100,8 +103,6 @@ func NewRootCmd() *cobra.Command { panic(err) } - ethcryptocodec.RegisterInterfaces(interfaceRegistry) - initClientCtx := client.Context{}. WithCodec(appCodec). WithInterfaceRegistry(interfaceRegistry). @@ -109,8 +110,7 @@ func NewRootCmd() *cobra.Command { WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). WithHomeDir(testapp.DefaultNodeHome). - WithViper(""). // In simapp, we don't use any prefix for env variables. - WithKeyringOptions(keyring.EthSecp256k1Option()) + WithViper("") // In simapp, we don't use any prefix for env variables. rootCmd := &cobra.Command{ Use: "polard", diff --git a/go.work.sum b/go.work.sum index 1bcf286c81..cf17c48c90 100644 --- a/go.work.sum +++ b/go.work.sum @@ -399,6 +399,9 @@ github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3 github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= @@ -435,6 +438,7 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= +github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= @@ -806,6 +810,8 @@ github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiy github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= @@ -1066,6 +1072,7 @@ google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= diff --git a/licensing/argus-labs.md b/license/argus-labs.md similarity index 100% rename from licensing/argus-labs.md rename to license/argus-labs.md diff --git a/cosmos/proto/buf.gen.gogo.yaml b/proto/buf.gen.gogo.yaml similarity index 100% rename from cosmos/proto/buf.gen.gogo.yaml rename to proto/buf.gen.gogo.yaml diff --git a/cosmos/proto/buf.gen.pulsar.yaml b/proto/buf.gen.pulsar.yaml similarity index 100% rename from cosmos/proto/buf.gen.pulsar.yaml rename to proto/buf.gen.pulsar.yaml diff --git a/cosmos/proto/buf.lock b/proto/buf.lock similarity index 100% rename from cosmos/proto/buf.lock rename to proto/buf.lock diff --git a/cosmos/proto/buf.yaml b/proto/buf.yaml similarity index 100% rename from cosmos/proto/buf.yaml rename to proto/buf.yaml diff --git a/cosmos/proto/polaris/evm/module/v1alpha1/module.proto b/proto/polaris/evm/module/v1alpha1/module.proto similarity index 100% rename from cosmos/proto/polaris/evm/module/v1alpha1/module.proto rename to proto/polaris/evm/module/v1alpha1/module.proto diff --git a/cosmos/proto/polaris/evm/v1alpha1/tx.proto b/proto/polaris/evm/v1alpha1/tx.proto similarity index 100% rename from cosmos/proto/polaris/evm/v1alpha1/tx.proto rename to proto/polaris/evm/v1alpha1/tx.proto diff --git a/cosmos/proto/scripts/proto_generate.sh b/scripts/proto_generate.sh similarity index 95% rename from cosmos/proto/scripts/proto_generate.sh rename to scripts/proto_generate.sh index 3a857a968a..3a91413c58 100755 --- a/cosmos/proto/scripts/proto_generate.sh +++ b/scripts/proto_generate.sh @@ -29,7 +29,7 @@ set -e echo "Generating gogo proto code" -cd cosmos/proto +cd proto proto_dirs=$(find ./ -path -prune -o -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq) for dir in $proto_dirs; do for file in $(find "${dir}" -maxdepth 1 -name '*.proto'); do @@ -44,9 +44,9 @@ for dir in $proto_dirs; do done # move proto files to the right places -cp -r pkg.berachain.dev/polaris/cosmos/* ../ +cp -r pkg.berachain.dev/polaris/* ../ rm -rf pkg.berachain.dev cd ../ -./proto/scripts/proto_generate_pulsar.sh \ No newline at end of file +./scripts/proto_generate_pulsar.sh \ No newline at end of file diff --git a/cosmos/proto/scripts/proto_generate_pulsar.sh b/scripts/proto_generate_pulsar.sh similarity index 83% rename from cosmos/proto/scripts/proto_generate_pulsar.sh rename to scripts/proto_generate_pulsar.sh index 2d067a7e36..376f83757b 100755 --- a/cosmos/proto/scripts/proto_generate_pulsar.sh +++ b/scripts/proto_generate_pulsar.sh @@ -32,7 +32,9 @@ protoc_install_gopulsar() { protoc_install_gopulsar echo "Cleaning API directory" -(cd api; find ./ -type f \( -iname \*.pulsar.go -o -iname \*.pb.go -o -iname \*.cosmos_orm.go -o -iname \*.pb.gw.go \) -delete; find . -empty -type d -delete; cd ../../..) +(cd cosmos/api; find ./ -type f \( -iname \*.pulsar.go -o -iname \*.pb.go -o -iname \*.cosmos_orm.go -o -iname \*.pb.gw.go \) -delete; find . -empty -type d -delete; cd ../../..) echo "Generating API module" -(cd proto; buf generate --template buf.gen.pulsar.yaml; cd ../) \ No newline at end of file +(cd proto; buf generate --template buf.gen.pulsar.yaml; cd ../) + +mv api cosmos/ \ No newline at end of file diff --git a/tools/go.mod b/tools/go.mod index 7db66305c9..0ce10df962 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -11,7 +11,6 @@ require ( github.com/matryer/moq v0.3.2 github.com/onsi/ginkgo/v2 v2.12.1 github.com/securego/gosec/v2 v2.17.0 - github.com/segmentio/golines v0.11.0 github.com/vektra/mockery/v2 v2.34.1 ) @@ -31,8 +30,6 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/alexkohler/nakedret/v2 v2.0.2 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect @@ -73,7 +70,6 @@ require ( github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/curioswitch/go-reassign v0.2.0 // indirect github.com/daixiang0/gci v0.11.0 // indirect - github.com/dave/dst v0.27.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect @@ -199,7 +195,6 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect github.com/mgechev/revive v1.3.2 // indirect - github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect @@ -284,7 +279,6 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect github.com/vbatts/tar-split v0.11.3 // indirect - github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect github.com/xen0n/gosmopolitan v1.2.1 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect @@ -315,7 +309,6 @@ require ( golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/tools/go.sum b/tools/go.sum index 41c9c56daa..5a8c0ace26 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -71,13 +71,10 @@ github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMz github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= @@ -193,10 +190,6 @@ github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDU github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= github.com/daixiang0/gci v0.11.0 h1:XeQbFKkCRxvVyn06EOuNY6LPGBLVuB/W130c8FrnX6A= github.com/daixiang0/gci v0.11.0/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/dave/dst v0.27.2 h1:4Y5VFTkhGLC1oddtNwuxxe36pnyLxMFXT51FOzH8Ekc= -github.com/dave/dst v0.27.2/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= -github.com/dave/jennifer v1.5.0 h1:HmgPN93bVDpkQyYbqhCHj5QlgvUkvEOzMyEvKLgCRrg= -github.com/dave/jennifer v1.5.0/go.mod h1:4MnyiFIlZS3l5tSDn8VnzE6ffAhYBMB2SZntBsZGUok= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -603,8 +596,6 @@ github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwg github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -751,10 +742,6 @@ github.com/sashamelentyev/usestdlibvars v1.24.0 h1:MKNzmXtGh5N0y74Z/CIaJh4GlB364 github.com/sashamelentyev/usestdlibvars v1.24.0/go.mod h1:9cYkq+gYJ+a5W2RPdhfaSCnTVUC1OQP/bSiiBhq3OZE= github.com/securego/gosec/v2 v2.17.0 h1:ZpAStTDKY39insEG9OH6kV3IkhQZPTq9a9eGOLOjcdI= github.com/securego/gosec/v2 v2.17.0/go.mod h1:lt+mgC91VSmriVoJLentrMkRCYs+HLTBnUFUBuhV2hc= -github.com/segmentio/golines v0.11.0 h1:5NVrYkCBoe9wLerhTi+WFOlqx9g3PtP5Tm27uartkL0= -github.com/segmentio/golines v0.11.0/go.mod h1:BRnGHV3is9Qs/58zOqy3CFwH1B2jdVsViGY3G+qctSs= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -869,8 +856,6 @@ github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RV github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= github.com/vektra/mockery/v2 v2.34.1 h1:H+wO4wTRlBjdY3yFUjv53GazCaDSEfhRKJugyo2aoNc= github.com/vektra/mockery/v2 v2.34.1/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM= -github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= @@ -1336,7 +1321,6 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/tools/tools.go b/tools/tools.go index 842810be79..38920601f0 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -44,6 +44,5 @@ import ( _ "github.com/matryer/moq" _ "github.com/onsi/ginkgo/v2/ginkgo" _ "github.com/securego/gosec/v2/cmd/gosec" - _ "github.com/segmentio/golines" _ "github.com/vektra/mockery/v2" ) diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go new file mode 100644 index 0000000000..008ad571aa --- /dev/null +++ b/x/evm/types/tx.pb.go @@ -0,0 +1,608 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: polaris/evm/v1alpha1/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/msgservice" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Status represents the status of a transaction. +type Status int32 + +const ( + // STATUS_REVERT_UNSPECIFIED indicates that the transaction reverted. + Status_STATUS_REVERT_UNSPECIFIED Status = 0 + // STATUS_SUCCESS indicates that the transaction completed successfully. + Status_STATUS_SUCCESS Status = 1 + // STATUS_NOT_INCLUDED indicates that the transaction was not included in the + // `evm` block, due to an critical error. + Status_STATUS_NOT_INCLUDED Status = 2 +) + +var Status_name = map[int32]string{ + 0: "STATUS_REVERT_UNSPECIFIED", + 1: "STATUS_SUCCESS", + 2: "STATUS_NOT_INCLUDED", +} + +var Status_value = map[string]int32{ + "STATUS_REVERT_UNSPECIFIED": 0, + "STATUS_SUCCESS": 1, + "STATUS_NOT_INCLUDED": 2, +} + +func (x Status) String() string { + return proto.EnumName(Status_name, int32(x)) +} + +func (Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d8b33d2a2c64400f, []int{0} +} + +// WrappedEthereumTransaction encapsulates an Ethereum transaction as an SDK message. +type WrappedEthereumTransaction struct { + // data is inner transaction data of the Ethereum transaction. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *WrappedEthereumTransaction) Reset() { *m = WrappedEthereumTransaction{} } +func (m *WrappedEthereumTransaction) String() string { return proto.CompactTextString(m) } +func (*WrappedEthereumTransaction) ProtoMessage() {} +func (*WrappedEthereumTransaction) Descriptor() ([]byte, []int) { + return fileDescriptor_d8b33d2a2c64400f, []int{0} +} +func (m *WrappedEthereumTransaction) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WrappedEthereumTransaction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WrappedEthereumTransaction.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *WrappedEthereumTransaction) XXX_Merge(src proto.Message) { + xxx_messageInfo_WrappedEthereumTransaction.Merge(m, src) +} +func (m *WrappedEthereumTransaction) XXX_Size() int { + return m.Size() +} +func (m *WrappedEthereumTransaction) XXX_DiscardUnknown() { + xxx_messageInfo_WrappedEthereumTransaction.DiscardUnknown(m) +} + +var xxx_messageInfo_WrappedEthereumTransaction proto.InternalMessageInfo + +func (m *WrappedEthereumTransaction) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// WrappedEthereumTransactionResult defines the Msg/EthereumTx response type. +type WrappedEthereumTransactionResult struct { + // `status` represents a transaction's status + Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=polaris.evm.v1alpha1.Status" json:"status,omitempty"` +} + +func (m *WrappedEthereumTransactionResult) Reset() { *m = WrappedEthereumTransactionResult{} } +func (m *WrappedEthereumTransactionResult) String() string { return proto.CompactTextString(m) } +func (*WrappedEthereumTransactionResult) ProtoMessage() {} +func (*WrappedEthereumTransactionResult) Descriptor() ([]byte, []int) { + return fileDescriptor_d8b33d2a2c64400f, []int{1} +} +func (m *WrappedEthereumTransactionResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WrappedEthereumTransactionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WrappedEthereumTransactionResult.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *WrappedEthereumTransactionResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_WrappedEthereumTransactionResult.Merge(m, src) +} +func (m *WrappedEthereumTransactionResult) XXX_Size() int { + return m.Size() +} +func (m *WrappedEthereumTransactionResult) XXX_DiscardUnknown() { + xxx_messageInfo_WrappedEthereumTransactionResult.DiscardUnknown(m) +} + +var xxx_messageInfo_WrappedEthereumTransactionResult proto.InternalMessageInfo + +func (m *WrappedEthereumTransactionResult) GetStatus() Status { + if m != nil { + return m.Status + } + return Status_STATUS_REVERT_UNSPECIFIED +} + +func init() { + proto.RegisterEnum("polaris.evm.v1alpha1.Status", Status_name, Status_value) + proto.RegisterType((*WrappedEthereumTransaction)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransaction") + proto.RegisterType((*WrappedEthereumTransactionResult)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransactionResult") +} + +func init() { proto.RegisterFile("polaris/evm/v1alpha1/tx.proto", fileDescriptor_d8b33d2a2c64400f) } + +var fileDescriptor_d8b33d2a2c64400f = []byte{ + // 351 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0xc8, 0xcf, 0x49, + 0x2c, 0xca, 0x2c, 0xd6, 0x4f, 0x2d, 0xcb, 0xd5, 0x2f, 0x33, 0x4c, 0xcc, 0x29, 0xc8, 0x48, 0x34, + 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0x4a, 0xeb, 0xa5, 0x96, + 0xe5, 0xea, 0xc1, 0xa4, 0xa5, 0xc4, 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, + 0xf5, 0xcb, 0x0c, 0x41, 0x14, 0x44, 0xb9, 0x92, 0x01, 0x97, 0x54, 0x78, 0x51, 0x62, 0x41, 0x41, + 0x6a, 0x8a, 0x6b, 0x49, 0x46, 0x6a, 0x51, 0x6a, 0x69, 0x6e, 0x48, 0x51, 0x62, 0x5e, 0x71, 0x62, + 0x72, 0x49, 0x66, 0x7e, 0x9e, 0x90, 0x10, 0x17, 0x4b, 0x4a, 0x62, 0x49, 0xa2, 0x04, 0xa3, 0x02, + 0xa3, 0x06, 0x4f, 0x10, 0x98, 0xad, 0x14, 0xc1, 0xa5, 0x80, 0x5b, 0x47, 0x50, 0x6a, 0x71, 0x69, + 0x4e, 0x89, 0x90, 0x09, 0x17, 0x5b, 0x71, 0x49, 0x62, 0x49, 0x69, 0x31, 0x58, 0x27, 0x9f, 0x91, + 0x8c, 0x1e, 0x36, 0x57, 0xe9, 0x05, 0x83, 0xd5, 0x04, 0x41, 0xd5, 0x6a, 0x85, 0x70, 0xb1, 0x41, + 0x44, 0x84, 0x64, 0xb9, 0x24, 0x83, 0x43, 0x1c, 0x43, 0x42, 0x83, 0xe3, 0x83, 0x5c, 0xc3, 0x5c, + 0x83, 0x42, 0xe2, 0x43, 0xfd, 0x82, 0x03, 0x5c, 0x9d, 0x3d, 0xdd, 0x3c, 0x5d, 0x5d, 0x04, 0x18, + 0x84, 0x84, 0xb8, 0xf8, 0xa0, 0xd2, 0xc1, 0xa1, 0xce, 0xce, 0xae, 0xc1, 0xc1, 0x02, 0x8c, 0x42, + 0xe2, 0x5c, 0xc2, 0x50, 0x31, 0x3f, 0xff, 0x90, 0x78, 0x4f, 0x3f, 0x67, 0x9f, 0x50, 0x17, 0x57, + 0x17, 0x01, 0x26, 0xa3, 0x7e, 0x46, 0x2e, 0x2e, 0xdf, 0xe2, 0xf4, 0xe0, 0xd4, 0xa2, 0xb2, 0xcc, + 0xe4, 0x54, 0xa1, 0x2a, 0x2e, 0x3e, 0xd7, 0x92, 0x0c, 0x64, 0x4f, 0x1a, 0x60, 0x77, 0x1c, 0x6e, + 0x4f, 0x4a, 0x99, 0x91, 0xaa, 0x03, 0x12, 0x2c, 0x52, 0xac, 0x0d, 0xcf, 0x37, 0x68, 0x31, 0x3a, + 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, + 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x41, 0x76, 0xba, + 0x5e, 0x52, 0x6a, 0x51, 0x62, 0x72, 0x46, 0x62, 0x66, 0x9e, 0x5e, 0x4a, 0x6a, 0x99, 0x3e, 0x2c, + 0xb6, 0xa1, 0x11, 0x58, 0x01, 0x8e, 0xf6, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0x70, 0x14, + 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x62, 0x15, 0x3f, 0x12, 0x12, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgServiceClient is the client API for MsgService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgServiceClient interface { + // EthTransaction defines a method submitting Ethereum transactions. + EthTransaction(ctx context.Context, in *WrappedEthereumTransaction, opts ...grpc.CallOption) (*WrappedEthereumTransactionResult, error) +} + +type msgServiceClient struct { + cc grpc1.ClientConn +} + +func NewMsgServiceClient(cc grpc1.ClientConn) MsgServiceClient { + return &msgServiceClient{cc} +} + +func (c *msgServiceClient) EthTransaction(ctx context.Context, in *WrappedEthereumTransaction, opts ...grpc.CallOption) (*WrappedEthereumTransactionResult, error) { + out := new(WrappedEthereumTransactionResult) + err := c.cc.Invoke(ctx, "/polaris.evm.v1alpha1.MsgService/EthTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServiceServer is the server API for MsgService service. +type MsgServiceServer interface { + // EthTransaction defines a method submitting Ethereum transactions. + EthTransaction(context.Context, *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) +} + +// UnimplementedMsgServiceServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServiceServer struct { +} + +func (*UnimplementedMsgServiceServer) EthTransaction(ctx context.Context, req *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) { + return nil, status.Errorf(codes.Unimplemented, "method EthTransaction not implemented") +} + +func RegisterMsgServiceServer(s grpc1.Server, srv MsgServiceServer) { + s.RegisterService(&_MsgService_serviceDesc, srv) +} + +func _MsgService_EthTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WrappedEthereumTransaction) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServiceServer).EthTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/polaris.evm.v1alpha1.MsgService/EthTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServiceServer).EthTransaction(ctx, req.(*WrappedEthereumTransaction)) + } + return interceptor(ctx, in, info, handler) +} + +var _MsgService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "polaris.evm.v1alpha1.MsgService", + HandlerType: (*MsgServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EthTransaction", + Handler: _MsgService_EthTransaction_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "polaris/evm/v1alpha1/tx.proto", +} + +func (m *WrappedEthereumTransaction) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WrappedEthereumTransaction) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WrappedEthereumTransaction) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WrappedEthereumTransactionResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WrappedEthereumTransactionResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WrappedEthereumTransactionResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Status != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *WrappedEthereumTransaction) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *WrappedEthereumTransactionResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovTx(uint64(m.Status)) + } + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *WrappedEthereumTransaction) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WrappedEthereumTransaction: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WrappedEthereumTransaction: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WrappedEthereumTransactionResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WrappedEthereumTransactionResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WrappedEthereumTransactionResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= Status(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) From 92ace9960b67582c3dc436e10f73fd4960b41c0d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sat, 7 Oct 2023 19:32:26 -0400 Subject: [PATCH 072/122] chore(deps): go mod tidy sync --- e2e/testapp/go.mod | 2 +- e2e/testapp/go.sum | 1327 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1326 insertions(+), 3 deletions(-) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 2205fc6c96..9694066580 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -15,7 +15,7 @@ require ( cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d - pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd + pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65 pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 50360a259f..dea9080586 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -276,276 +276,1599 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= +github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= +github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= +github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= +github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= +github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= +github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= +github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= +github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= +github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= +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/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= +github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= +github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= +github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= +github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= +github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= +github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +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= github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= +github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= +github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= +github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= +github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= +github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= +github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/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.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= +github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= +github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/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/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= +github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= +github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +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= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +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= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +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= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= +golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +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= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= +google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd h1:TZSUZb9hGRwhYLFGuU5+vxyPzuNnjLWWST7Gv03Se84= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65 h1:pxqHh3Ifn4csuTfoc6pSieQLXMHBkFStSROwY3fElXA= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65/go.mod h1:pdtZOZgwQTMcs04WLEWVrsg/Y0SVAqCZftIQ6cWVkgo= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 4a587ed1be7f655be41503ad853136f2cf3e8c43 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sat, 7 Oct 2023 19:57:02 -0400 Subject: [PATCH 073/122] chore(fmt): formatting --- contracts/scripts/DeployAndCallERC20.sol | 1 + .../querying-json-rpc.mdx | 2 + eth/accounts/hd.go | 23 +++--------- eth/accounts/imported.go | 37 ------------------- 4 files changed, 8 insertions(+), 55 deletions(-) delete mode 100644 eth/accounts/imported.go diff --git a/contracts/scripts/DeployAndCallERC20.sol b/contracts/scripts/DeployAndCallERC20.sol index b5a4200158..8ebc5109da 100644 --- a/contracts/scripts/DeployAndCallERC20.sol +++ b/contracts/scripts/DeployAndCallERC20.sol @@ -37,6 +37,7 @@ contract DeployAndCallERC20 is Script { SolmateERC20 drop = new SolmateERC20(); for (uint256 i = 0; i < 66; i++) { + quantity += 50000; drop.mint(dropAddress, quantity); } diff --git a/docs/web/pages/docs/interacting-with-node/querying-json-rpc.mdx b/docs/web/pages/docs/interacting-with-node/querying-json-rpc.mdx index badcabfcdd..338c208cd7 100644 --- a/docs/web/pages/docs/interacting-with-node/querying-json-rpc.mdx +++ b/docs/web/pages/docs/interacting-with-node/querying-json-rpc.mdx @@ -5,6 +5,7 @@ For information about Polaris Ethereum's JSON-RPC specification please see the [ ## Querying via JSON-RPC with `ethers.js` ### Requirements + - [Node.js](https://nodejs.org/en/download/) (v8.9.4 or higher) - [ethers.js](https://github.com/ethers-io/ethers.js/)(v4.0.0 or higher) @@ -25,6 +26,7 @@ const blockNumber = await provider.getBlockNumber(); ## Querying via JSON-RPC with `geth` ### Requirements + - [Golang](https://golang.org/doc/install) (v1.13 or higher) - [Geth](https://geth.ethereum.org/downloads/) (v1.9.7 or higher) diff --git a/eth/accounts/hd.go b/eth/accounts/hd.go index c2fb26c18c..df3f29f1cf 100644 --- a/eth/accounts/hd.go +++ b/eth/accounts/hd.go @@ -20,27 +20,14 @@ package accounts +import ( + "github.com/ethereum/go-ethereum/accounts" +) + var ( // Bip44CoinType was defined by EIP-84 (https://github.com/ethereum/EIPs/issues/84). Bip44CoinType uint32 = 60 - // EtherDecimals is the number of decimal places in an Ether. - EtherDecimals int64 = 18 - // BIP44HDPath is the default BIP44 HD path used on Ethereum. - BIP44HDPath = DefaultBaseDerivationPath.String() + BIP44HDPath = accounts.DefaultBaseDerivationPath.String() ) - -// HDPathIterator creates a generic iterator for a given base path. -func NewHDPathIterator(basePath string, ledgerIter bool) (HDPathIterator, error) { - hdPath, err := ParseDerivationPath(basePath) - if err != nil { - return nil, err - } - - if ledgerIter { - return LedgerLiveIterator(hdPath), nil - } - - return DefaultIterator(hdPath), nil -} diff --git a/eth/accounts/imported.go b/eth/accounts/imported.go deleted file mode 100644 index e80c0ab776..0000000000 --- a/eth/accounts/imported.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package accounts - -import ( - "github.com/ethereum/go-ethereum/accounts" -) - -type ( - DerivationPath = accounts.DerivationPath - HDPathIterator = func() DerivationPath -) - -var ( - DefaultBaseDerivationPath = accounts.DefaultBaseDerivationPath - DefaultIterator = accounts.DefaultIterator - LedgerLiveIterator = accounts.LedgerLiveIterator - ParseDerivationPath = accounts.ParseDerivationPath -) From 374db5acc4279a75c1cbf098987a1da0264d6f0c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sat, 7 Oct 2023 22:27:32 -0400 Subject: [PATCH 074/122] refactor(hive): Remove hardcoded config files. (#1192) --- e2e/hive/clients/polard/Dockerfile | 9 +- e2e/hive/clients/polard/config/config.toml | 477 ------------------ .../polard/{hive-init.sh => entrypoint.sh} | 107 ++-- e2e/localnet/container/container.go | 1 + eth/polar/polaris.go | 6 +- 5 files changed, 48 insertions(+), 552 deletions(-) delete mode 100644 e2e/hive/clients/polard/config/config.toml rename e2e/hive/clients/polard/{hive-init.sh => entrypoint.sh} (67%) diff --git a/e2e/hive/clients/polard/Dockerfile b/e2e/hive/clients/polard/Dockerfile index a275b1b669..1d679dffa9 100644 --- a/e2e/hive/clients/polard/Dockerfile +++ b/e2e/hive/clients/polard/Dockerfile @@ -22,14 +22,9 @@ WORKDIR / # Add a default genesis file + Inject the startup script ADD version.txt /version.txt -ADD hive-init.sh /hive-init.sh - -ADD config/config.toml config/config.toml - -RUN export HIVE_CHAIN_ID=2061 -RUN export HIVE_NETWORK_ID=2061 +ADD entrypoint.sh /entrypoint.sh # Export the usual networking ports to allow outside access to the node EXPOSE 8545 8546 8547 8551 -CMD ["bash", "hive-init.sh"] +CMD ["bash", "entrypoint.sh"] diff --git a/e2e/hive/clients/polard/config/config.toml b/e2e/hive/clients/polard/config/config.toml deleted file mode 100644 index e31ceeef26..0000000000 --- a/e2e/hive/clients/polard/config/config.toml +++ /dev/null @@ -1,477 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or -# relative to the home directory (e.g. "data"). The home directory is -# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable -# or --home cmd flag. - -####################################################################### -### Main Base Config Options ### -####################################################################### - -# TCP or UNIX socket address of the ABCI application, -# or the name of an ABCI application compiled in with the CometBFT binary -proxy_app = "tcp://0.0.0.0:26658" - -# A custom human readable name for this node -moniker = "localtestnet" - -# If this node is many blocks behind the tip of the chain, BlockSync -# allows them to catchup quickly by downloading blocks in parallel -# and verifying their commits -# -# Deprecated: this key will be removed and BlockSync will be enabled -# unconditionally in the next major release. -block_sync = true - -# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb -# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) -# - pure go -# - stable -# * cleveldb (uses levigo wrapper) -# - fast -# - requires gcc -# - use cleveldb build tag (go build -tags cleveldb) -# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) -# - EXPERIMENTAL -# - may be faster is some use-cases (random reads - indexer) -# - use boltdb build tag (go build -tags boltdb) -# * rocksdb (uses github.com/tecbot/gorocksdb) -# - EXPERIMENTAL -# - requires gcc -# - use rocksdb build tag (go build -tags rocksdb) -# * badgerdb (uses github.com/dgraph-io/badger) -# - EXPERIMENTAL -# - use badgerdb build tag (go build -tags badgerdb) -db_backend = "goleveldb" - -# Database directory -db_dir = "data" - -# Output level for logging, including package level options -log_level = "info" - -# Output format: 'plain' (colored text) or 'json' -log_format = "plain" - -##### additional base config options ##### - -# Path to the JSON file containing the initial validator set and other meta data -genesis_file = "config/genesis.json" - -# Path to the JSON file containing the private key to use as a validator in the consensus protocol -priv_validator_key_file = "config/priv_validator_key.json" - -# Path to the JSON file containing the last sign state of a validator -priv_validator_state_file = "data/priv_validator_state.json" - -# TCP or UNIX socket address for CometBFT to listen on for -# connections from an external PrivValidator process -priv_validator_laddr = "" - -# Path to the JSON file containing the private key to use for node authentication in the p2p protocol -node_key_file = "config/node_key.json" - -# Mechanism to connect to the ABCI application: socket | grpc -abci = "socket" - -# If true, query the ABCI app on connecting to a new peer -# so the app can decide if we should keep the connection or not -filter_peers = false - - -####################################################################### -### Advanced Configuration Options ### -####################################################################### - -####################################################### -### RPC Server Configuration Options ### -####################################################### -[rpc] - -# TCP or UNIX socket address for the RPC server to listen on -laddr = "tcp://0.0.0.0:26657" - -# A list of origins a cross-domain request can be executed from -# Default value '[]' disables cors support -# Use '["*"]' to allow any origin -cors_allowed_origins = [] - -# A list of methods the client is allowed to use with cross-domain requests -cors_allowed_methods = ["HEAD", "GET", "POST"] - -# A list of non simple headers the client is allowed to use with cross-domain requests -cors_allowed_headers = [ - "Origin", - "Accept", - "Content-Type", - "X-Requested-With", - "X-Server-Time", -] - -# TCP or UNIX socket address for the gRPC server to listen on -# NOTE: This server only supports /broadcast_tx_commit -grpc_laddr = "" - -# Maximum number of simultaneous connections. -# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -grpc_max_open_connections = 900 - -# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool -unsafe = false - -# Maximum number of simultaneous connections (including WebSocket). -# Does not include gRPC connections. See grpc_max_open_connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -max_open_connections = 900 - -# Maximum number of unique clientIDs that can /subscribe -# If you're using /broadcast_tx_commit, set to the estimated maximum number -# of broadcast_tx_commit calls per block. -max_subscription_clients = 100 - -# Maximum number of unique queries a given client can /subscribe to -# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to -# the estimated # maximum number of broadcast_tx_commit calls per block. -max_subscriptions_per_client = 5 - -# Experimental parameter to specify the maximum number of events a node will -# buffer, per subscription, before returning an error and closing the -# subscription. Must be set to at least 100, but higher values will accommodate -# higher event throughput rates (and will use more memory). -experimental_subscription_buffer_size = 200 - -# Experimental parameter to specify the maximum number of RPC responses that -# can be buffered per WebSocket client. If clients cannot read from the -# WebSocket endpoint fast enough, they will be disconnected, so increasing this -# parameter may reduce the chances of them being disconnected (but will cause -# the node to use more memory). -# -# Must be at least the same as "experimental_subscription_buffer_size", -# otherwise connections could be dropped unnecessarily. This value should -# ideally be somewhat higher than "experimental_subscription_buffer_size" to -# accommodate non-subscription-related RPC responses. -experimental_websocket_write_buffer_size = 200 - -# If a WebSocket client cannot read fast enough, at present we may -# silently drop events instead of generating an error or disconnecting the -# client. -# -# Enabling this experimental parameter will cause the WebSocket connection to -# be closed instead if it cannot read fast enough, allowing for greater -# predictability in subscription behavior. -experimental_close_on_slow_client = false - -# How long to wait for a tx to be committed during /broadcast_tx_commit. -# WARNING: Using a value larger than 10s will result in increasing the -# global HTTP write timeout, which applies to all connections and endpoints. -# See https://github.com/tendermint/tendermint/issues/3435 -timeout_broadcast_tx_commit = "15s" - -# Maximum size of request body, in bytes -max_body_bytes = 1000000 - -# Maximum size of request header, in bytes -max_header_bytes = 1048576 - -# The path to a file containing certificate that is used to create the HTTPS server. -# Might be either absolute path or path related to CometBFT's config directory. -# If the certificate is signed by a certificate authority, -# the certFile should be the concatenation of the server's certificate, any intermediates, -# and the CA's certificate. -# NOTE: both tls_cert_file and tls_key_file must be present for CometBFT to create HTTPS server. -# Otherwise, HTTP server is run. -tls_cert_file = "" - -# The path to a file containing matching private key that is used to create the HTTPS server. -# Might be either absolute path or path related to CometBFT's config directory. -# NOTE: both tls-cert-file and tls-key-file must be present for CometBFT to create HTTPS server. -# Otherwise, HTTP server is run. -tls_key_file = "" - -# pprof listen address (https://golang.org/pkg/net/http/pprof) -pprof_laddr = "0.0.0.0:6060" - -####################################################### -### P2P Configuration Options ### -####################################################### -[p2p] - -# Address to listen for incoming connections -laddr = "tcp://0.0.0.0:26656" - -# Address to advertise to peers for them to dial -# If empty, will use the same port as the laddr, -# and will introspect on the listener or use UPnP -# to figure out the address. ip and port are required -# example: 159.89.10.97:26656 -external_address = "" - -# Comma separated list of seed nodes to connect to -seeds = "" - -# Comma separated list of nodes to keep persistent connections to -persistent_peers = "" - -# UPNP port forwarding -upnp = false - -# Path to address book -addr_book_file = "config/addrbook.json" - -# Set true for strict address routability rules -# Set false for private or local networks -addr_book_strict = true - -# Maximum number of inbound peers -max_num_inbound_peers = 40 - -# Maximum number of outbound peers to connect to, excluding persistent peers -max_num_outbound_peers = 10 - -# List of node IDs, to which a connection will be (re)established ignoring any existing limits -unconditional_peer_ids = "" - -# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) -persistent_peers_max_dial_period = "0s" - -# Time to wait before flushing messages out on the connection -flush_throttle_timeout = "100ms" - -# Maximum size of a message packet payload, in bytes -max_packet_msg_payload_size = 1024 - -# Rate at which packets can be sent, in bytes/second -send_rate = 5120000 - -# Rate at which packets can be received, in bytes/second -recv_rate = 5120000 - -# Set true to enable the peer-exchange reactor -pex = true - -# Seed mode, in which node constantly crawls the network and looks for -# peers. If another node asks it for addresses, it responds and disconnects. -# -# Does not work if the peer-exchange reactor is disabled. -seed_mode = false - -# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) -private_peer_ids = "" - -# Toggle to disable guard against peers connecting from the same ip. -allow_duplicate_ip = false - -# Peer connection configuration. -handshake_timeout = "20s" -dial_timeout = "3s" - -####################################################### -### Mempool Configuration Option ### -####################################################### -[mempool] - -# Mempool version to use: -# 1) "v0" - (default) FIFO mempool. -# 2) "v1" - prioritized mempool (deprecated; will be removed in the next release). -version = "v0" - -recheck = true -broadcast = true -wal_dir = "" - -# Maximum number of transactions in the mempool -size = 5000 - -# Limit the total size of all txs in the mempool. -# This only accounts for raw transactions (e.g. given 1MB transactions and -# max_txs_bytes=5MB, mempool will only accept 5 transactions). -max_txs_bytes = 1073741824 - -# Size of the cache (used to filter transactions we saw earlier) in transactions -cache_size = 10000 - -# Do not remove invalid transactions from the cache (default: false) -# Set to true if it's not possible for any invalid transaction to become valid -# again in the future. -keep-invalid-txs-in-cache = false - -# Maximum size of a single transaction. -# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. -max_tx_bytes = 1048576 - -# Maximum size of a batch of transactions to send to a peer -# Including space needed by encoding (one varint per transaction). -# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 -max_batch_bytes = 0 - -# ttl-duration, if non-zero, defines the maximum amount of time a transaction -# can exist for in the mempool. -# -# Note, if ttl-num-blocks is also defined, a transaction will be removed if it -# has existed in the mempool at least ttl-num-blocks number of blocks or if it's -# insertion time into the mempool is beyond ttl-duration. -ttl-duration = "0s" - -# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction -# can exist for in the mempool. -# -# Note, if ttl-duration is also defined, a transaction will be removed if it -# has existed in the mempool at least ttl-num-blocks number of blocks or if -# it's insertion time into the mempool is beyond ttl-duration. -ttl-num-blocks = 0 - -####################################################### -### State Sync Configuration Options ### -####################################################### -[statesync] -# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine -# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in -# the network to take and serve state machine snapshots. State sync is not attempted if the node -# has any local state (LastBlockHeight > 0). The node will have a truncated block history, -# starting from the height of the snapshot. -enable = false - -# RPC servers (comma-separated) for light client verification of the synced state machine and -# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding -# header hash obtained from a trusted source, and a period during which validators can be trusted. -# -# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 -# weeks) during which they can be financially punished (slashed) for misbehavior. -rpc_servers = "" -trust_height = 0 -trust_hash = "" -trust_period = "168h0m0s" - -# Time to spend discovering snapshots before initiating a restore. -discovery_time = "15s" - -# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). -# Will create a new, randomly named directory within, and remove it when done. -temp_dir = "" - -# The timeout duration before re-requesting a chunk, possibly from a different -# peer (default: 1 minute). -chunk_request_timeout = "10s" - -# The number of concurrent chunk fetchers to run (default: 1). -chunk_fetchers = "4" - -####################################################### -### Block Sync Configuration Options ### -####################################################### -[blocksync] - -# Block Sync version to use: -# -# In v0.37, v1 and v2 of the block sync protocols were deprecated. -# Please use v0 instead. -# -# 1) "v0" - the default block sync implementation -version = "v0" - -####################################################### -### Consensus Configuration Options ### -####################################################### -[consensus] - -wal_file = "data/cs.wal/wal" - -# How long we wait for a proposal block before prevoting nil -timeout_propose = "1s" -# How much timeout_propose increases with each round -timeout_propose_delta = "1s" -# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) -timeout_prevote = "1s" -# How much the timeout_prevote increases with each round -timeout_prevote_delta = "1s" -# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) -timeout_precommit = "1s" -# How much the timeout_precommit increases with each round -timeout_precommit_delta = "1s" -# How long we wait after committing a block, before starting on the new -# height (this gives us a chance to receive some more precommits, even -# though we already have +2/3). -timeout_commit = "1s" - -# How many blocks to look back to check existence of the node's consensus votes before joining consensus -# When non-zero, the node will panic upon restart -# if the same consensus key was used to sign {double_sign_check_height} last blocks. -# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. -double_sign_check_height = 0 - -# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) -skip_timeout_commit = false - -# EmptyBlocks mode and possible interval between empty blocks -create_empty_blocks = true -create_empty_blocks_interval = "0s" - -# Reactor sleep duration parameters -peer_gossip_sleep_duration = "100ms" -peer_query_maj23_sleep_duration = "2s" - -####################################################### -### Storage Configuration Options ### -####################################################### -[storage] - -# Set to true to discard ABCI responses from the state store, which can save a -# considerable amount of disk space. Set to false to ensure ABCI responses are -# persisted. ABCI responses are required for /block_results RPC queries, and to -# reindex events in the command-line tool. -discard_abci_responses = false - -####################################################### -### Transaction Indexer Configuration Options ### -####################################################### -[tx_index] - -# What indexer to use for transactions -# -# The application will set which txs to index. In some cases a node operator will be able -# to decide which txs to index based on configuration set in the application. -# -# Options: -# 1) "null" -# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). -# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. -# 3) "psql" - the indexer services backed by PostgreSQL. -# When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. -indexer = "kv" - -# The PostgreSQL connection configuration, the connection format: -# postgresql://:@:/? -psql-conn = "" - -####################################################### -### Instrumentation Configuration Options ### -####################################################### -[instrumentation] - -# When true, Prometheus metrics are served under /metrics on -# PrometheusListenAddr. -# Check out the documentation for the list of available metrics. -prometheus = false - -# Address to listen for Prometheus collector(s) connections -prometheus_listen_addr = ":26660" - -# Maximum number of simultaneous connections. -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -max_open_connections = 3 - -# Instrumentation namespace -namespace = "cometbft" diff --git a/e2e/hive/clients/polard/hive-init.sh b/e2e/hive/clients/polard/entrypoint.sh similarity index 67% rename from e2e/hive/clients/polard/hive-init.sh rename to e2e/hive/clients/polard/entrypoint.sh index 4dc5dcd0d9..a1a782eb87 100644 --- a/e2e/hive/clients/polard/hive-init.sh +++ b/e2e/hive/clients/polard/entrypoint.sh @@ -19,39 +19,27 @@ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND # TITLE. +# Constants KEYS[0]="dev0" -KEYS[1]="dev1" -KEYS[2]="dev2" CHAINID="polaris-2061" MONIKER="localtestnet" -# Remember to change to other types of keyring like 'file' in-case exposing to outside world, -# otherwise your balance will be wiped quickly -# The keyring test does not require private key to steal tokens from you KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance HOMEDIR="/" -# to trace evm -#TRACE="--trace" -TRACE="" - -# Path variables +ETH_GENESIS_JSON="genesis.json" +ETH_GENESIS_SOURCE=$(cat genesis.json) CONFIG_TOML=$HOMEDIR/config/config.toml APP_TOML=$HOMEDIR/config/app.toml GENESIS=$HOMEDIR/config/genesis.json TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json -# used to exit on first error (any non-zero exit code) +# Used to exit on first error (any non-zero exit code) set -e -# Reinstall daemon -# make build - -# Remove the previous folder - # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" + # Set client config polard config set client keyring-backend $KEYRING --home "$HOMEDIR" polard config set client chain-id "$CHAINID" --home "$HOMEDIR" @@ -61,19 +49,11 @@ for KEY in "${KEYS[@]}"; do polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" done -ETH_GENESIS_SOURCE=$(cat genesis.json) -JSON_FILE="genesis.json" +# Update cosmos genesis.json by copying the ethereum genesis.json into the cosmos genesis. temp_genesis=$(cat $GENESIS) -echo "eth_gen dump: " -echo $ETH_GENESIS_SOURCE - - -# # # Change eth_genesis in config/genesis.json -# # # TODO FIX TO SETUP APP.TOML STUFF updated_genesis=$(echo "$temp_genesis" | jq --argjson eth_gen "$ETH_GENESIS_SOURCE" '.app_state["evm"] = $eth_gen') echo "$updated_genesis" > "$GENESIS" -# echo "UPDATED FILE" # Change parameter token denominations to abera jq '.app_state["staking"]["params"]["bond_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" @@ -82,10 +62,6 @@ jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="abera"' "$GE jq '.app_state["mint"]["params"]["mint_denom"]="abera"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" jq '.consensus["params"]["block"]["max_gas"]="30000000"' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" -# Dump genesis -# echo "genesis state:" -# cat $GENESIS - # Allocate genesis accounts (cosmos formatted addresses) for KEY in "${KEYS[@]}"; do polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" @@ -93,12 +69,6 @@ done # Sign genesis transaction polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" -## In case you want to create multiple validators at genesis -## 1. Back to `./bin/polard keys add` step, init more keys -## 2. Back to `./bin/polard add-genesis-account` step, add balance for those -## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` -## 4. Run `gentx` in each of those folders -## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` # Collect genesis tx polard genesis collect-gentxs --home "$HOMEDIR" @@ -106,31 +76,27 @@ polard genesis collect-gentxs --home "$HOMEDIR" # Run this to ensure everything worked and that the genesis file is setup correctly polard genesis validate-genesis --home "$HOMEDIR" -if [[ $1 == "pending" ]]; then - echo "pending mode is on, please wait for the first block committed." -fi - -# Read values from JSON -CHAIN_ID=$(jq '.config.chainId' $JSON_FILE) -HOMESTEAD_BLOCK=$(jq '.config.homesteadBlock' $JSON_FILE) -DAO_FORK_BLOCK=$(jq '.config.daoForkBlock' $JSON_FILE) -DAO_FORK_SUPPORT=$(jq '.config.daoForkSupport' $JSON_FILE) -EIP150_BLOCK=$(jq '.config.eip150Block' $JSON_FILE) -EIP155_BLOCK=$(jq '.config.eip155Block' $JSON_FILE) -EIP158_BLOCK=$(jq '.config.eip158Block' $JSON_FILE) -BYZANTIUM_BLOCK=$(jq '.config.byzantiumBlock' $JSON_FILE) -CONSTANTINOPLE_BLOCK=$(jq '.config.constantinopleBlock' $JSON_FILE) -PETERSBURG_BLOCK=$(jq '.config.petersburgBlock' $JSON_FILE) -ISTANBUL_BLOCK=$(jq '.config.istanbulBlock' $JSON_FILE) -BERLIN_BLOCK=$(jq '.config.berlinBlock' $JSON_FILE) -LONDON_BLOCK=$(jq '.config.londonBlock' $JSON_FILE) -MUIR_GLACIER_BLOCK=$(jq '.config.muirGlacierBlock' $JSON_FILE) -ARROW_GLACIER_BLOCK=$(jq '.config.arrowGlacierBlock' $JSON_FILE) -GRAY_GLACIER_BLOCK=$(jq '.config.grayGlacierBlock' $JSON_FILE) -MERGE_NETSPLIT_BLOCK=$(jq '.config.mergeNetsplitBlock' $JSON_FILE) -SHANGHAI_TIME=$(jq '.config.shanghaiTime' $JSON_FILE) -TERMINAL_TOTAL_DIFFICULTY=$(jq '.config.terminalTotalDifficulty' $JSON_FILE) -TERMINAL_TOTAL_DIFFICULTY_PASSED=$(jq '.config.terminalTotalDifficultyPassed' $JSON_FILE) +# Update app.toml with the correct ethereum chain config stuff. +CHAIN_ID=$(jq '.config.chainId' $ETH_GENESIS_JSON) +HOMESTEAD_BLOCK=$(jq '.config.homesteadBlock' $ETH_GENESIS_JSON) +DAO_FORK_BLOCK=$(jq '.config.daoForkBlock' $ETH_GENESIS_JSON) +DAO_FORK_SUPPORT=$(jq '.config.daoForkSupport' $ETH_GENESIS_JSON) +EIP150_BLOCK=$(jq '.config.eip150Block' $ETH_GENESIS_JSON) +EIP155_BLOCK=$(jq '.config.eip155Block' $ETH_GENESIS_JSON) +EIP158_BLOCK=$(jq '.config.eip158Block' $ETH_GENESIS_JSON) +BYZANTIUM_BLOCK=$(jq '.config.byzantiumBlock' $ETH_GENESIS_JSON) +CONSTANTINOPLE_BLOCK=$(jq '.config.constantinopleBlock' $ETH_GENESIS_JSON) +PETERSBURG_BLOCK=$(jq '.config.petersburgBlock' $ETH_GENESIS_JSON) +ISTANBUL_BLOCK=$(jq '.config.istanbulBlock' $ETH_GENESIS_JSON) +BERLIN_BLOCK=$(jq '.config.berlinBlock' $ETH_GENESIS_JSON) +LONDON_BLOCK=$(jq '.config.londonBlock' $ETH_GENESIS_JSON) +MUIR_GLACIER_BLOCK=$(jq '.config.muirGlacierBlock' $ETH_GENESIS_JSON) +ARROW_GLACIER_BLOCK=$(jq '.config.arrowGlacierBlock' $ETH_GENESIS_JSON) +GRAY_GLACIER_BLOCK=$(jq '.config.grayGlacierBlock' $ETH_GENESIS_JSON) +MERGE_NETSPLIT_BLOCK=$(jq '.config.mergeNetsplitBlock' $ETH_GENESIS_JSON) +SHANGHAI_TIME=$(jq '.config.shanghaiTime' $ETH_GENESIS_JSON) +TERMINAL_TOTAL_DIFFICULTY=$(jq '.config.terminalTotalDifficulty' $ETH_GENESIS_JSON) +TERMINAL_TOTAL_DIFFICULTY_PASSED=$(jq '.config.terminalTotalDifficultyPassed' $ETH_GENESIS_JSON) # Update values in TOML using sed command for Linux with -i and empty string argument sed -i "s/chain-id = .*/chain-id = \"$CHAIN_ID\"/" $APP_TOML @@ -154,12 +120,19 @@ sed -i "s/shanghai-time = .*/shanghai-time = \"$SHANGHAI_TIME\"/" $APP_TOML sed -i "s/terminal-total-difficulty = .*/terminal-total-difficulty = \"$TERMINAL_TOTAL_DIFFICULTY\"/" $APP_TOML sed -i "s/terminal-total-difficulty-passed = .*/terminal-total-difficulty-passed = $TERMINAL_TOTAL_DIFFICULTY_PASSED/" $APP_TOML -# sed -i 's/"null"/null/g' $APP_TOML -# sed -i 's/"null"/null/g' $APP_TOML -# cat "POSTSED" -# cat $APP_TOML -cat $APP_TOML -echo "BINGBONG" + +# Adjust timeouts for CometBFT: +# TODO: these values are sensitive due to a race condition in the json-rpc ports opening. +# If the JSON-RPC opens before the first block is committed, hive tests will start failing. +# This needs to be fixed before mainnet as its ghetto af. +sed -i 's/timeout_propose = "3s"/timeout_propose = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_prevote = "1s"/timeout_prevote = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_precommit = "1s"/timeout_precommit = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_commit = "5s"/timeout_commit = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "2s"/g' $CONFIG_TOML # Start the node (remove the --pruning=nothing flag if historical queries are not needed)m polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" \ No newline at end of file diff --git a/e2e/localnet/container/container.go b/e2e/localnet/container/container.go index d747f14052..26bae39e4e 100644 --- a/e2e/localnet/container/container.go +++ b/e2e/localnet/container/container.go @@ -48,6 +48,7 @@ type Client interface { // GetEndpoint returns the endpoint for the given id of the container. GetEndpoint(string) string + // GetContainerLogs retrieves the logs out of the container. GetContainerLogs() ([]byte, error) } diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go index 18fbb871d2..a588b10d72 100644 --- a/eth/polar/polaris.go +++ b/eth/polar/polaris.go @@ -193,7 +193,11 @@ func (pl *Polaris) StartServices() error { pl.filterSystem = utils.RegisterFilterAPI(pl.stack, pl.backend, &defaultEthConfig) go func() { - time.Sleep(3 * time.Second) //nolint:gomnd // TODO:fix, this is required for hive... + // TODO: these values are sensitive due to a race condition in the json-rpc ports opening. + // If the JSON-RPC opens before the first block is committed, hive tests will start failing. + // This needs to be fixed before mainnet as its ghetto af. If the block time is too long + // and this sleep is too short, it will cause hive tests to error out. + time.Sleep(5 * time.Second) //nolint:gomnd // as explained above. if err := pl.stack.Start(); err != nil { panic(err) } From b46210451939e5284ebec6b1ea106c8a58c82332 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sun, 8 Oct 2023 01:20:24 -0400 Subject: [PATCH 075/122] chore(deps): bump geth to `v1.13.2` (#1193) --- .../governance/governance_wrapper.abigen.go | 2 +- cosmos/go.mod | 2 +- cosmos/go.sum | 4 +- cosmos/x/evm/genesis_test.go | 22 +- cosmos/x/evm/keeper/keeper.go | 8 +- cosmos/x/evm/keeper/processor_test.go | 4 + cosmos/x/evm/plugins/state/plugin.go | 19 +- e2e/localnet/network/node.go | 3 +- e2e/precompile/polard/start-node.sh | 13 + e2e/testapp/app.go | 5 + e2e/testapp/go.mod | 2 +- e2e/testapp/go.sum | 4 +- eth/core/chain_resources.go | 2 +- eth/core/processor.go | 5 +- eth/core/processor_test.go | 66 +- eth/core/state/mock/state.go | 12 +- eth/core/state/statedb.go | 8 +- eth/core/types/transaction.go | 25 - eth/core/types/transaction_test.go | 90 -- eth/core/vm/mock/statedb.go | 20 - eth/core/vm/mock/statedb.mock.go | 918 ------------------ eth/go.mod | 2 +- eth/go.sum | 4 +- go.work.sum | 220 +---- 24 files changed, 95 insertions(+), 1365 deletions(-) delete mode 100644 eth/core/types/transaction_test.go diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index 472dc6db66..741f06ddbe 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -80,7 +80,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea2646970667358221220554dc2c37553bc0c3484f8e62c856c95748dbeda5dedd2502876b8010ddf6a2264736f6c63430008150033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea2646970667358221220306d2b017ebeaa83c1fae5293a08fd14264774f7f36721a01dc2fb8dd35515ac64736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/cosmos/go.mod b/cosmos/go.mod index c4a5f16e7f..ecaca6463a 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/cosmos/go.sum b/cosmos/go.sum index 2b195bfdc7..e55d14d582 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -112,8 +112,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index bc18b4d2c8..1c3a3ea4d9 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -35,6 +35,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" + "pkg.berachain.dev/polaris/cosmos/testing/types/mock" testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -65,6 +66,7 @@ var _ = Describe("", func() { BeforeEach(func() { ctx, ak, _, sk = testutil.SetupMinimalKeepers() + ctx = ctx.WithMultiStore(mock.NewMultiStore()) ctx = ctx.WithBlockHeight(0) sc = staking.NewPrecompileContract(ak, &sk) cfg := config.DefaultConfig() @@ -77,7 +79,11 @@ var _ = Describe("", func() { func() *ethprecompile.Injector { return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) }, - nil, + func() func(height int64, prove bool) (sdk.Context, error) { + return func(height int64, prove bool) (sdk.Context, error) { + return ctx, nil + } + }, log.NewTestLogger(GinkgoT()), cfg, ) @@ -86,17 +92,6 @@ var _ = Describe("", func() { am = evm.NewAppModule(k, ak) }) - Context("On ValidateGenesis", func() { - BeforeEach(func() { - }) - - When("", func() { - It("", func() { - - }) - }) - }) - Context("On InitGenesis", func() { BeforeEach(func() { }) @@ -110,9 +105,6 @@ var _ = Describe("", func() { }) When("the genesis is valid", func() { - BeforeEach(func() { - - }) It("should succeed without error", func() { Expect(err).ToNot(HaveOccurred()) }) diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index ff3eae577e..aefc75ac75 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -101,11 +101,11 @@ func NewKeeper( // SetupPrecompiles initializes precompiles and the polaris node. func (k *Keeper) SetupPrecompiles() error { - if err := k.host.SetupPrecompiles(); err != nil { - return err - } + return k.host.SetupPrecompiles() +} - // TODO: move this. +// Init calls Init on the underlying polaris struct. +func (k *Keeper) Init() error { return k.polaris.Init() } diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index 01eb712e1b..d5d1691394 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -105,6 +105,10 @@ var _ = Describe("Processor", func() { ) err = k.SetupPrecompiles() Expect(err).ToNot(HaveOccurred()) + // Init won't work yet due to no multistore existing yet at genesis. + // TODO: probably need to refactor state/plugin.StateAtBlockNumber (its really hood rn). + err = k.Init() + Expect(err).To(HaveOccurred()) ctx = ctx.WithBlockHeight(0) genState := core.DefaultGenesis Expect(k.InitGenesis(ctx, genState)).ToNot(HaveOccurred()) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 17b40a9629..4289bb76f6 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -540,11 +540,12 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // TODO: the GTE may be hiding a larger issue with the timing of the NewHead channel stuff. // Investigate and hopefully remove this GTE. if int64Number >= p.ctx.BlockHeight() { + // TODO: Manager properly if p.ctx.MultiStore() == nil { - return nil, errors.New("no multi-store set in host chain") + ctx = p.ctx.WithEventManager(sdk.NewEventManager()) + } else { + ctx, _ = p.ctx.CacheContext() } - - ctx, _ = p.ctx.CacheContext() } else { // Get the query context at the given height. var err error @@ -556,7 +557,10 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // Create a State Plugin with the requested chain height. sp := NewPlugin(p.ak, p.storeKey, p.plf) - sp.Reset(ctx) + // TODO: Manager properly + if p.ctx.MultiStore() != nil { + sp.Reset(ctx) + } return sp, nil } @@ -567,8 +571,11 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // Clone implements libtypes.Cloneable. func (p *plugin) Clone() ethstate.Plugin { sp := NewPlugin(p.ak, p.storeKey, p.plf) - cacheCtx, _ := p.ctx.CacheContext() - sp.Reset(cacheCtx) + // TODO: Manager properly + if p.ctx.MultiStore() != nil { + cacheCtx, _ := p.ctx.CacheContext() + sp.Reset(cacheCtx) + } return sp } diff --git a/e2e/localnet/network/node.go b/e2e/localnet/network/node.go index 4fe08647df..5911b7c56e 100644 --- a/e2e/localnet/network/node.go +++ b/e2e/localnet/network/node.go @@ -38,7 +38,8 @@ import ( const ( defaultTimeout = 30 * time.Second - nodeStartTime = 10 * time.Second + // TODO: this is so hood. + nodeStartTime = 15 * time.Second ) // ContainerizedNode is an interface for a containerized network. diff --git a/e2e/precompile/polard/start-node.sh b/e2e/precompile/polard/start-node.sh index 1e542fcf93..2bb37aa1ed 100755 --- a/e2e/precompile/polard/start-node.sh +++ b/e2e/precompile/polard/start-node.sh @@ -115,5 +115,18 @@ if [[ $1 == "pending" ]]; then echo "pending mode is on, please wait for the first block committed." fi +# Adjust timeouts for CometBFT: +# TODO: these values are sensitive due to a race condition in the json-rpc ports opening. +# If the JSON-RPC opens before the first block is committed, hive tests will start failing. +# This needs to be fixed before mainnet as its ghetto af. +sed -i 's/timeout_propose = "3s"/timeout_propose = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_prevote = "1s"/timeout_prevote = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_precommit = "1s"/timeout_precommit = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_commit = "5s"/timeout_commit = "2s"/g' $CONFIG_TOML +sed -i 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "2s"/g' $CONFIG_TOML + # Start the node (remove the --pruning=nothing flag if historical queries are not needed)m polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index e6610cc89a..eb9c94e6d3 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -200,6 +200,11 @@ func NewPolarisApp( panic(err) } + // Init is used to setup the polaris struct. + if err := app.EVMKeeper.Init(); err != nil { + panic(err) + } + // Setup TxPool Wrapper app.mp = txpool.New(app.EVMKeeper.Polaris().TxPool()) app.SetMempool(app.mp) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 9694066580..48c122d0fd 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index dea9080586..efad7c0c58 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -275,8 +275,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 4c36a743e7..96f3b43b2a 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -38,7 +38,7 @@ type ChainResources interface { // StateAt returns a statedb configured to read what the state of the blockchain is/was at a given. func (bc *blockchain) StateAt(common.Hash) (state.StateDB, error) { - return nil, errors.New("not implemented") + return nil, errors.New("StateAt is not implemented in polaris due state root") } // StateAtBlockNumber returns a statedb configured to read what the state of the blockchain is/was diff --git a/eth/core/processor.go b/eth/core/processor.go index b919729fab..d6130a5501 100644 --- a/eth/core/processor.go +++ b/eth/core/processor.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/trie" "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" errorslib "pkg.berachain.dev/polaris/lib/errors" @@ -52,7 +53,7 @@ type StateProcessor struct { signer types.Signer // statedb is the state database that is used to mange state during transactions. - statedb vm.PolarStateDB + statedb state.StateDB // vmConfig is the configuration for the EVM. vmConfig *vm.Config @@ -70,7 +71,7 @@ type StateProcessor struct { func NewStateProcessor( cp ConfigurationPlugin, pp PrecompilePlugin, - statedb vm.PolarStateDB, + statedb state.StateDB, vmConfig *vm.Config, ) *StateProcessor { sp := &StateProcessor{ diff --git a/eth/core/processor_test.go b/eth/core/processor_test.go index c370af41a5..5c50cda0af 100644 --- a/eth/core/processor_test.go +++ b/eth/core/processor_test.go @@ -26,13 +26,13 @@ import ( "github.com/ethereum/go-ethereum/consensus" - bindings "pkg.berachain.dev/polaris/contracts/bindings/testing" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/mock" + "pkg.berachain.dev/polaris/eth/core/state" + statemock "pkg.berachain.dev/polaris/eth/core/state/mock" "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" - vmmock "pkg.berachain.dev/polaris/eth/core/vm/mock" "pkg.berachain.dev/polaris/eth/crypto" "pkg.berachain.dev/polaris/eth/params" @@ -64,25 +64,24 @@ var ( var _ = Describe("StateProcessor", func() { var ( - sdb *vmmock.PolarStateDBMock + sdb state.StateDB bp *mock.BlockPluginMock cp *mock.ConfigurationPluginMock pp *mock.PrecompilePluginMock + spm *statemock.PluginMock sp *core.StateProcessor ) BeforeEach(func() { - sdb = vmmock.NewEmptyStateDB() + spm = statemock.NewEmptyStatePlugin() + spm.RegistryKeyFunc = func() string { + return "sp" + } + sdb = state.NewStateDB(spm, nil) _, bp, cp, _, _, pp, _ = mock.NewMockHostAndPlugins() bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { return common.BytesToAddress([]byte{2}), uint64(3) } - sdb.GetPrecompileManagerFunc = func() any { - return pp - } - sdb.TxIndexFunc = func() int { - return 0 - } pp.GetActiveFunc = func(params.Rules) []common.Address { return []common.Address{} } @@ -113,8 +112,9 @@ var _ = Describe("StateProcessor", func() { It("should error on an unsigned transaction", func() { gasPool := new(core.GasPool).AddGas(1000002) + tx := types.NewTx(legacyTxData) receipt, err := sp.ProcessTransaction( - context.Background(), &mockChainContext{}, gasPool, types.NewTx(legacyTxData)) + context.Background(), &mockChainContext{}, gasPool, tx) Expect(err).To(HaveOccurred()) Expect(receipt).To(BeNil()) block, receipts, logs, err := sp.Finalize(context.Background()) @@ -126,10 +126,10 @@ var _ = Describe("StateProcessor", func() { It("should not error on a signed transaction", func() { signedTx := types.MustSignNewTx(key, signer, legacyTxData) - sdb.GetBalanceFunc = func(addr common.Address) *big.Int { - return big.NewInt(1000001) - } gasPool := new(core.GasPool).AddGas(1000002) + sender, _ := signer.Sender(signedTx) + val, _ := new(big.Int).SetString("10000000000000000000", 10) + sdb.AddBalance(sender, val) result, err := sp.ProcessTransaction( context.Background(), &mockChainContext{}, gasPool, signedTx) Expect(err).ToNot(HaveOccurred()) @@ -144,28 +144,12 @@ var _ = Describe("StateProcessor", func() { }) It("should handle", func() { - sdb.GetBalanceFunc = func(addr common.Address) *big.Int { - return big.NewInt(1000001) - } - sdb.GetCodeFunc = func(addr common.Address) []byte { - if addr != dummyContract { - return nil - } - return common.Hex2Bytes(bindings.PrecompileConstructorMetaData.Bin) - } - sdb.GetCodeHashFunc = func(addr common.Address) common.Hash { - if addr != dummyContract { - return common.Hash{} - } - return crypto.Keccak256Hash( - common.Hex2Bytes(bindings.PrecompileConstructorMetaData.Bin)) - } - sdb.ExistFunc = func(addr common.Address) bool { - return addr == dummyContract - } legacyTxData.To = nil legacyTxData.Value = new(big.Int) signedTx := types.MustSignNewTx(key, signer, legacyTxData) + sender, _ := signer.Sender(signedTx) + val, _ := new(big.Int).SetString("10000000000000000000", 10) + sdb.AddBalance(sender, val) gasPool := new(core.GasPool).AddGas(1000002) result, err := sp.ProcessTransaction( context.Background(), &mockChainContext{}, gasPool, signedTx) @@ -191,22 +175,6 @@ var _ = Describe("StateProcessor", func() { }) }) -var _ = Describe("No precompile plugin provided", func() { - It("should use the default plugin if none is provided", func() { - _, bp, cp, gp, _, pp, _ := mock.NewMockHostAndPlugins() - gp.SetBlockGasLimit(uint64(blockGasLimit)) - bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { - return common.BytesToAddress([]byte{2}), uint64(3) - } - sp := core.NewStateProcessor(cp, pp, vmmock.NewEmptyStateDB(), &vm.Config{}) - Expect(func() { - sp.Prepare(&types.Header{ - GasLimit: uint64(blockGasLimit), - }) - }).ToNot(Panic()) - }) -}) - type mockChainContext struct{} // Engine retrieves the chain's consensus engine. diff --git a/eth/core/state/mock/state.go b/eth/core/state/mock/state.go index 6da6acb57c..51f89ab578 100644 --- a/eth/core/state/mock/state.go +++ b/eth/core/state/mock/state.go @@ -36,6 +36,7 @@ type Account struct { Balance *big.Int Code []byte CodeHash common.Hash + Nonce uint64 } // NewEmptyStatePlugin returns an empty `StatePluginMock`. @@ -44,7 +45,9 @@ func NewEmptyStatePlugin() *PluginMock { return &PluginMock{ AddBalanceFunc: func(address common.Address, intMoqParam *big.Int) { if _, ok := Accounts[address]; !ok { - panic("acct doesnt exist") + Accounts[address] = &Account{ + Balance: intMoqParam, + } } Accounts[address] = &Account{ Balance: Accounts[address].Balance.Add(Accounts[address].Balance, intMoqParam), @@ -67,7 +70,8 @@ func NewEmptyStatePlugin() *PluginMock { } }, ExistFunc: func(address common.Address) bool { - panic("mock out the Exist method") + _, ok := Accounts[address] + return ok }, EmptyFunc: func(address common.Address) bool { panic("mock out the Empty method") @@ -95,7 +99,7 @@ func NewEmptyStatePlugin() *PluginMock { }, GetCodeHashFunc: func(address common.Address) common.Hash { if _, ok := Accounts[address]; !ok { - panic("acct doesnt exist") + return common.Hash{} } return Accounts[address].CodeHash }, @@ -125,7 +129,7 @@ func NewEmptyStatePlugin() *PluginMock { } }, SetNonceFunc: func(address common.Address, v uint64) { - panic("mock out the SetNonce method") + Accounts[address].Nonce = v }, SetStateFunc: func(address common.Address, hash1 common.Hash, hash2 common.Hash) { panic("mock out the SetState method") diff --git a/eth/core/state/statedb.go b/eth/core/state/statedb.go index 8610636b22..b943bb7b8a 100644 --- a/eth/core/state/statedb.go +++ b/eth/core/state/statedb.go @@ -85,8 +85,6 @@ func newStateDBWithJournals( ) *stateDB { if sp == nil { panic("StatePlugin is nil in newStateDBWithJournals") - } else if pp == nil { - panic("PrecompilePlugin is nil in newStateDBWithJournals") } // Build the controller and register the plugins and journals @@ -224,8 +222,10 @@ func (sdb *stateDB) Preimages() map[common.Hash][]byte { // code associated with the given account. func (sdb *stateDB) GetCode(addr common.Address) []byte { // We return a single byte for client compatibility w/precompiles. - if _, ok := sdb.pp.Get(addr, sdb.rules); ok { - return []byte{0x01} + if sdb.pp != nil { + if _, ok := sdb.pp.Get(addr, sdb.rules); ok { + return []byte{0x01} + } } return sdb.Plugin.GetCode(addr) } diff --git a/eth/core/types/transaction.go b/eth/core/types/transaction.go index 21af383f22..90f20d376a 100644 --- a/eth/core/types/transaction.go +++ b/eth/core/types/transaction.go @@ -24,7 +24,6 @@ import ( "github.com/ethereum/go-ethereum/rlp" "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/crypto" ) // TxLookupEntry is a positional metadata to help looking up a transaction by hash. @@ -50,27 +49,3 @@ func (tle *TxLookupEntry) MarshalBinary() ([]byte, error) { } return bz, nil } - -// PubkeyFromTx returns the public key of the signer of the transaction. -func PubkeyFromTx(signedTx *Transaction, signer Signer) ([]byte, error) { - // signer.PubKey returns the uncompressed public key. - uncompressed, err := signer.PubKey(signedTx) - if err != nil { - return nil, err - } - - // We marshal it to a *ecdsa.PublicKey. - pubKey, err := crypto.UnmarshalPubkey(uncompressed) - if err != nil { - return nil, err - } - - // Then we can compress it to adhere to the required format. - return crypto.CompressPubkey(pubKey), nil -} - -// GetSender returns the sender of the transaction. -func GetSender(tx *Transaction) common.Address { - sender, _ := LatestSignerForChainID(tx.ChainId()).Sender(tx) - return sender -} diff --git a/eth/core/types/transaction_test.go b/eth/core/types/transaction_test.go deleted file mode 100644 index a23efd2376..0000000000 --- a/eth/core/types/transaction_test.go +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package types - -import ( - "math/big" - - "github.com/ethereum/go-ethereum/core/types" - - ethcrypto "pkg.berachain.dev/polaris/eth/crypto" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("signer.PubKey", func() { - var ( - key, _ = ethcrypto.GenerateEthKey() - - signer = types.NewLondonSigner(new(big.Int).SetInt64(420)) - signedTx *types.Transaction - ) - When("we are testing the code in geth", func() { - It("should recover the public key from a valid signature", func() { - txData := &types.LegacyTx{ - Nonce: 0, - Gas: 10000000, - Data: []byte("abcdef"), - } - signedTx = types.MustSignNewTx(key, signer, txData) - Expect(signer.PubKey(signedTx)).To(Equal(ethcrypto.FromECDSAPub(&key.PublicKey))) - }) - - It("should recover the public key from a valid signature", func() { - txData := &types.DynamicFeeTx{ - Nonce: 0, - Gas: 10000000, - Data: []byte("abcdef"), - } - signedTx = types.MustSignNewTx(key, signer, txData) - Expect(signer.PubKey(signedTx)).To(Equal(ethcrypto.FromECDSAPub(&key.PublicKey))) - }) - - It("should recover the public key from a valid signature", func() { - txData := &types.AccessListTx{ - Nonce: 0, - Gas: 10000000, - Data: []byte("abcdef"), - } - signedTx = types.MustSignNewTx(key, signer, txData) - Expect(signer.PubKey(signedTx)).To(Equal(ethcrypto.FromECDSAPub(&key.PublicKey))) - }) - }) - - When("we are testing the cosmos type key", func() { - BeforeEach(func() { - txData := &types.LegacyTx{ - Nonce: 0, - Gas: 10000000, - Data: []byte("abcdef"), - } - signedTx = types.MustSignNewTx(key, signer, txData) - Expect(signer.PubKey(signedTx)).To(Equal(ethcrypto.FromECDSAPub(&key.PublicKey))) - bz, err := signer.PubKey(signedTx) - Expect(err).ToNot(HaveOccurred()) - Expect(bz).To(Equal(ethcrypto.PubkeyToAddress(key.PublicKey))) - bz2, err := PubkeyFromTx(signedTx, signer) - Expect(err).ToNot(HaveOccurred()) - Expect(bz2).To(Equal(bz)) - }) - }) -}) diff --git a/eth/core/vm/mock/statedb.go b/eth/core/vm/mock/statedb.go index e8f47858ea..c48e2a583a 100644 --- a/eth/core/vm/mock/statedb.go +++ b/eth/core/vm/mock/statedb.go @@ -61,15 +61,6 @@ func NewEmptyStateDB() *PolarStateDBMock { EmptyFunc: func(address common.Address) bool { return true }, - ErrorFunc: func() error { - return nil - }, - ExistFunc: func(address common.Address) bool { - return false - }, - FinaliseFunc: func(bool) { - // no-op - }, GetBalanceFunc: func(address common.Address) *big.Int { return big.NewInt(0) }, @@ -85,9 +76,6 @@ func NewEmptyStateDB() *PolarStateDBMock { GetCommittedStateFunc: func(address common.Address, hash common.Hash) common.Hash { return common.Hash{} }, - GetLogsFunc: func(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { - return []*types.Log{} - }, GetNonceFunc: func(address common.Address) uint64 { return 0 }, @@ -116,7 +104,6 @@ func NewEmptyStateDB() *PolarStateDBMock { SetStateFunc: func(address common.Address, hash1 common.Hash, hash2 common.Hash) { }, - SetTxContextFunc: func(thash common.Hash, ti int) {}, SlotInAccessListFunc: func(addr common.Address, slot common.Hash) (bool, bool) { return false, false }, @@ -132,12 +119,5 @@ func NewEmptyStateDB() *PolarStateDBMock { SelfDestructFunc: func(address common.Address) { }, } - mockedPolarStateDB.LogsFunc = func() []*types.Log { - logs := []*types.Log{} - for _, l := range mockedPolarStateDB.AddLogCalls() { - logs = append(logs, l.Log) - } - return logs - } return mockedPolarStateDB } diff --git a/eth/core/vm/mock/statedb.mock.go b/eth/core/vm/mock/statedb.mock.go index 48c805663a..160ef03761 100644 --- a/eth/core/vm/mock/statedb.mock.go +++ b/eth/core/vm/mock/statedb.mock.go @@ -6,7 +6,6 @@ package mock import ( "context" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "math/big" @@ -45,36 +44,15 @@ var _ vm.PolarStateDB = &PolarStateDBMock{} // AddressInAccessListFunc: func(addr common.Address) bool { // panic("mock out the AddressInAccessList method") // }, -// CommitFunc: func(v uint64, b bool) (common.Hash, error) { -// panic("mock out the Commit method") -// }, -// CopyFunc: func() state.StateDBI { -// panic("mock out the Copy method") -// }, // CreateAccountFunc: func(address common.Address) { // panic("mock out the CreateAccount method") // }, -// DatabaseFunc: func() state.Database { -// panic("mock out the Database method") -// }, -// DumpFunc: func(opts *state.DumpConfig) []byte { -// panic("mock out the Dump method") -// }, -// DumpToCollectorFunc: func(c state.DumpCollector, conf *state.DumpConfig) []byte { -// panic("mock out the DumpToCollector method") -// }, // EmptyFunc: func(address common.Address) bool { // panic("mock out the Empty method") // }, -// ErrorFunc: func() error { -// panic("mock out the Error method") -// }, // ExistFunc: func(address common.Address) bool { // panic("mock out the Exist method") // }, -// FinaliseFunc: func(deleteEmptyObjects bool) { -// panic("mock out the Finalise method") -// }, // GetBalanceFunc: func(address common.Address) *big.Int { // panic("mock out the GetBalance method") // }, @@ -93,15 +71,9 @@ var _ vm.PolarStateDB = &PolarStateDBMock{} // GetContextFunc: func() context.Context { // panic("mock out the GetContext method") // }, -// GetLogsFunc: func(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { -// panic("mock out the GetLogs method") -// }, // GetNonceFunc: func(address common.Address) uint64 { // panic("mock out the GetNonce method") // }, -// GetOrNewStateObjectFunc: func(addr common.Address) *state.StateObject { -// panic("mock out the GetOrNewStateObject method") -// }, // GetPrecompileManagerFunc: func() any { // panic("mock out the GetPrecompileManager method") // }, @@ -111,33 +83,15 @@ var _ vm.PolarStateDB = &PolarStateDBMock{} // GetStateFunc: func(address common.Address, hash common.Hash) common.Hash { // panic("mock out the GetState method") // }, -// GetStorageRootFunc: func(addr common.Address) common.Hash { -// panic("mock out the GetStorageRoot method") -// }, // GetTransientStateFunc: func(addr common.Address, key common.Hash) common.Hash { // panic("mock out the GetTransientState method") // }, // HasSelfDestructedFunc: func(address common.Address) bool { // panic("mock out the HasSelfDestructed method") // }, -// IntermediateRootFunc: func(deleteEmptyObjects bool) common.Hash { -// panic("mock out the IntermediateRoot method") -// }, -// IteratorDumpFunc: func(opts *state.DumpConfig) state.IteratorDump { -// panic("mock out the IteratorDump method") -// }, -// LogsFunc: func() []*types.Log { -// panic("mock out the Logs method") -// }, -// PreimagesFunc: func() map[common.Hash][]byte { -// panic("mock out the Preimages method") -// }, // PrepareFunc: func(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { // panic("mock out the Prepare method") // }, -// RawDumpFunc: func(opts *state.DumpConfig) state.Dump { -// panic("mock out the RawDump method") -// }, // RevertToSnapshotFunc: func(n int) { // panic("mock out the RevertToSnapshot method") // }, @@ -147,9 +101,6 @@ var _ vm.PolarStateDB = &PolarStateDBMock{} // Selfdestruct6780Func: func(address common.Address) { // panic("mock out the Selfdestruct6780 method") // }, -// SetBalanceFunc: func(addr common.Address, amount *big.Int) { -// panic("mock out the SetBalance method") -// }, // SetCodeFunc: func(address common.Address, bytes []byte) { // panic("mock out the SetCode method") // }, @@ -159,36 +110,21 @@ var _ vm.PolarStateDB = &PolarStateDBMock{} // SetStateFunc: func(address common.Address, hash1 common.Hash, hash2 common.Hash) { // panic("mock out the SetState method") // }, -// SetStorageFunc: func(addr common.Address, storage map[common.Hash]common.Hash) { -// panic("mock out the SetStorage method") -// }, // SetTransientStateFunc: func(addr common.Address, key common.Hash, value common.Hash) { // panic("mock out the SetTransientState method") // }, -// SetTxContextFunc: func(thash common.Hash, ti int) { -// panic("mock out the SetTxContext method") -// }, // SlotInAccessListFunc: func(addr common.Address, slot common.Hash) (bool, bool) { // panic("mock out the SlotInAccessList method") // }, // SnapshotFunc: func() int { // panic("mock out the Snapshot method") // }, -// StartPrefetcherFunc: func(namespace string) { -// panic("mock out the StartPrefetcher method") -// }, -// StopPrefetcherFunc: func() { -// panic("mock out the StopPrefetcher method") -// }, // SubBalanceFunc: func(address common.Address, intMoqParam *big.Int) { // panic("mock out the SubBalance method") // }, // SubRefundFunc: func(v uint64) { // panic("mock out the SubRefund method") // }, -// TxIndexFunc: func() int { -// panic("mock out the TxIndex method") -// }, // } // // // use mockedPolarStateDB in code that requires vm.PolarStateDB @@ -217,36 +153,15 @@ type PolarStateDBMock struct { // AddressInAccessListFunc mocks the AddressInAccessList method. AddressInAccessListFunc func(addr common.Address) bool - // CommitFunc mocks the Commit method. - CommitFunc func(v uint64, b bool) (common.Hash, error) - - // CopyFunc mocks the Copy method. - CopyFunc func() state.StateDBI - // CreateAccountFunc mocks the CreateAccount method. CreateAccountFunc func(address common.Address) - // DatabaseFunc mocks the Database method. - DatabaseFunc func() state.Database - - // DumpFunc mocks the Dump method. - DumpFunc func(opts *state.DumpConfig) []byte - - // DumpToCollectorFunc mocks the DumpToCollector method. - DumpToCollectorFunc func(c state.DumpCollector, conf *state.DumpConfig) []byte - // EmptyFunc mocks the Empty method. EmptyFunc func(address common.Address) bool - // ErrorFunc mocks the Error method. - ErrorFunc func() error - // ExistFunc mocks the Exist method. ExistFunc func(address common.Address) bool - // FinaliseFunc mocks the Finalise method. - FinaliseFunc func(deleteEmptyObjects bool) - // GetBalanceFunc mocks the GetBalance method. GetBalanceFunc func(address common.Address) *big.Int @@ -265,15 +180,9 @@ type PolarStateDBMock struct { // GetContextFunc mocks the GetContext method. GetContextFunc func() context.Context - // GetLogsFunc mocks the GetLogs method. - GetLogsFunc func(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log - // GetNonceFunc mocks the GetNonce method. GetNonceFunc func(address common.Address) uint64 - // GetOrNewStateObjectFunc mocks the GetOrNewStateObject method. - GetOrNewStateObjectFunc func(addr common.Address) *state.StateObject - // GetPrecompileManagerFunc mocks the GetPrecompileManager method. GetPrecompileManagerFunc func() any @@ -283,33 +192,15 @@ type PolarStateDBMock struct { // GetStateFunc mocks the GetState method. GetStateFunc func(address common.Address, hash common.Hash) common.Hash - // GetStorageRootFunc mocks the GetStorageRoot method. - GetStorageRootFunc func(addr common.Address) common.Hash - // GetTransientStateFunc mocks the GetTransientState method. GetTransientStateFunc func(addr common.Address, key common.Hash) common.Hash // HasSelfDestructedFunc mocks the HasSelfDestructed method. HasSelfDestructedFunc func(address common.Address) bool - // IntermediateRootFunc mocks the IntermediateRoot method. - IntermediateRootFunc func(deleteEmptyObjects bool) common.Hash - - // IteratorDumpFunc mocks the IteratorDump method. - IteratorDumpFunc func(opts *state.DumpConfig) state.IteratorDump - - // LogsFunc mocks the Logs method. - LogsFunc func() []*types.Log - - // PreimagesFunc mocks the Preimages method. - PreimagesFunc func() map[common.Hash][]byte - // PrepareFunc mocks the Prepare method. PrepareFunc func(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) - // RawDumpFunc mocks the RawDump method. - RawDumpFunc func(opts *state.DumpConfig) state.Dump - // RevertToSnapshotFunc mocks the RevertToSnapshot method. RevertToSnapshotFunc func(n int) @@ -319,9 +210,6 @@ type PolarStateDBMock struct { // Selfdestruct6780Func mocks the Selfdestruct6780 method. Selfdestruct6780Func func(address common.Address) - // SetBalanceFunc mocks the SetBalance method. - SetBalanceFunc func(addr common.Address, amount *big.Int) - // SetCodeFunc mocks the SetCode method. SetCodeFunc func(address common.Address, bytes []byte) @@ -331,36 +219,21 @@ type PolarStateDBMock struct { // SetStateFunc mocks the SetState method. SetStateFunc func(address common.Address, hash1 common.Hash, hash2 common.Hash) - // SetStorageFunc mocks the SetStorage method. - SetStorageFunc func(addr common.Address, storage map[common.Hash]common.Hash) - // SetTransientStateFunc mocks the SetTransientState method. SetTransientStateFunc func(addr common.Address, key common.Hash, value common.Hash) - // SetTxContextFunc mocks the SetTxContext method. - SetTxContextFunc func(thash common.Hash, ti int) - // SlotInAccessListFunc mocks the SlotInAccessList method. SlotInAccessListFunc func(addr common.Address, slot common.Hash) (bool, bool) // SnapshotFunc mocks the Snapshot method. SnapshotFunc func() int - // StartPrefetcherFunc mocks the StartPrefetcher method. - StartPrefetcherFunc func(namespace string) - - // StopPrefetcherFunc mocks the StopPrefetcher method. - StopPrefetcherFunc func() - // SubBalanceFunc mocks the SubBalance method. SubBalanceFunc func(address common.Address, intMoqParam *big.Int) // SubRefundFunc mocks the SubRefund method. SubRefundFunc func(v uint64) - // TxIndexFunc mocks the TxIndex method. - TxIndexFunc func() int - // calls tracks calls to the methods. calls struct { // AddAddressToAccessList holds details about calls to the AddAddressToAccessList method. @@ -404,54 +277,21 @@ type PolarStateDBMock struct { // Addr is the addr argument value. Addr common.Address } - // Commit holds details about calls to the Commit method. - Commit []struct { - // V is the v argument value. - V uint64 - // B is the b argument value. - B bool - } - // Copy holds details about calls to the Copy method. - Copy []struct { - } // CreateAccount holds details about calls to the CreateAccount method. CreateAccount []struct { // Address is the address argument value. Address common.Address } - // Database holds details about calls to the Database method. - Database []struct { - } - // Dump holds details about calls to the Dump method. - Dump []struct { - // Opts is the opts argument value. - Opts *state.DumpConfig - } - // DumpToCollector holds details about calls to the DumpToCollector method. - DumpToCollector []struct { - // C is the c argument value. - C state.DumpCollector - // Conf is the conf argument value. - Conf *state.DumpConfig - } // Empty holds details about calls to the Empty method. Empty []struct { // Address is the address argument value. Address common.Address } - // Error holds details about calls to the Error method. - Error []struct { - } // Exist holds details about calls to the Exist method. Exist []struct { // Address is the address argument value. Address common.Address } - // Finalise holds details about calls to the Finalise method. - Finalise []struct { - // DeleteEmptyObjects is the deleteEmptyObjects argument value. - DeleteEmptyObjects bool - } // GetBalance holds details about calls to the GetBalance method. GetBalance []struct { // Address is the address argument value. @@ -482,25 +322,11 @@ type PolarStateDBMock struct { // GetContext holds details about calls to the GetContext method. GetContext []struct { } - // GetLogs holds details about calls to the GetLogs method. - GetLogs []struct { - // Hash is the hash argument value. - Hash common.Hash - // BlockNumber is the blockNumber argument value. - BlockNumber uint64 - // BlockHash is the blockHash argument value. - BlockHash common.Hash - } // GetNonce holds details about calls to the GetNonce method. GetNonce []struct { // Address is the address argument value. Address common.Address } - // GetOrNewStateObject holds details about calls to the GetOrNewStateObject method. - GetOrNewStateObject []struct { - // Addr is the addr argument value. - Addr common.Address - } // GetPrecompileManager holds details about calls to the GetPrecompileManager method. GetPrecompileManager []struct { } @@ -514,11 +340,6 @@ type PolarStateDBMock struct { // Hash is the hash argument value. Hash common.Hash } - // GetStorageRoot holds details about calls to the GetStorageRoot method. - GetStorageRoot []struct { - // Addr is the addr argument value. - Addr common.Address - } // GetTransientState holds details about calls to the GetTransientState method. GetTransientState []struct { // Addr is the addr argument value. @@ -531,22 +352,6 @@ type PolarStateDBMock struct { // Address is the address argument value. Address common.Address } - // IntermediateRoot holds details about calls to the IntermediateRoot method. - IntermediateRoot []struct { - // DeleteEmptyObjects is the deleteEmptyObjects argument value. - DeleteEmptyObjects bool - } - // IteratorDump holds details about calls to the IteratorDump method. - IteratorDump []struct { - // Opts is the opts argument value. - Opts *state.DumpConfig - } - // Logs holds details about calls to the Logs method. - Logs []struct { - } - // Preimages holds details about calls to the Preimages method. - Preimages []struct { - } // Prepare holds details about calls to the Prepare method. Prepare []struct { // Rules is the rules argument value. @@ -562,11 +367,6 @@ type PolarStateDBMock struct { // TxAccesses is the txAccesses argument value. TxAccesses types.AccessList } - // RawDump holds details about calls to the RawDump method. - RawDump []struct { - // Opts is the opts argument value. - Opts *state.DumpConfig - } // RevertToSnapshot holds details about calls to the RevertToSnapshot method. RevertToSnapshot []struct { // N is the n argument value. @@ -582,13 +382,6 @@ type PolarStateDBMock struct { // Address is the address argument value. Address common.Address } - // SetBalance holds details about calls to the SetBalance method. - SetBalance []struct { - // Addr is the addr argument value. - Addr common.Address - // Amount is the amount argument value. - Amount *big.Int - } // SetCode holds details about calls to the SetCode method. SetCode []struct { // Address is the address argument value. @@ -612,13 +405,6 @@ type PolarStateDBMock struct { // Hash2 is the hash2 argument value. Hash2 common.Hash } - // SetStorage holds details about calls to the SetStorage method. - SetStorage []struct { - // Addr is the addr argument value. - Addr common.Address - // Storage is the storage argument value. - Storage map[common.Hash]common.Hash - } // SetTransientState holds details about calls to the SetTransientState method. SetTransientState []struct { // Addr is the addr argument value. @@ -628,13 +414,6 @@ type PolarStateDBMock struct { // Value is the value argument value. Value common.Hash } - // SetTxContext holds details about calls to the SetTxContext method. - SetTxContext []struct { - // Thash is the thash argument value. - Thash common.Hash - // Ti is the ti argument value. - Ti int - } // SlotInAccessList holds details about calls to the SlotInAccessList method. SlotInAccessList []struct { // Addr is the addr argument value. @@ -645,14 +424,6 @@ type PolarStateDBMock struct { // Snapshot holds details about calls to the Snapshot method. Snapshot []struct { } - // StartPrefetcher holds details about calls to the StartPrefetcher method. - StartPrefetcher []struct { - // Namespace is the namespace argument value. - Namespace string - } - // StopPrefetcher holds details about calls to the StopPrefetcher method. - StopPrefetcher []struct { - } // SubBalance holds details about calls to the SubBalance method. SubBalance []struct { // Address is the address argument value. @@ -665,9 +436,6 @@ type PolarStateDBMock struct { // V is the v argument value. V uint64 } - // TxIndex holds details about calls to the TxIndex method. - TxIndex []struct { - } } lockAddAddressToAccessList sync.RWMutex lockAddBalance sync.RWMutex @@ -676,54 +444,33 @@ type PolarStateDBMock struct { lockAddRefund sync.RWMutex lockAddSlotToAccessList sync.RWMutex lockAddressInAccessList sync.RWMutex - lockCommit sync.RWMutex - lockCopy sync.RWMutex lockCreateAccount sync.RWMutex - lockDatabase sync.RWMutex - lockDump sync.RWMutex - lockDumpToCollector sync.RWMutex lockEmpty sync.RWMutex - lockError sync.RWMutex lockExist sync.RWMutex - lockFinalise sync.RWMutex lockGetBalance sync.RWMutex lockGetCode sync.RWMutex lockGetCodeHash sync.RWMutex lockGetCodeSize sync.RWMutex lockGetCommittedState sync.RWMutex lockGetContext sync.RWMutex - lockGetLogs sync.RWMutex lockGetNonce sync.RWMutex - lockGetOrNewStateObject sync.RWMutex lockGetPrecompileManager sync.RWMutex lockGetRefund sync.RWMutex lockGetState sync.RWMutex - lockGetStorageRoot sync.RWMutex lockGetTransientState sync.RWMutex lockHasSelfDestructed sync.RWMutex - lockIntermediateRoot sync.RWMutex - lockIteratorDump sync.RWMutex - lockLogs sync.RWMutex - lockPreimages sync.RWMutex lockPrepare sync.RWMutex - lockRawDump sync.RWMutex lockRevertToSnapshot sync.RWMutex lockSelfDestruct sync.RWMutex lockSelfdestruct6780 sync.RWMutex - lockSetBalance sync.RWMutex lockSetCode sync.RWMutex lockSetNonce sync.RWMutex lockSetState sync.RWMutex - lockSetStorage sync.RWMutex lockSetTransientState sync.RWMutex - lockSetTxContext sync.RWMutex lockSlotInAccessList sync.RWMutex lockSnapshot sync.RWMutex - lockStartPrefetcher sync.RWMutex - lockStopPrefetcher sync.RWMutex lockSubBalance sync.RWMutex lockSubRefund sync.RWMutex - lockTxIndex sync.RWMutex } // AddAddressToAccessList calls AddAddressToAccessListFunc. @@ -962,69 +709,6 @@ func (mock *PolarStateDBMock) AddressInAccessListCalls() []struct { return calls } -// Commit calls CommitFunc. -func (mock *PolarStateDBMock) Commit(v uint64, b bool) (common.Hash, error) { - if mock.CommitFunc == nil { - panic("PolarStateDBMock.CommitFunc: method is nil but PolarStateDB.Commit was just called") - } - callInfo := struct { - V uint64 - B bool - }{ - V: v, - B: b, - } - mock.lockCommit.Lock() - mock.calls.Commit = append(mock.calls.Commit, callInfo) - mock.lockCommit.Unlock() - return mock.CommitFunc(v, b) -} - -// CommitCalls gets all the calls that were made to Commit. -// Check the length with: -// -// len(mockedPolarStateDB.CommitCalls()) -func (mock *PolarStateDBMock) CommitCalls() []struct { - V uint64 - B bool -} { - var calls []struct { - V uint64 - B bool - } - mock.lockCommit.RLock() - calls = mock.calls.Commit - mock.lockCommit.RUnlock() - return calls -} - -// Copy calls CopyFunc. -func (mock *PolarStateDBMock) Copy() state.StateDBI { - if mock.CopyFunc == nil { - panic("PolarStateDBMock.CopyFunc: method is nil but PolarStateDB.Copy was just called") - } - callInfo := struct { - }{} - mock.lockCopy.Lock() - mock.calls.Copy = append(mock.calls.Copy, callInfo) - mock.lockCopy.Unlock() - return mock.CopyFunc() -} - -// CopyCalls gets all the calls that were made to Copy. -// Check the length with: -// -// len(mockedPolarStateDB.CopyCalls()) -func (mock *PolarStateDBMock) CopyCalls() []struct { -} { - var calls []struct { - } - mock.lockCopy.RLock() - calls = mock.calls.Copy - mock.lockCopy.RUnlock() - return calls -} - // CreateAccount calls CreateAccountFunc. func (mock *PolarStateDBMock) CreateAccount(address common.Address) { if mock.CreateAccountFunc == nil { @@ -1057,101 +741,6 @@ func (mock *PolarStateDBMock) CreateAccountCalls() []struct { return calls } -// Database calls DatabaseFunc. -func (mock *PolarStateDBMock) Database() state.Database { - if mock.DatabaseFunc == nil { - panic("PolarStateDBMock.DatabaseFunc: method is nil but PolarStateDB.Database was just called") - } - callInfo := struct { - }{} - mock.lockDatabase.Lock() - mock.calls.Database = append(mock.calls.Database, callInfo) - mock.lockDatabase.Unlock() - return mock.DatabaseFunc() -} - -// DatabaseCalls gets all the calls that were made to Database. -// Check the length with: -// -// len(mockedPolarStateDB.DatabaseCalls()) -func (mock *PolarStateDBMock) DatabaseCalls() []struct { -} { - var calls []struct { - } - mock.lockDatabase.RLock() - calls = mock.calls.Database - mock.lockDatabase.RUnlock() - return calls -} - -// Dump calls DumpFunc. -func (mock *PolarStateDBMock) Dump(opts *state.DumpConfig) []byte { - if mock.DumpFunc == nil { - panic("PolarStateDBMock.DumpFunc: method is nil but PolarStateDB.Dump was just called") - } - callInfo := struct { - Opts *state.DumpConfig - }{ - Opts: opts, - } - mock.lockDump.Lock() - mock.calls.Dump = append(mock.calls.Dump, callInfo) - mock.lockDump.Unlock() - return mock.DumpFunc(opts) -} - -// DumpCalls gets all the calls that were made to Dump. -// Check the length with: -// -// len(mockedPolarStateDB.DumpCalls()) -func (mock *PolarStateDBMock) DumpCalls() []struct { - Opts *state.DumpConfig -} { - var calls []struct { - Opts *state.DumpConfig - } - mock.lockDump.RLock() - calls = mock.calls.Dump - mock.lockDump.RUnlock() - return calls -} - -// DumpToCollector calls DumpToCollectorFunc. -func (mock *PolarStateDBMock) DumpToCollector(c state.DumpCollector, conf *state.DumpConfig) []byte { - if mock.DumpToCollectorFunc == nil { - panic("PolarStateDBMock.DumpToCollectorFunc: method is nil but PolarStateDB.DumpToCollector was just called") - } - callInfo := struct { - C state.DumpCollector - Conf *state.DumpConfig - }{ - C: c, - Conf: conf, - } - mock.lockDumpToCollector.Lock() - mock.calls.DumpToCollector = append(mock.calls.DumpToCollector, callInfo) - mock.lockDumpToCollector.Unlock() - return mock.DumpToCollectorFunc(c, conf) -} - -// DumpToCollectorCalls gets all the calls that were made to DumpToCollector. -// Check the length with: -// -// len(mockedPolarStateDB.DumpToCollectorCalls()) -func (mock *PolarStateDBMock) DumpToCollectorCalls() []struct { - C state.DumpCollector - Conf *state.DumpConfig -} { - var calls []struct { - C state.DumpCollector - Conf *state.DumpConfig - } - mock.lockDumpToCollector.RLock() - calls = mock.calls.DumpToCollector - mock.lockDumpToCollector.RUnlock() - return calls -} - // Empty calls EmptyFunc. func (mock *PolarStateDBMock) Empty(address common.Address) bool { if mock.EmptyFunc == nil { @@ -1184,33 +773,6 @@ func (mock *PolarStateDBMock) EmptyCalls() []struct { return calls } -// Error calls ErrorFunc. -func (mock *PolarStateDBMock) Error() error { - if mock.ErrorFunc == nil { - panic("PolarStateDBMock.ErrorFunc: method is nil but PolarStateDB.Error was just called") - } - callInfo := struct { - }{} - mock.lockError.Lock() - mock.calls.Error = append(mock.calls.Error, callInfo) - mock.lockError.Unlock() - return mock.ErrorFunc() -} - -// ErrorCalls gets all the calls that were made to Error. -// Check the length with: -// -// len(mockedPolarStateDB.ErrorCalls()) -func (mock *PolarStateDBMock) ErrorCalls() []struct { -} { - var calls []struct { - } - mock.lockError.RLock() - calls = mock.calls.Error - mock.lockError.RUnlock() - return calls -} - // Exist calls ExistFunc. func (mock *PolarStateDBMock) Exist(address common.Address) bool { if mock.ExistFunc == nil { @@ -1243,38 +805,6 @@ func (mock *PolarStateDBMock) ExistCalls() []struct { return calls } -// Finalise calls FinaliseFunc. -func (mock *PolarStateDBMock) Finalise(deleteEmptyObjects bool) { - if mock.FinaliseFunc == nil { - panic("PolarStateDBMock.FinaliseFunc: method is nil but PolarStateDB.Finalise was just called") - } - callInfo := struct { - DeleteEmptyObjects bool - }{ - DeleteEmptyObjects: deleteEmptyObjects, - } - mock.lockFinalise.Lock() - mock.calls.Finalise = append(mock.calls.Finalise, callInfo) - mock.lockFinalise.Unlock() - mock.FinaliseFunc(deleteEmptyObjects) -} - -// FinaliseCalls gets all the calls that were made to Finalise. -// Check the length with: -// -// len(mockedPolarStateDB.FinaliseCalls()) -func (mock *PolarStateDBMock) FinaliseCalls() []struct { - DeleteEmptyObjects bool -} { - var calls []struct { - DeleteEmptyObjects bool - } - mock.lockFinalise.RLock() - calls = mock.calls.Finalise - mock.lockFinalise.RUnlock() - return calls -} - // GetBalance calls GetBalanceFunc. func (mock *PolarStateDBMock) GetBalance(address common.Address) *big.Int { if mock.GetBalanceFunc == nil { @@ -1466,46 +996,6 @@ func (mock *PolarStateDBMock) GetContextCalls() []struct { return calls } -// GetLogs calls GetLogsFunc. -func (mock *PolarStateDBMock) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log { - if mock.GetLogsFunc == nil { - panic("PolarStateDBMock.GetLogsFunc: method is nil but PolarStateDB.GetLogs was just called") - } - callInfo := struct { - Hash common.Hash - BlockNumber uint64 - BlockHash common.Hash - }{ - Hash: hash, - BlockNumber: blockNumber, - BlockHash: blockHash, - } - mock.lockGetLogs.Lock() - mock.calls.GetLogs = append(mock.calls.GetLogs, callInfo) - mock.lockGetLogs.Unlock() - return mock.GetLogsFunc(hash, blockNumber, blockHash) -} - -// GetLogsCalls gets all the calls that were made to GetLogs. -// Check the length with: -// -// len(mockedPolarStateDB.GetLogsCalls()) -func (mock *PolarStateDBMock) GetLogsCalls() []struct { - Hash common.Hash - BlockNumber uint64 - BlockHash common.Hash -} { - var calls []struct { - Hash common.Hash - BlockNumber uint64 - BlockHash common.Hash - } - mock.lockGetLogs.RLock() - calls = mock.calls.GetLogs - mock.lockGetLogs.RUnlock() - return calls -} - // GetNonce calls GetNonceFunc. func (mock *PolarStateDBMock) GetNonce(address common.Address) uint64 { if mock.GetNonceFunc == nil { @@ -1538,38 +1028,6 @@ func (mock *PolarStateDBMock) GetNonceCalls() []struct { return calls } -// GetOrNewStateObject calls GetOrNewStateObjectFunc. -func (mock *PolarStateDBMock) GetOrNewStateObject(addr common.Address) *state.StateObject { - if mock.GetOrNewStateObjectFunc == nil { - panic("PolarStateDBMock.GetOrNewStateObjectFunc: method is nil but PolarStateDB.GetOrNewStateObject was just called") - } - callInfo := struct { - Addr common.Address - }{ - Addr: addr, - } - mock.lockGetOrNewStateObject.Lock() - mock.calls.GetOrNewStateObject = append(mock.calls.GetOrNewStateObject, callInfo) - mock.lockGetOrNewStateObject.Unlock() - return mock.GetOrNewStateObjectFunc(addr) -} - -// GetOrNewStateObjectCalls gets all the calls that were made to GetOrNewStateObject. -// Check the length with: -// -// len(mockedPolarStateDB.GetOrNewStateObjectCalls()) -func (mock *PolarStateDBMock) GetOrNewStateObjectCalls() []struct { - Addr common.Address -} { - var calls []struct { - Addr common.Address - } - mock.lockGetOrNewStateObject.RLock() - calls = mock.calls.GetOrNewStateObject - mock.lockGetOrNewStateObject.RUnlock() - return calls -} - // GetPrecompileManager calls GetPrecompileManagerFunc. func (mock *PolarStateDBMock) GetPrecompileManager() any { if mock.GetPrecompileManagerFunc == nil { @@ -1660,38 +1118,6 @@ func (mock *PolarStateDBMock) GetStateCalls() []struct { return calls } -// GetStorageRoot calls GetStorageRootFunc. -func (mock *PolarStateDBMock) GetStorageRoot(addr common.Address) common.Hash { - if mock.GetStorageRootFunc == nil { - panic("PolarStateDBMock.GetStorageRootFunc: method is nil but PolarStateDB.GetStorageRoot was just called") - } - callInfo := struct { - Addr common.Address - }{ - Addr: addr, - } - mock.lockGetStorageRoot.Lock() - mock.calls.GetStorageRoot = append(mock.calls.GetStorageRoot, callInfo) - mock.lockGetStorageRoot.Unlock() - return mock.GetStorageRootFunc(addr) -} - -// GetStorageRootCalls gets all the calls that were made to GetStorageRoot. -// Check the length with: -// -// len(mockedPolarStateDB.GetStorageRootCalls()) -func (mock *PolarStateDBMock) GetStorageRootCalls() []struct { - Addr common.Address -} { - var calls []struct { - Addr common.Address - } - mock.lockGetStorageRoot.RLock() - calls = mock.calls.GetStorageRoot - mock.lockGetStorageRoot.RUnlock() - return calls -} - // GetTransientState calls GetTransientStateFunc. func (mock *PolarStateDBMock) GetTransientState(addr common.Address, key common.Hash) common.Hash { if mock.GetTransientStateFunc == nil { @@ -1760,124 +1186,6 @@ func (mock *PolarStateDBMock) HasSelfDestructedCalls() []struct { return calls } -// IntermediateRoot calls IntermediateRootFunc. -func (mock *PolarStateDBMock) IntermediateRoot(deleteEmptyObjects bool) common.Hash { - if mock.IntermediateRootFunc == nil { - panic("PolarStateDBMock.IntermediateRootFunc: method is nil but PolarStateDB.IntermediateRoot was just called") - } - callInfo := struct { - DeleteEmptyObjects bool - }{ - DeleteEmptyObjects: deleteEmptyObjects, - } - mock.lockIntermediateRoot.Lock() - mock.calls.IntermediateRoot = append(mock.calls.IntermediateRoot, callInfo) - mock.lockIntermediateRoot.Unlock() - return mock.IntermediateRootFunc(deleteEmptyObjects) -} - -// IntermediateRootCalls gets all the calls that were made to IntermediateRoot. -// Check the length with: -// -// len(mockedPolarStateDB.IntermediateRootCalls()) -func (mock *PolarStateDBMock) IntermediateRootCalls() []struct { - DeleteEmptyObjects bool -} { - var calls []struct { - DeleteEmptyObjects bool - } - mock.lockIntermediateRoot.RLock() - calls = mock.calls.IntermediateRoot - mock.lockIntermediateRoot.RUnlock() - return calls -} - -// IteratorDump calls IteratorDumpFunc. -func (mock *PolarStateDBMock) IteratorDump(opts *state.DumpConfig) state.IteratorDump { - if mock.IteratorDumpFunc == nil { - panic("PolarStateDBMock.IteratorDumpFunc: method is nil but PolarStateDB.IteratorDump was just called") - } - callInfo := struct { - Opts *state.DumpConfig - }{ - Opts: opts, - } - mock.lockIteratorDump.Lock() - mock.calls.IteratorDump = append(mock.calls.IteratorDump, callInfo) - mock.lockIteratorDump.Unlock() - return mock.IteratorDumpFunc(opts) -} - -// IteratorDumpCalls gets all the calls that were made to IteratorDump. -// Check the length with: -// -// len(mockedPolarStateDB.IteratorDumpCalls()) -func (mock *PolarStateDBMock) IteratorDumpCalls() []struct { - Opts *state.DumpConfig -} { - var calls []struct { - Opts *state.DumpConfig - } - mock.lockIteratorDump.RLock() - calls = mock.calls.IteratorDump - mock.lockIteratorDump.RUnlock() - return calls -} - -// Logs calls LogsFunc. -func (mock *PolarStateDBMock) Logs() []*types.Log { - if mock.LogsFunc == nil { - panic("PolarStateDBMock.LogsFunc: method is nil but PolarStateDB.Logs was just called") - } - callInfo := struct { - }{} - mock.lockLogs.Lock() - mock.calls.Logs = append(mock.calls.Logs, callInfo) - mock.lockLogs.Unlock() - return mock.LogsFunc() -} - -// LogsCalls gets all the calls that were made to Logs. -// Check the length with: -// -// len(mockedPolarStateDB.LogsCalls()) -func (mock *PolarStateDBMock) LogsCalls() []struct { -} { - var calls []struct { - } - mock.lockLogs.RLock() - calls = mock.calls.Logs - mock.lockLogs.RUnlock() - return calls -} - -// Preimages calls PreimagesFunc. -func (mock *PolarStateDBMock) Preimages() map[common.Hash][]byte { - if mock.PreimagesFunc == nil { - panic("PolarStateDBMock.PreimagesFunc: method is nil but PolarStateDB.Preimages was just called") - } - callInfo := struct { - }{} - mock.lockPreimages.Lock() - mock.calls.Preimages = append(mock.calls.Preimages, callInfo) - mock.lockPreimages.Unlock() - return mock.PreimagesFunc() -} - -// PreimagesCalls gets all the calls that were made to Preimages. -// Check the length with: -// -// len(mockedPolarStateDB.PreimagesCalls()) -func (mock *PolarStateDBMock) PreimagesCalls() []struct { -} { - var calls []struct { - } - mock.lockPreimages.RLock() - calls = mock.calls.Preimages - mock.lockPreimages.RUnlock() - return calls -} - // Prepare calls PrepareFunc. func (mock *PolarStateDBMock) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) { if mock.PrepareFunc == nil { @@ -1930,38 +1238,6 @@ func (mock *PolarStateDBMock) PrepareCalls() []struct { return calls } -// RawDump calls RawDumpFunc. -func (mock *PolarStateDBMock) RawDump(opts *state.DumpConfig) state.Dump { - if mock.RawDumpFunc == nil { - panic("PolarStateDBMock.RawDumpFunc: method is nil but PolarStateDB.RawDump was just called") - } - callInfo := struct { - Opts *state.DumpConfig - }{ - Opts: opts, - } - mock.lockRawDump.Lock() - mock.calls.RawDump = append(mock.calls.RawDump, callInfo) - mock.lockRawDump.Unlock() - return mock.RawDumpFunc(opts) -} - -// RawDumpCalls gets all the calls that were made to RawDump. -// Check the length with: -// -// len(mockedPolarStateDB.RawDumpCalls()) -func (mock *PolarStateDBMock) RawDumpCalls() []struct { - Opts *state.DumpConfig -} { - var calls []struct { - Opts *state.DumpConfig - } - mock.lockRawDump.RLock() - calls = mock.calls.RawDump - mock.lockRawDump.RUnlock() - return calls -} - // RevertToSnapshot calls RevertToSnapshotFunc. func (mock *PolarStateDBMock) RevertToSnapshot(n int) { if mock.RevertToSnapshotFunc == nil { @@ -2058,42 +1334,6 @@ func (mock *PolarStateDBMock) Selfdestruct6780Calls() []struct { return calls } -// SetBalance calls SetBalanceFunc. -func (mock *PolarStateDBMock) SetBalance(addr common.Address, amount *big.Int) { - if mock.SetBalanceFunc == nil { - panic("PolarStateDBMock.SetBalanceFunc: method is nil but PolarStateDB.SetBalance was just called") - } - callInfo := struct { - Addr common.Address - Amount *big.Int - }{ - Addr: addr, - Amount: amount, - } - mock.lockSetBalance.Lock() - mock.calls.SetBalance = append(mock.calls.SetBalance, callInfo) - mock.lockSetBalance.Unlock() - mock.SetBalanceFunc(addr, amount) -} - -// SetBalanceCalls gets all the calls that were made to SetBalance. -// Check the length with: -// -// len(mockedPolarStateDB.SetBalanceCalls()) -func (mock *PolarStateDBMock) SetBalanceCalls() []struct { - Addr common.Address - Amount *big.Int -} { - var calls []struct { - Addr common.Address - Amount *big.Int - } - mock.lockSetBalance.RLock() - calls = mock.calls.SetBalance - mock.lockSetBalance.RUnlock() - return calls -} - // SetCode calls SetCodeFunc. func (mock *PolarStateDBMock) SetCode(address common.Address, bytes []byte) { if mock.SetCodeFunc == nil { @@ -2206,42 +1446,6 @@ func (mock *PolarStateDBMock) SetStateCalls() []struct { return calls } -// SetStorage calls SetStorageFunc. -func (mock *PolarStateDBMock) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { - if mock.SetStorageFunc == nil { - panic("PolarStateDBMock.SetStorageFunc: method is nil but PolarStateDB.SetStorage was just called") - } - callInfo := struct { - Addr common.Address - Storage map[common.Hash]common.Hash - }{ - Addr: addr, - Storage: storage, - } - mock.lockSetStorage.Lock() - mock.calls.SetStorage = append(mock.calls.SetStorage, callInfo) - mock.lockSetStorage.Unlock() - mock.SetStorageFunc(addr, storage) -} - -// SetStorageCalls gets all the calls that were made to SetStorage. -// Check the length with: -// -// len(mockedPolarStateDB.SetStorageCalls()) -func (mock *PolarStateDBMock) SetStorageCalls() []struct { - Addr common.Address - Storage map[common.Hash]common.Hash -} { - var calls []struct { - Addr common.Address - Storage map[common.Hash]common.Hash - } - mock.lockSetStorage.RLock() - calls = mock.calls.SetStorage - mock.lockSetStorage.RUnlock() - return calls -} - // SetTransientState calls SetTransientStateFunc. func (mock *PolarStateDBMock) SetTransientState(addr common.Address, key common.Hash, value common.Hash) { if mock.SetTransientStateFunc == nil { @@ -2282,42 +1486,6 @@ func (mock *PolarStateDBMock) SetTransientStateCalls() []struct { return calls } -// SetTxContext calls SetTxContextFunc. -func (mock *PolarStateDBMock) SetTxContext(thash common.Hash, ti int) { - if mock.SetTxContextFunc == nil { - panic("PolarStateDBMock.SetTxContextFunc: method is nil but PolarStateDB.SetTxContext was just called") - } - callInfo := struct { - Thash common.Hash - Ti int - }{ - Thash: thash, - Ti: ti, - } - mock.lockSetTxContext.Lock() - mock.calls.SetTxContext = append(mock.calls.SetTxContext, callInfo) - mock.lockSetTxContext.Unlock() - mock.SetTxContextFunc(thash, ti) -} - -// SetTxContextCalls gets all the calls that were made to SetTxContext. -// Check the length with: -// -// len(mockedPolarStateDB.SetTxContextCalls()) -func (mock *PolarStateDBMock) SetTxContextCalls() []struct { - Thash common.Hash - Ti int -} { - var calls []struct { - Thash common.Hash - Ti int - } - mock.lockSetTxContext.RLock() - calls = mock.calls.SetTxContext - mock.lockSetTxContext.RUnlock() - return calls -} - // SlotInAccessList calls SlotInAccessListFunc. func (mock *PolarStateDBMock) SlotInAccessList(addr common.Address, slot common.Hash) (bool, bool) { if mock.SlotInAccessListFunc == nil { @@ -2381,65 +1549,6 @@ func (mock *PolarStateDBMock) SnapshotCalls() []struct { return calls } -// StartPrefetcher calls StartPrefetcherFunc. -func (mock *PolarStateDBMock) StartPrefetcher(namespace string) { - if mock.StartPrefetcherFunc == nil { - panic("PolarStateDBMock.StartPrefetcherFunc: method is nil but PolarStateDB.StartPrefetcher was just called") - } - callInfo := struct { - Namespace string - }{ - Namespace: namespace, - } - mock.lockStartPrefetcher.Lock() - mock.calls.StartPrefetcher = append(mock.calls.StartPrefetcher, callInfo) - mock.lockStartPrefetcher.Unlock() - mock.StartPrefetcherFunc(namespace) -} - -// StartPrefetcherCalls gets all the calls that were made to StartPrefetcher. -// Check the length with: -// -// len(mockedPolarStateDB.StartPrefetcherCalls()) -func (mock *PolarStateDBMock) StartPrefetcherCalls() []struct { - Namespace string -} { - var calls []struct { - Namespace string - } - mock.lockStartPrefetcher.RLock() - calls = mock.calls.StartPrefetcher - mock.lockStartPrefetcher.RUnlock() - return calls -} - -// StopPrefetcher calls StopPrefetcherFunc. -func (mock *PolarStateDBMock) StopPrefetcher() { - if mock.StopPrefetcherFunc == nil { - panic("PolarStateDBMock.StopPrefetcherFunc: method is nil but PolarStateDB.StopPrefetcher was just called") - } - callInfo := struct { - }{} - mock.lockStopPrefetcher.Lock() - mock.calls.StopPrefetcher = append(mock.calls.StopPrefetcher, callInfo) - mock.lockStopPrefetcher.Unlock() - mock.StopPrefetcherFunc() -} - -// StopPrefetcherCalls gets all the calls that were made to StopPrefetcher. -// Check the length with: -// -// len(mockedPolarStateDB.StopPrefetcherCalls()) -func (mock *PolarStateDBMock) StopPrefetcherCalls() []struct { -} { - var calls []struct { - } - mock.lockStopPrefetcher.RLock() - calls = mock.calls.StopPrefetcher - mock.lockStopPrefetcher.RUnlock() - return calls -} - // SubBalance calls SubBalanceFunc. func (mock *PolarStateDBMock) SubBalance(address common.Address, intMoqParam *big.Int) { if mock.SubBalanceFunc == nil { @@ -2507,30 +1616,3 @@ func (mock *PolarStateDBMock) SubRefundCalls() []struct { mock.lockSubRefund.RUnlock() return calls } - -// TxIndex calls TxIndexFunc. -func (mock *PolarStateDBMock) TxIndex() int { - if mock.TxIndexFunc == nil { - panic("PolarStateDBMock.TxIndexFunc: method is nil but PolarStateDB.TxIndex was just called") - } - callInfo := struct { - }{} - mock.lockTxIndex.Lock() - mock.calls.TxIndex = append(mock.calls.TxIndex, callInfo) - mock.lockTxIndex.Unlock() - return mock.TxIndexFunc() -} - -// TxIndexCalls gets all the calls that were made to TxIndex. -// Check the length with: -// -// len(mockedPolarStateDB.TxIndexCalls()) -func (mock *PolarStateDBMock) TxIndexCalls() []struct { -} { - var calls []struct { - } - mock.lockTxIndex.RLock() - calls = mock.calls.TxIndex - mock.lockTxIndex.RUnlock() - return calls -} diff --git a/eth/go.mod b/eth/go.mod index fc89a05ce0..ece59b39bc 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 require ( github.com/ethereum/go-ethereum v1.13.1 diff --git a/eth/go.sum b/eth/go.sum index 0355afeced..13a55540e9 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -12,8 +12,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4 h1:t8fKaxVPovG95BUX62QX1DaJld0Uk5Hi9DtDQphIWR0= -github.com/berachain/polaris-geth v0.0.0-20231005195105-e21d980905b4/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= diff --git a/go.work.sum b/go.work.sum index cf17c48c90..f381a18609 100644 --- a/go.work.sum +++ b/go.work.sum @@ -436,7 +436,8 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= +github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= @@ -452,7 +453,6 @@ github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMr github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= @@ -472,7 +472,6 @@ github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= @@ -492,10 +491,8 @@ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= -github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= -github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= @@ -513,8 +510,6 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaI github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= @@ -571,36 +566,11 @@ github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= @@ -612,13 +582,10 @@ github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtX github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= @@ -651,8 +618,6 @@ github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= @@ -665,6 +630,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= @@ -684,7 +651,6 @@ github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= @@ -713,7 +679,6 @@ github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqA github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= @@ -841,8 +806,6 @@ github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzH github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= @@ -884,197 +847,22 @@ go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= From 348b172df078d25701c7f4ab64740932abba3ff0 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sun, 8 Oct 2023 11:00:27 -0400 Subject: [PATCH 076/122] chore(testing): remove unused code --- .../types/mock/interfaces/mock/sdk.mock.go | 353 ---------- cosmos/testing/types/mock/interfaces/types.go | 36 -- cosmos/testing/types/mock/types.go | 54 -- cosmos/testing/utils/bank.go | 19 - cosmos/x/evm/genesis_test.go | 2 - x/evm/types/tx.pb.go | 608 ------------------ 6 files changed, 1072 deletions(-) delete mode 100644 cosmos/testing/types/mock/interfaces/mock/sdk.mock.go delete mode 100644 cosmos/testing/types/mock/interfaces/types.go delete mode 100644 cosmos/testing/types/mock/types.go delete mode 100644 x/evm/types/tx.pb.go diff --git a/cosmos/testing/types/mock/interfaces/mock/sdk.mock.go b/cosmos/testing/types/mock/interfaces/mock/sdk.mock.go deleted file mode 100644 index cb7047630d..0000000000 --- a/cosmos/testing/types/mock/interfaces/mock/sdk.mock.go +++ /dev/null @@ -1,353 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package mock - -import ( - "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - "github.com/cosmos/gogoproto/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "pkg.berachain.dev/polaris/cosmos/testing/types/mock/interfaces" - "sync" -) - -// Ensure, that MsgMock does implement interfaces.Msg. -// If this is not the case, regenerate this file with moq. -var _ interfaces.Msg = &MsgMock{} - -// MsgMock is a mock implementation of interfaces.Msg. -// -// func TestSomethingThatUsesMsg(t *testing.T) { -// -// // make and configure a mocked interfaces.Msg -// mockedMsg := &MsgMock{ -// ProtoMessageFunc: func() { -// panic("mock out the ProtoMessage method") -// }, -// ResetFunc: func() { -// panic("mock out the Reset method") -// }, -// StringFunc: func() string { -// panic("mock out the String method") -// }, -// } -// -// // use mockedMsg in code that requires interfaces.Msg -// // and then make assertions. -// -// } -type MsgMock struct { - // ProtoMessageFunc mocks the ProtoMessage method. - ProtoMessageFunc func() - - // ResetFunc mocks the Reset method. - ResetFunc func() - - // StringFunc mocks the String method. - StringFunc func() string - - // calls tracks calls to the methods. - calls struct { - // ProtoMessage holds details about calls to the ProtoMessage method. - ProtoMessage []struct { - } - // Reset holds details about calls to the Reset method. - Reset []struct { - } - // String holds details about calls to the String method. - String []struct { - } - } - lockProtoMessage sync.RWMutex - lockReset sync.RWMutex - lockString sync.RWMutex -} - -// ProtoMessage calls ProtoMessageFunc. -func (mock *MsgMock) ProtoMessage() { - if mock.ProtoMessageFunc == nil { - panic("MsgMock.ProtoMessageFunc: method is nil but Msg.ProtoMessage was just called") - } - callInfo := struct { - }{} - mock.lockProtoMessage.Lock() - mock.calls.ProtoMessage = append(mock.calls.ProtoMessage, callInfo) - mock.lockProtoMessage.Unlock() - mock.ProtoMessageFunc() -} - -// ProtoMessageCalls gets all the calls that were made to ProtoMessage. -// Check the length with: -// -// len(mockedMsg.ProtoMessageCalls()) -func (mock *MsgMock) ProtoMessageCalls() []struct { -} { - var calls []struct { - } - mock.lockProtoMessage.RLock() - calls = mock.calls.ProtoMessage - mock.lockProtoMessage.RUnlock() - return calls -} - -// Reset calls ResetFunc. -func (mock *MsgMock) Reset() { - if mock.ResetFunc == nil { - panic("MsgMock.ResetFunc: method is nil but Msg.Reset was just called") - } - callInfo := struct { - }{} - mock.lockReset.Lock() - mock.calls.Reset = append(mock.calls.Reset, callInfo) - mock.lockReset.Unlock() - mock.ResetFunc() -} - -// ResetCalls gets all the calls that were made to Reset. -// Check the length with: -// -// len(mockedMsg.ResetCalls()) -func (mock *MsgMock) ResetCalls() []struct { -} { - var calls []struct { - } - mock.lockReset.RLock() - calls = mock.calls.Reset - mock.lockReset.RUnlock() - return calls -} - -// String calls StringFunc. -func (mock *MsgMock) String() string { - if mock.StringFunc == nil { - panic("MsgMock.StringFunc: method is nil but Msg.String was just called") - } - callInfo := struct { - }{} - mock.lockString.Lock() - mock.calls.String = append(mock.calls.String, callInfo) - mock.lockString.Unlock() - return mock.StringFunc() -} - -// StringCalls gets all the calls that were made to String. -// Check the length with: -// -// len(mockedMsg.StringCalls()) -func (mock *MsgMock) StringCalls() []struct { -} { - var calls []struct { - } - mock.lockString.RLock() - calls = mock.calls.String - mock.lockString.RUnlock() - return calls -} - -// Ensure, that TxMock does implement interfaces.Tx. -// If this is not the case, regenerate this file with moq. -var _ interfaces.Tx = &TxMock{} - -// TxMock is a mock implementation of interfaces.Tx. -// -// func TestSomethingThatUsesTx(t *testing.T) { -// -// // make and configure a mocked interfaces.Tx -// mockedTx := &TxMock{ -// GetMsgsFunc: func() []proto.Message { -// panic("mock out the GetMsgs method") -// }, -// GetMsgsV2Func: func() ([]protoreflect.ProtoMessage, error) { -// panic("mock out the GetMsgsV2 method") -// }, -// GetPubKeysFunc: func() ([]types.PubKey, error) { -// panic("mock out the GetPubKeys method") -// }, -// GetSignaturesV2Func: func() ([]signing.SignatureV2, error) { -// panic("mock out the GetSignaturesV2 method") -// }, -// GetSignersFunc: func() ([][]byte, error) { -// panic("mock out the GetSigners method") -// }, -// } -// -// // use mockedTx in code that requires interfaces.Tx -// // and then make assertions. -// -// } -type TxMock struct { - // GetMsgsFunc mocks the GetMsgs method. - GetMsgsFunc func() []proto.Message - - // GetMsgsV2Func mocks the GetMsgsV2 method. - GetMsgsV2Func func() ([]protoreflect.ProtoMessage, error) - - // GetPubKeysFunc mocks the GetPubKeys method. - GetPubKeysFunc func() ([]types.PubKey, error) - - // GetSignaturesV2Func mocks the GetSignaturesV2 method. - GetSignaturesV2Func func() ([]signing.SignatureV2, error) - - // GetSignersFunc mocks the GetSigners method. - GetSignersFunc func() ([][]byte, error) - - // calls tracks calls to the methods. - calls struct { - // GetMsgs holds details about calls to the GetMsgs method. - GetMsgs []struct { - } - // GetMsgsV2 holds details about calls to the GetMsgsV2 method. - GetMsgsV2 []struct { - } - // GetPubKeys holds details about calls to the GetPubKeys method. - GetPubKeys []struct { - } - // GetSignaturesV2 holds details about calls to the GetSignaturesV2 method. - GetSignaturesV2 []struct { - } - // GetSigners holds details about calls to the GetSigners method. - GetSigners []struct { - } - } - lockGetMsgs sync.RWMutex - lockGetMsgsV2 sync.RWMutex - lockGetPubKeys sync.RWMutex - lockGetSignaturesV2 sync.RWMutex - lockGetSigners sync.RWMutex -} - -// GetMsgs calls GetMsgsFunc. -func (mock *TxMock) GetMsgs() []proto.Message { - if mock.GetMsgsFunc == nil { - panic("TxMock.GetMsgsFunc: method is nil but Tx.GetMsgs was just called") - } - callInfo := struct { - }{} - mock.lockGetMsgs.Lock() - mock.calls.GetMsgs = append(mock.calls.GetMsgs, callInfo) - mock.lockGetMsgs.Unlock() - return mock.GetMsgsFunc() -} - -// GetMsgsCalls gets all the calls that were made to GetMsgs. -// Check the length with: -// -// len(mockedTx.GetMsgsCalls()) -func (mock *TxMock) GetMsgsCalls() []struct { -} { - var calls []struct { - } - mock.lockGetMsgs.RLock() - calls = mock.calls.GetMsgs - mock.lockGetMsgs.RUnlock() - return calls -} - -// GetMsgsV2 calls GetMsgsV2Func. -func (mock *TxMock) GetMsgsV2() ([]protoreflect.ProtoMessage, error) { - if mock.GetMsgsV2Func == nil { - panic("TxMock.GetMsgsV2Func: method is nil but Tx.GetMsgsV2 was just called") - } - callInfo := struct { - }{} - mock.lockGetMsgsV2.Lock() - mock.calls.GetMsgsV2 = append(mock.calls.GetMsgsV2, callInfo) - mock.lockGetMsgsV2.Unlock() - return mock.GetMsgsV2Func() -} - -// GetMsgsV2Calls gets all the calls that were made to GetMsgsV2. -// Check the length with: -// -// len(mockedTx.GetMsgsV2Calls()) -func (mock *TxMock) GetMsgsV2Calls() []struct { -} { - var calls []struct { - } - mock.lockGetMsgsV2.RLock() - calls = mock.calls.GetMsgsV2 - mock.lockGetMsgsV2.RUnlock() - return calls -} - -// GetPubKeys calls GetPubKeysFunc. -func (mock *TxMock) GetPubKeys() ([]types.PubKey, error) { - if mock.GetPubKeysFunc == nil { - panic("TxMock.GetPubKeysFunc: method is nil but Tx.GetPubKeys was just called") - } - callInfo := struct { - }{} - mock.lockGetPubKeys.Lock() - mock.calls.GetPubKeys = append(mock.calls.GetPubKeys, callInfo) - mock.lockGetPubKeys.Unlock() - return mock.GetPubKeysFunc() -} - -// GetPubKeysCalls gets all the calls that were made to GetPubKeys. -// Check the length with: -// -// len(mockedTx.GetPubKeysCalls()) -func (mock *TxMock) GetPubKeysCalls() []struct { -} { - var calls []struct { - } - mock.lockGetPubKeys.RLock() - calls = mock.calls.GetPubKeys - mock.lockGetPubKeys.RUnlock() - return calls -} - -// GetSignaturesV2 calls GetSignaturesV2Func. -func (mock *TxMock) GetSignaturesV2() ([]signing.SignatureV2, error) { - if mock.GetSignaturesV2Func == nil { - panic("TxMock.GetSignaturesV2Func: method is nil but Tx.GetSignaturesV2 was just called") - } - callInfo := struct { - }{} - mock.lockGetSignaturesV2.Lock() - mock.calls.GetSignaturesV2 = append(mock.calls.GetSignaturesV2, callInfo) - mock.lockGetSignaturesV2.Unlock() - return mock.GetSignaturesV2Func() -} - -// GetSignaturesV2Calls gets all the calls that were made to GetSignaturesV2. -// Check the length with: -// -// len(mockedTx.GetSignaturesV2Calls()) -func (mock *TxMock) GetSignaturesV2Calls() []struct { -} { - var calls []struct { - } - mock.lockGetSignaturesV2.RLock() - calls = mock.calls.GetSignaturesV2 - mock.lockGetSignaturesV2.RUnlock() - return calls -} - -// GetSigners calls GetSignersFunc. -func (mock *TxMock) GetSigners() ([][]byte, error) { - if mock.GetSignersFunc == nil { - panic("TxMock.GetSignersFunc: method is nil but Tx.GetSigners was just called") - } - callInfo := struct { - }{} - mock.lockGetSigners.Lock() - mock.calls.GetSigners = append(mock.calls.GetSigners, callInfo) - mock.lockGetSigners.Unlock() - return mock.GetSignersFunc() -} - -// GetSignersCalls gets all the calls that were made to GetSigners. -// Check the length with: -// -// len(mockedTx.GetSignersCalls()) -func (mock *TxMock) GetSignersCalls() []struct { -} { - var calls []struct { - } - mock.lockGetSigners.RLock() - calls = mock.calls.GetSigners - mock.lockGetSigners.RUnlock() - return calls -} diff --git a/cosmos/testing/types/mock/interfaces/types.go b/cosmos/testing/types/mock/interfaces/types.go deleted file mode 100644 index e23ad1d87d..0000000000 --- a/cosmos/testing/types/mock/interfaces/types.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package interfaces - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/signing" -) - -// Interface wrappers for mocking -// -//go:generate moq -out ./mock/sdk.mock.go -pkg mock . Msg Tx -type ( - // TxMsg wrapper for github.com/cosmos/cosmos-sdk/types.TxMsg. - Msg sdk.Msg - // Tx wrapper for github.com/cosmos/cosmos-sdk/x/auth/signing.Tx. - Tx signing.SigVerifiableTx -) diff --git a/cosmos/testing/types/mock/types.go b/cosmos/testing/types/mock/types.go deleted file mode 100644 index 58c4dac14f..0000000000 --- a/cosmos/testing/types/mock/types.go +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mock - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/cosmos/testing/types/mock/interfaces/mock" -) - -// FakeMsg is a mock implementation of sdk.Msg for testing purposes. -func NewMsg() *mock.MsgMock { - mockedMsg := &mock.MsgMock{ - ProtoMessageFunc: func() { - panic("mock out the ProtoMessage method") - }, - ResetFunc: func() { - panic("mock out the Reset method") - }, - StringFunc: func() string { - panic("mock out the String method") - }, - } - return mockedMsg -} - -// FakeMsg is a mock implementation of sdk.Msg for testing purposes. -func NewTx() *mock.TxMock { - // make and configure a mocked interfaces.Tx - mockedTx := &mock.TxMock{ - GetMsgsFunc: func() []sdk.Msg { - panic("mock out the GetMsgs method") - }, - } - return mockedTx -} diff --git a/cosmos/testing/utils/bank.go b/cosmos/testing/utils/bank.go index 775b416709..07509382f8 100644 --- a/cosmos/testing/utils/bank.go +++ b/cosmos/testing/utils/bank.go @@ -49,22 +49,3 @@ func MintCoinsToAddress( // Send the bank denomination to the receipient. return bk.SendCoinsFromModuleToAccount(ctx, moduleAcc, recipient.Bytes(), coins) } - -// BurnCoinsFromAddress burns coins from a given address. -func BurnCoinsFromAddress( - ctx context.Context, - bk BankKeeper, - moduleAcc string, - sender common.Address, - denom string, - amount *big.Int, -) error { - // Burn the corresponding bank denom. - coins := sdk.Coins{{Denom: denom, Amount: sdkmath.NewIntFromBigInt(amount)}} - if err := bk.SendCoinsFromAccountToModule(ctx, sender.Bytes(), moduleAcc, coins); err != nil { - return err - } - - // Burn the bank denomination. - return bk.BurnCoins(ctx, moduleAcc, coins) -} diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 1c3a3ea4d9..644e4d6cb2 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -35,7 +35,6 @@ import ( "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" - "pkg.berachain.dev/polaris/cosmos/testing/types/mock" testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" "pkg.berachain.dev/polaris/cosmos/x/evm" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -66,7 +65,6 @@ var _ = Describe("", func() { BeforeEach(func() { ctx, ak, _, sk = testutil.SetupMinimalKeepers() - ctx = ctx.WithMultiStore(mock.NewMultiStore()) ctx = ctx.WithBlockHeight(0) sc = staking.NewPrecompileContract(ak, &sk) cfg := config.DefaultConfig() diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go deleted file mode 100644 index 008ad571aa..0000000000 --- a/x/evm/types/tx.pb.go +++ /dev/null @@ -1,608 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: polaris/evm/v1alpha1/tx.proto - -package types - -import ( - context "context" - fmt "fmt" - _ "github.com/cosmos/cosmos-sdk/types/msgservice" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Status represents the status of a transaction. -type Status int32 - -const ( - // STATUS_REVERT_UNSPECIFIED indicates that the transaction reverted. - Status_STATUS_REVERT_UNSPECIFIED Status = 0 - // STATUS_SUCCESS indicates that the transaction completed successfully. - Status_STATUS_SUCCESS Status = 1 - // STATUS_NOT_INCLUDED indicates that the transaction was not included in the - // `evm` block, due to an critical error. - Status_STATUS_NOT_INCLUDED Status = 2 -) - -var Status_name = map[int32]string{ - 0: "STATUS_REVERT_UNSPECIFIED", - 1: "STATUS_SUCCESS", - 2: "STATUS_NOT_INCLUDED", -} - -var Status_value = map[string]int32{ - "STATUS_REVERT_UNSPECIFIED": 0, - "STATUS_SUCCESS": 1, - "STATUS_NOT_INCLUDED": 2, -} - -func (x Status) String() string { - return proto.EnumName(Status_name, int32(x)) -} - -func (Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d8b33d2a2c64400f, []int{0} -} - -// WrappedEthereumTransaction encapsulates an Ethereum transaction as an SDK message. -type WrappedEthereumTransaction struct { - // data is inner transaction data of the Ethereum transaction. - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *WrappedEthereumTransaction) Reset() { *m = WrappedEthereumTransaction{} } -func (m *WrappedEthereumTransaction) String() string { return proto.CompactTextString(m) } -func (*WrappedEthereumTransaction) ProtoMessage() {} -func (*WrappedEthereumTransaction) Descriptor() ([]byte, []int) { - return fileDescriptor_d8b33d2a2c64400f, []int{0} -} -func (m *WrappedEthereumTransaction) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WrappedEthereumTransaction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WrappedEthereumTransaction.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *WrappedEthereumTransaction) XXX_Merge(src proto.Message) { - xxx_messageInfo_WrappedEthereumTransaction.Merge(m, src) -} -func (m *WrappedEthereumTransaction) XXX_Size() int { - return m.Size() -} -func (m *WrappedEthereumTransaction) XXX_DiscardUnknown() { - xxx_messageInfo_WrappedEthereumTransaction.DiscardUnknown(m) -} - -var xxx_messageInfo_WrappedEthereumTransaction proto.InternalMessageInfo - -func (m *WrappedEthereumTransaction) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -// WrappedEthereumTransactionResult defines the Msg/EthereumTx response type. -type WrappedEthereumTransactionResult struct { - // `status` represents a transaction's status - Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=polaris.evm.v1alpha1.Status" json:"status,omitempty"` -} - -func (m *WrappedEthereumTransactionResult) Reset() { *m = WrappedEthereumTransactionResult{} } -func (m *WrappedEthereumTransactionResult) String() string { return proto.CompactTextString(m) } -func (*WrappedEthereumTransactionResult) ProtoMessage() {} -func (*WrappedEthereumTransactionResult) Descriptor() ([]byte, []int) { - return fileDescriptor_d8b33d2a2c64400f, []int{1} -} -func (m *WrappedEthereumTransactionResult) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WrappedEthereumTransactionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WrappedEthereumTransactionResult.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *WrappedEthereumTransactionResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_WrappedEthereumTransactionResult.Merge(m, src) -} -func (m *WrappedEthereumTransactionResult) XXX_Size() int { - return m.Size() -} -func (m *WrappedEthereumTransactionResult) XXX_DiscardUnknown() { - xxx_messageInfo_WrappedEthereumTransactionResult.DiscardUnknown(m) -} - -var xxx_messageInfo_WrappedEthereumTransactionResult proto.InternalMessageInfo - -func (m *WrappedEthereumTransactionResult) GetStatus() Status { - if m != nil { - return m.Status - } - return Status_STATUS_REVERT_UNSPECIFIED -} - -func init() { - proto.RegisterEnum("polaris.evm.v1alpha1.Status", Status_name, Status_value) - proto.RegisterType((*WrappedEthereumTransaction)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransaction") - proto.RegisterType((*WrappedEthereumTransactionResult)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransactionResult") -} - -func init() { proto.RegisterFile("polaris/evm/v1alpha1/tx.proto", fileDescriptor_d8b33d2a2c64400f) } - -var fileDescriptor_d8b33d2a2c64400f = []byte{ - // 351 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0xc8, 0xcf, 0x49, - 0x2c, 0xca, 0x2c, 0xd6, 0x4f, 0x2d, 0xcb, 0xd5, 0x2f, 0x33, 0x4c, 0xcc, 0x29, 0xc8, 0x48, 0x34, - 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0x4a, 0xeb, 0xa5, 0x96, - 0xe5, 0xea, 0xc1, 0xa4, 0xa5, 0xc4, 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, - 0xf5, 0xcb, 0x0c, 0x41, 0x14, 0x44, 0xb9, 0x92, 0x01, 0x97, 0x54, 0x78, 0x51, 0x62, 0x41, 0x41, - 0x6a, 0x8a, 0x6b, 0x49, 0x46, 0x6a, 0x51, 0x6a, 0x69, 0x6e, 0x48, 0x51, 0x62, 0x5e, 0x71, 0x62, - 0x72, 0x49, 0x66, 0x7e, 0x9e, 0x90, 0x10, 0x17, 0x4b, 0x4a, 0x62, 0x49, 0xa2, 0x04, 0xa3, 0x02, - 0xa3, 0x06, 0x4f, 0x10, 0x98, 0xad, 0x14, 0xc1, 0xa5, 0x80, 0x5b, 0x47, 0x50, 0x6a, 0x71, 0x69, - 0x4e, 0x89, 0x90, 0x09, 0x17, 0x5b, 0x71, 0x49, 0x62, 0x49, 0x69, 0x31, 0x58, 0x27, 0x9f, 0x91, - 0x8c, 0x1e, 0x36, 0x57, 0xe9, 0x05, 0x83, 0xd5, 0x04, 0x41, 0xd5, 0x6a, 0x85, 0x70, 0xb1, 0x41, - 0x44, 0x84, 0x64, 0xb9, 0x24, 0x83, 0x43, 0x1c, 0x43, 0x42, 0x83, 0xe3, 0x83, 0x5c, 0xc3, 0x5c, - 0x83, 0x42, 0xe2, 0x43, 0xfd, 0x82, 0x03, 0x5c, 0x9d, 0x3d, 0xdd, 0x3c, 0x5d, 0x5d, 0x04, 0x18, - 0x84, 0x84, 0xb8, 0xf8, 0xa0, 0xd2, 0xc1, 0xa1, 0xce, 0xce, 0xae, 0xc1, 0xc1, 0x02, 0x8c, 0x42, - 0xe2, 0x5c, 0xc2, 0x50, 0x31, 0x3f, 0xff, 0x90, 0x78, 0x4f, 0x3f, 0x67, 0x9f, 0x50, 0x17, 0x57, - 0x17, 0x01, 0x26, 0xa3, 0x7e, 0x46, 0x2e, 0x2e, 0xdf, 0xe2, 0xf4, 0xe0, 0xd4, 0xa2, 0xb2, 0xcc, - 0xe4, 0x54, 0xa1, 0x2a, 0x2e, 0x3e, 0xd7, 0x92, 0x0c, 0x64, 0x4f, 0x1a, 0x60, 0x77, 0x1c, 0x6e, - 0x4f, 0x4a, 0x99, 0x91, 0xaa, 0x03, 0x12, 0x2c, 0x52, 0xac, 0x0d, 0xcf, 0x37, 0x68, 0x31, 0x3a, - 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, - 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x41, 0x76, 0xba, - 0x5e, 0x52, 0x6a, 0x51, 0x62, 0x72, 0x46, 0x62, 0x66, 0x9e, 0x5e, 0x4a, 0x6a, 0x99, 0x3e, 0x2c, - 0xb6, 0xa1, 0x11, 0x58, 0x01, 0x8e, 0xf6, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0x70, 0x14, - 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x62, 0x15, 0x3f, 0x12, 0x12, 0x02, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgServiceClient is the client API for MsgService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgServiceClient interface { - // EthTransaction defines a method submitting Ethereum transactions. - EthTransaction(ctx context.Context, in *WrappedEthereumTransaction, opts ...grpc.CallOption) (*WrappedEthereumTransactionResult, error) -} - -type msgServiceClient struct { - cc grpc1.ClientConn -} - -func NewMsgServiceClient(cc grpc1.ClientConn) MsgServiceClient { - return &msgServiceClient{cc} -} - -func (c *msgServiceClient) EthTransaction(ctx context.Context, in *WrappedEthereumTransaction, opts ...grpc.CallOption) (*WrappedEthereumTransactionResult, error) { - out := new(WrappedEthereumTransactionResult) - err := c.cc.Invoke(ctx, "/polaris.evm.v1alpha1.MsgService/EthTransaction", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServiceServer is the server API for MsgService service. -type MsgServiceServer interface { - // EthTransaction defines a method submitting Ethereum transactions. - EthTransaction(context.Context, *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) -} - -// UnimplementedMsgServiceServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServiceServer struct { -} - -func (*UnimplementedMsgServiceServer) EthTransaction(ctx context.Context, req *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) { - return nil, status.Errorf(codes.Unimplemented, "method EthTransaction not implemented") -} - -func RegisterMsgServiceServer(s grpc1.Server, srv MsgServiceServer) { - s.RegisterService(&_MsgService_serviceDesc, srv) -} - -func _MsgService_EthTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(WrappedEthereumTransaction) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServiceServer).EthTransaction(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/polaris.evm.v1alpha1.MsgService/EthTransaction", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServiceServer).EthTransaction(ctx, req.(*WrappedEthereumTransaction)) - } - return interceptor(ctx, in, info, handler) -} - -var _MsgService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "polaris.evm.v1alpha1.MsgService", - HandlerType: (*MsgServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "EthTransaction", - Handler: _MsgService_EthTransaction_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "polaris/evm/v1alpha1/tx.proto", -} - -func (m *WrappedEthereumTransaction) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WrappedEthereumTransaction) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WrappedEthereumTransaction) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WrappedEthereumTransactionResult) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WrappedEthereumTransactionResult) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WrappedEthereumTransactionResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Status != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.Status)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *WrappedEthereumTransaction) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *WrappedEthereumTransactionResult) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Status != 0 { - n += 1 + sovTx(uint64(m.Status)) - } - return n -} - -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *WrappedEthereumTransaction) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: WrappedEthereumTransaction: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WrappedEthereumTransaction: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *WrappedEthereumTransactionResult) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: WrappedEthereumTransactionResult: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WrappedEthereumTransactionResult: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - m.Status = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Status |= Status(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTx(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTx - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTx - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTx - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") -) From cc9e8f7fea9db97873d8d555bc6d0a48b51d4bcc Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sun, 8 Oct 2023 19:35:36 -0400 Subject: [PATCH 077/122] refactor(testing): Multi and KVStore testing improvements (#1194) ### Summary by CodeRabbit **Refactor:** - Updated the package import paths and refactored the code to use a new logging system across multiple modules. - Modified the `ReadOnlyStore` to use a different underlying data store. - Refactored the `testutil` package for better organization and usage across tests. **Test:** - Enhanced test setup functions to include a logger for better test logging. - Updated test cases to use the new logger and the refactored `testutil` package. **Chore:** - Renamed the package from "utils" to "testutil" for better clarity and consistency. --- cosmos/precompile/bank/bank_test.go | 11 +- .../distribution/distribution_test.go | 15 +- .../precompile/governance/governance_test.go | 2 +- cosmos/precompile/governance/testutil.go | 10 +- cosmos/precompile/staking/staking_test.go | 5 +- cosmos/store/cachekv/readonly_store.go | 6 +- cosmos/store/cachekv/readonly_store_test.go | 13 +- .../types/mock/interfaces/mock/store.mock.go | 1431 ----------------- cosmos/testing/types/mock/interfaces/store.go | 35 - cosmos/testing/types/mock/store.go | 326 ---- cosmos/{testing/utils => testutil}/bank.go | 2 +- .../{testing/utils => testutil}/interfaces.go | 2 +- cosmos/{testing/utils => testutil}/setup.go | 35 +- cosmos/x/evm/genesis_test.go | 7 +- cosmos/x/evm/keeper/processor_test.go | 6 +- cosmos/x/evm/plugins/block/header_test.go | 11 +- cosmos/x/evm/plugins/gas/plugin_test.go | 15 +- .../x/evm/plugins/historical/plugin_test.go | 6 +- .../plugins/precompile/log/factory_test.go | 5 +- .../x/evm/plugins/precompile/plugin_test.go | 10 +- .../evm/plugins/state/events/manager_test.go | 6 +- cosmos/x/evm/plugins/state/genesis_test.go | 6 +- .../plugins/state/plugin_benchmark_test.go | 6 +- cosmos/x/evm/plugins/state/plugin_test.go | 8 +- 24 files changed, 113 insertions(+), 1866 deletions(-) delete mode 100644 cosmos/testing/types/mock/interfaces/mock/store.mock.go delete mode 100644 cosmos/testing/types/mock/interfaces/store.go delete mode 100644 cosmos/testing/types/mock/store.go rename cosmos/{testing/utils => testutil}/bank.go (98%) rename cosmos/{testing/utils => testutil}/interfaces.go (98%) rename cosmos/{testing/utils => testutil}/setup.go (84%) diff --git a/cosmos/precompile/bank/bank_test.go b/cosmos/precompile/bank/bank_test.go index afd570d95b..08bbf414d1 100644 --- a/cosmos/precompile/bank/bank_test.go +++ b/cosmos/precompile/bank/bank_test.go @@ -26,6 +26,7 @@ import ( "math/big" "testing" + "cosmossdk.io/log" sdkmath "cosmossdk.io/math" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" @@ -36,8 +37,8 @@ import ( "pkg.berachain.dev/polaris/cosmos/precompile" "pkg.berachain.dev/polaris/cosmos/precompile/bank" - testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" + testutils "pkg.berachain.dev/polaris/cosmos/testutil" + pclog "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" @@ -57,14 +58,14 @@ var _ = Describe("Bank Precompile Test", func() { var ( contract *bank.Contract addr sdk.AccAddress - factory *log.Factory + factory *pclog.Factory ak authkeeper.AccountKeeperI bk bankkeeper.BaseKeeper ctx context.Context ) BeforeEach(func() { - ctx, ak, bk, _ = testutils.SetupMinimalKeepers() + ctx, ak, bk, _ = testutils.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) contract = utils.MustGetAs[*bank.Contract](bank.NewPrecompileContract( ak, bankkeeper.NewMsgServerImpl(bk), bk), @@ -72,7 +73,7 @@ var _ = Describe("Bank Precompile Test", func() { addr = sdk.AccAddress([]byte("bank")) // Register the events. - factory = log.NewFactory([]ethprecompile.Registrable{contract}) + factory = pclog.NewFactory([]ethprecompile.Registrable{contract}) }) It("should register the send event", func() { diff --git a/cosmos/precompile/distribution/distribution_test.go b/cosmos/precompile/distribution/distribution_test.go index 558a2c0421..b7c542c447 100644 --- a/cosmos/precompile/distribution/distribution_test.go +++ b/cosmos/precompile/distribution/distribution_test.go @@ -25,6 +25,7 @@ import ( "math/big" "testing" + "cosmossdk.io/log" sdkmath "cosmossdk.io/math" storetypes "cosmossdk.io/store/types" @@ -44,8 +45,8 @@ import ( "github.com/ethereum/go-ethereum/common" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" + pclog "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/lib/utils" @@ -77,7 +78,9 @@ func setup() ( *stakingkeeper.Keeper, *bankkeeper.BaseKeeper, ) { - ctx, ak, bk, sk := testutil.SetupMinimalKeepers() + distrKey := storetypes.NewKVStoreKey(distributiontypes.StoreKey) + ctx, ak, bk, sk := testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT()), + []storetypes.StoreKey{distrKey}...) encCfg := cosmostestutil.MakeTestEncodingConfig( distribution.AppModuleBasic{}, @@ -85,7 +88,7 @@ func setup() ( dk := distrkeeper.NewKeeper( encCfg.Codec, - runtime.NewKVStoreService(storetypes.NewKVStoreKey(distributiontypes.StoreKey)), + runtime.NewKVStoreService(distrKey), ak, bk, sk, @@ -107,7 +110,7 @@ var _ = Describe("Distribution Precompile Test", func() { var ( contract *Contract valAddr sdk.ValAddress - f *log.Factory + f *pclog.Factory amt sdk.Coin ctx sdk.Context @@ -131,7 +134,7 @@ var _ = Describe("Distribution Precompile Test", func() { )) // Register the events. - f = log.NewFactory([]ethprecompile.Registrable{contract}) + f = pclog.NewFactory([]ethprecompile.Registrable{contract}) // Set up the stateful factory. sf = ethprecompile.NewStatefulFactory() diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 614cf7f8bc..9aa4ea2833 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -43,7 +43,7 @@ import ( cbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" - testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutils "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/types" "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" diff --git a/cosmos/precompile/governance/testutil.go b/cosmos/precompile/governance/testutil.go index d0b8dca0b3..d4dfa36d2a 100644 --- a/cosmos/precompile/governance/testutil.go +++ b/cosmos/precompile/governance/testutil.go @@ -26,6 +26,7 @@ import ( "github.com/golang/mock/gomock" + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/baseapp" @@ -43,7 +44,7 @@ import ( v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - testutils "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutils "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/eth/common" //nolint:stylecheck,revive // Ginkgo is the testing framework. @@ -67,7 +68,10 @@ func setupGovTest(ctrl *gomock.Controller, caller sdk.AccAddress) ( sdk.Context, authkeeper.AccountKeeperI, bankkeeper.Keeper, *governancekeeper.Keeper, ) { // Setup the keepers and context. - ctx, ak, bk, sk := testutils.SetupMinimalKeepers() + govKey := storetypes.NewKVStoreKey(governancetypes.StoreKey) + ctx, ak, bk, sk := testutils.SetupMinimalKeepers( + log.NewTestLogger(GinkgoT()), []storetypes.StoreKey{govKey}..., + ) dk := govtestutil.NewMockDistributionKeeper(ctrl) // Create the codec. @@ -94,7 +98,7 @@ func setupGovTest(ctrl *gomock.Controller, caller sdk.AccAddress) ( } gk := governancekeeper.NewKeeper( encCfg.Codec, - runtime.NewKVStoreService(storetypes.NewKVStoreKey(governancetypes.StoreKey)), + runtime.NewKVStoreService(govKey), ak, bk, sk, diff --git a/cosmos/precompile/staking/staking_test.go b/cosmos/precompile/staking/staking_test.go index bb548c9432..b0b345c909 100644 --- a/cosmos/precompile/staking/staking_test.go +++ b/cosmos/precompile/staking/staking_test.go @@ -25,6 +25,7 @@ import ( "math/big" "testing" + "cosmossdk.io/log" sdkmath "cosmossdk.io/math" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -38,7 +39,7 @@ import ( cbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/staking" cosmlib "pkg.berachain.dev/polaris/cosmos/lib" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/eth/accounts/abi" "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" @@ -88,7 +89,7 @@ var _ = Describe("Staking", func() { ) BeforeEach(func() { - sdkCtx, ak, bk, sk = testutil.SetupMinimalKeepers() + sdkCtx, ak, bk, sk = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) contract = libutils.MustGetAs[*Contract](NewPrecompileContract(ak, &sk)) sf = ethprecompile.NewStatefulFactory() }) diff --git a/cosmos/store/cachekv/readonly_store.go b/cosmos/store/cachekv/readonly_store.go index c709167feb..1100b65726 100644 --- a/cosmos/store/cachekv/readonly_store.go +++ b/cosmos/store/cachekv/readonly_store.go @@ -26,14 +26,14 @@ import ( "pkg.berachain.dev/polaris/eth/core/vm" ) -var _ storetypes.CacheKVStore = (*ReadOnlyStore)(nil) +var _ storetypes.KVStore = (*ReadOnlyStore)(nil) // ReadOnlyStore is a wrapper around cachekv.Store that panics on any write operation. type ReadOnlyStore struct { - storetypes.CacheKVStore + storetypes.KVStore } -func NewReadOnlyStoreFor(cacheKVStore storetypes.CacheKVStore) *ReadOnlyStore { +func NewReadOnlyStoreFor(cacheKVStore storetypes.KVStore) *ReadOnlyStore { return &ReadOnlyStore{cacheKVStore} } diff --git a/cosmos/store/cachekv/readonly_store_test.go b/cosmos/store/cachekv/readonly_store_test.go index 427a70f5cd..0b26cfb510 100644 --- a/cosmos/store/cachekv/readonly_store_test.go +++ b/cosmos/store/cachekv/readonly_store_test.go @@ -23,11 +23,11 @@ package cachekv_test import ( "testing" - sdkcachekv "cosmossdk.io/store/cachekv" - storetypes "cosmossdk.io/store/types" + cdb "github.com/cosmos/cosmos-db" + + "cosmossdk.io/store/dbadapter" "pkg.berachain.dev/polaris/cosmos/store/cachekv" - "pkg.berachain.dev/polaris/cosmos/testing/types/mock" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -42,10 +42,9 @@ var _ = Describe("ReadOnly Store", func() { var readOnlyStore *cachekv.ReadOnlyStore BeforeEach(func() { - ms := mock.NewMultiStore() - kv := ms.GetKVStore(storetypes.NewKVStoreKey("test")) - kv.Set([]byte("key"), []byte("value")) - readOnlyStore = cachekv.NewReadOnlyStoreFor(sdkcachekv.NewStore(kv)) + kvStore := dbadapter.Store{DB: cdb.NewMemDB()} + kvStore.Set([]byte("key"), []byte("value")) + readOnlyStore = cachekv.NewReadOnlyStoreFor(kvStore) }) It("should panic only on writes", func() { diff --git a/cosmos/testing/types/mock/interfaces/mock/store.mock.go b/cosmos/testing/types/mock/interfaces/mock/store.mock.go deleted file mode 100644 index ac42b15169..0000000000 --- a/cosmos/testing/types/mock/interfaces/mock/store.mock.go +++ /dev/null @@ -1,1431 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package mock - -import ( - storetypes "cosmossdk.io/store/types" - "github.com/cosmos/cosmos-db" - "io" - "pkg.berachain.dev/polaris/cosmos/testing/types/mock/interfaces" - "sync" -) - -// Ensure, that MultiStoreMock does implement interfaces.MultiStore. -// If this is not the case, regenerate this file with moq. -var _ interfaces.MultiStore = &MultiStoreMock{} - -// MultiStoreMock is a mock implementation of interfaces.MultiStore. -// -// func TestSomethingThatUsesMultiStore(t *testing.T) { -// -// // make and configure a mocked interfaces.MultiStore -// mockedMultiStore := &MultiStoreMock{ -// CacheMultiStoreFunc: func() storetypes.CacheMultiStore { -// panic("mock out the CacheMultiStore method") -// }, -// CacheMultiStoreWithVersionFunc: func(version int64) (storetypes.CacheMultiStore, error) { -// panic("mock out the CacheMultiStoreWithVersion method") -// }, -// CacheWrapFunc: func() storetypes.CacheWrap { -// panic("mock out the CacheWrap method") -// }, -// CacheWrapWithTraceFunc: func(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap { -// panic("mock out the CacheWrapWithTrace method") -// }, -// GetKVStoreFunc: func(storeKey storetypes.StoreKey) storetypes.KVStore { -// panic("mock out the GetKVStore method") -// }, -// GetStoreFunc: func(storeKey storetypes.StoreKey) storetypes.Store { -// panic("mock out the GetStore method") -// }, -// GetStoreTypeFunc: func() storetypes.StoreType { -// panic("mock out the GetStoreType method") -// }, -// LatestVersionFunc: func() int64 { -// panic("mock out the LatestVersion method") -// }, -// SetTracerFunc: func(w io.Writer) storetypes.MultiStore { -// panic("mock out the SetTracer method") -// }, -// SetTracingContextFunc: func(traceContext storetypes.TraceContext) storetypes.MultiStore { -// panic("mock out the SetTracingContext method") -// }, -// TracingEnabledFunc: func() bool { -// panic("mock out the TracingEnabled method") -// }, -// } -// -// // use mockedMultiStore in code that requires interfaces.MultiStore -// // and then make assertions. -// -// } -type MultiStoreMock struct { - // CacheMultiStoreFunc mocks the CacheMultiStore method. - CacheMultiStoreFunc func() storetypes.CacheMultiStore - - // CacheMultiStoreWithVersionFunc mocks the CacheMultiStoreWithVersion method. - CacheMultiStoreWithVersionFunc func(version int64) (storetypes.CacheMultiStore, error) - - // CacheWrapFunc mocks the CacheWrap method. - CacheWrapFunc func() storetypes.CacheWrap - - // CacheWrapWithTraceFunc mocks the CacheWrapWithTrace method. - CacheWrapWithTraceFunc func(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap - - // GetKVStoreFunc mocks the GetKVStore method. - GetKVStoreFunc func(storeKey storetypes.StoreKey) storetypes.KVStore - - // GetStoreFunc mocks the GetStore method. - GetStoreFunc func(storeKey storetypes.StoreKey) storetypes.Store - - // GetStoreTypeFunc mocks the GetStoreType method. - GetStoreTypeFunc func() storetypes.StoreType - - // LatestVersionFunc mocks the LatestVersion method. - LatestVersionFunc func() int64 - - // SetTracerFunc mocks the SetTracer method. - SetTracerFunc func(w io.Writer) storetypes.MultiStore - - // SetTracingContextFunc mocks the SetTracingContext method. - SetTracingContextFunc func(traceContext storetypes.TraceContext) storetypes.MultiStore - - // TracingEnabledFunc mocks the TracingEnabled method. - TracingEnabledFunc func() bool - - // calls tracks calls to the methods. - calls struct { - // CacheMultiStore holds details about calls to the CacheMultiStore method. - CacheMultiStore []struct { - } - // CacheMultiStoreWithVersion holds details about calls to the CacheMultiStoreWithVersion method. - CacheMultiStoreWithVersion []struct { - // Version is the version argument value. - Version int64 - } - // CacheWrap holds details about calls to the CacheWrap method. - CacheWrap []struct { - } - // CacheWrapWithTrace holds details about calls to the CacheWrapWithTrace method. - CacheWrapWithTrace []struct { - // W is the w argument value. - W io.Writer - // Tc is the tc argument value. - Tc storetypes.TraceContext - } - // GetKVStore holds details about calls to the GetKVStore method. - GetKVStore []struct { - // StoreKey is the storeKey argument value. - StoreKey storetypes.StoreKey - } - // GetStore holds details about calls to the GetStore method. - GetStore []struct { - // StoreKey is the storeKey argument value. - StoreKey storetypes.StoreKey - } - // GetStoreType holds details about calls to the GetStoreType method. - GetStoreType []struct { - } - // LatestVersion holds details about calls to the LatestVersion method. - LatestVersion []struct { - } - // SetTracer holds details about calls to the SetTracer method. - SetTracer []struct { - // W is the w argument value. - W io.Writer - } - // SetTracingContext holds details about calls to the SetTracingContext method. - SetTracingContext []struct { - // TraceContext is the traceContext argument value. - TraceContext storetypes.TraceContext - } - // TracingEnabled holds details about calls to the TracingEnabled method. - TracingEnabled []struct { - } - } - lockCacheMultiStore sync.RWMutex - lockCacheMultiStoreWithVersion sync.RWMutex - lockCacheWrap sync.RWMutex - lockCacheWrapWithTrace sync.RWMutex - lockGetKVStore sync.RWMutex - lockGetStore sync.RWMutex - lockGetStoreType sync.RWMutex - lockLatestVersion sync.RWMutex - lockSetTracer sync.RWMutex - lockSetTracingContext sync.RWMutex - lockTracingEnabled sync.RWMutex -} - -// CacheMultiStore calls CacheMultiStoreFunc. -func (mock *MultiStoreMock) CacheMultiStore() storetypes.CacheMultiStore { - if mock.CacheMultiStoreFunc == nil { - panic("MultiStoreMock.CacheMultiStoreFunc: method is nil but MultiStore.CacheMultiStore was just called") - } - callInfo := struct { - }{} - mock.lockCacheMultiStore.Lock() - mock.calls.CacheMultiStore = append(mock.calls.CacheMultiStore, callInfo) - mock.lockCacheMultiStore.Unlock() - return mock.CacheMultiStoreFunc() -} - -// CacheMultiStoreCalls gets all the calls that were made to CacheMultiStore. -// Check the length with: -// -// len(mockedMultiStore.CacheMultiStoreCalls()) -func (mock *MultiStoreMock) CacheMultiStoreCalls() []struct { -} { - var calls []struct { - } - mock.lockCacheMultiStore.RLock() - calls = mock.calls.CacheMultiStore - mock.lockCacheMultiStore.RUnlock() - return calls -} - -// CacheMultiStoreWithVersion calls CacheMultiStoreWithVersionFunc. -func (mock *MultiStoreMock) CacheMultiStoreWithVersion(version int64) (storetypes.CacheMultiStore, error) { - if mock.CacheMultiStoreWithVersionFunc == nil { - panic("MultiStoreMock.CacheMultiStoreWithVersionFunc: method is nil but MultiStore.CacheMultiStoreWithVersion was just called") - } - callInfo := struct { - Version int64 - }{ - Version: version, - } - mock.lockCacheMultiStoreWithVersion.Lock() - mock.calls.CacheMultiStoreWithVersion = append(mock.calls.CacheMultiStoreWithVersion, callInfo) - mock.lockCacheMultiStoreWithVersion.Unlock() - return mock.CacheMultiStoreWithVersionFunc(version) -} - -// CacheMultiStoreWithVersionCalls gets all the calls that were made to CacheMultiStoreWithVersion. -// Check the length with: -// -// len(mockedMultiStore.CacheMultiStoreWithVersionCalls()) -func (mock *MultiStoreMock) CacheMultiStoreWithVersionCalls() []struct { - Version int64 -} { - var calls []struct { - Version int64 - } - mock.lockCacheMultiStoreWithVersion.RLock() - calls = mock.calls.CacheMultiStoreWithVersion - mock.lockCacheMultiStoreWithVersion.RUnlock() - return calls -} - -// CacheWrap calls CacheWrapFunc. -func (mock *MultiStoreMock) CacheWrap() storetypes.CacheWrap { - if mock.CacheWrapFunc == nil { - panic("MultiStoreMock.CacheWrapFunc: method is nil but MultiStore.CacheWrap was just called") - } - callInfo := struct { - }{} - mock.lockCacheWrap.Lock() - mock.calls.CacheWrap = append(mock.calls.CacheWrap, callInfo) - mock.lockCacheWrap.Unlock() - return mock.CacheWrapFunc() -} - -// CacheWrapCalls gets all the calls that were made to CacheWrap. -// Check the length with: -// -// len(mockedMultiStore.CacheWrapCalls()) -func (mock *MultiStoreMock) CacheWrapCalls() []struct { -} { - var calls []struct { - } - mock.lockCacheWrap.RLock() - calls = mock.calls.CacheWrap - mock.lockCacheWrap.RUnlock() - return calls -} - -// CacheWrapWithTrace calls CacheWrapWithTraceFunc. -func (mock *MultiStoreMock) CacheWrapWithTrace(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap { - if mock.CacheWrapWithTraceFunc == nil { - panic("MultiStoreMock.CacheWrapWithTraceFunc: method is nil but MultiStore.CacheWrapWithTrace was just called") - } - callInfo := struct { - W io.Writer - Tc storetypes.TraceContext - }{ - W: w, - Tc: tc, - } - mock.lockCacheWrapWithTrace.Lock() - mock.calls.CacheWrapWithTrace = append(mock.calls.CacheWrapWithTrace, callInfo) - mock.lockCacheWrapWithTrace.Unlock() - return mock.CacheWrapWithTraceFunc(w, tc) -} - -// CacheWrapWithTraceCalls gets all the calls that were made to CacheWrapWithTrace. -// Check the length with: -// -// len(mockedMultiStore.CacheWrapWithTraceCalls()) -func (mock *MultiStoreMock) CacheWrapWithTraceCalls() []struct { - W io.Writer - Tc storetypes.TraceContext -} { - var calls []struct { - W io.Writer - Tc storetypes.TraceContext - } - mock.lockCacheWrapWithTrace.RLock() - calls = mock.calls.CacheWrapWithTrace - mock.lockCacheWrapWithTrace.RUnlock() - return calls -} - -// GetKVStore calls GetKVStoreFunc. -func (mock *MultiStoreMock) GetKVStore(storeKey storetypes.StoreKey) storetypes.KVStore { - if mock.GetKVStoreFunc == nil { - panic("MultiStoreMock.GetKVStoreFunc: method is nil but MultiStore.GetKVStore was just called") - } - callInfo := struct { - StoreKey storetypes.StoreKey - }{ - StoreKey: storeKey, - } - mock.lockGetKVStore.Lock() - mock.calls.GetKVStore = append(mock.calls.GetKVStore, callInfo) - mock.lockGetKVStore.Unlock() - return mock.GetKVStoreFunc(storeKey) -} - -// GetKVStoreCalls gets all the calls that were made to GetKVStore. -// Check the length with: -// -// len(mockedMultiStore.GetKVStoreCalls()) -func (mock *MultiStoreMock) GetKVStoreCalls() []struct { - StoreKey storetypes.StoreKey -} { - var calls []struct { - StoreKey storetypes.StoreKey - } - mock.lockGetKVStore.RLock() - calls = mock.calls.GetKVStore - mock.lockGetKVStore.RUnlock() - return calls -} - -// GetStore calls GetStoreFunc. -func (mock *MultiStoreMock) GetStore(storeKey storetypes.StoreKey) storetypes.Store { - if mock.GetStoreFunc == nil { - panic("MultiStoreMock.GetStoreFunc: method is nil but MultiStore.GetStore was just called") - } - callInfo := struct { - StoreKey storetypes.StoreKey - }{ - StoreKey: storeKey, - } - mock.lockGetStore.Lock() - mock.calls.GetStore = append(mock.calls.GetStore, callInfo) - mock.lockGetStore.Unlock() - return mock.GetStoreFunc(storeKey) -} - -// GetStoreCalls gets all the calls that were made to GetStore. -// Check the length with: -// -// len(mockedMultiStore.GetStoreCalls()) -func (mock *MultiStoreMock) GetStoreCalls() []struct { - StoreKey storetypes.StoreKey -} { - var calls []struct { - StoreKey storetypes.StoreKey - } - mock.lockGetStore.RLock() - calls = mock.calls.GetStore - mock.lockGetStore.RUnlock() - return calls -} - -// GetStoreType calls GetStoreTypeFunc. -func (mock *MultiStoreMock) GetStoreType() storetypes.StoreType { - if mock.GetStoreTypeFunc == nil { - panic("MultiStoreMock.GetStoreTypeFunc: method is nil but MultiStore.GetStoreType was just called") - } - callInfo := struct { - }{} - mock.lockGetStoreType.Lock() - mock.calls.GetStoreType = append(mock.calls.GetStoreType, callInfo) - mock.lockGetStoreType.Unlock() - return mock.GetStoreTypeFunc() -} - -// GetStoreTypeCalls gets all the calls that were made to GetStoreType. -// Check the length with: -// -// len(mockedMultiStore.GetStoreTypeCalls()) -func (mock *MultiStoreMock) GetStoreTypeCalls() []struct { -} { - var calls []struct { - } - mock.lockGetStoreType.RLock() - calls = mock.calls.GetStoreType - mock.lockGetStoreType.RUnlock() - return calls -} - -// LatestVersion calls LatestVersionFunc. -func (mock *MultiStoreMock) LatestVersion() int64 { - if mock.LatestVersionFunc == nil { - panic("MultiStoreMock.LatestVersionFunc: method is nil but MultiStore.LatestVersion was just called") - } - callInfo := struct { - }{} - mock.lockLatestVersion.Lock() - mock.calls.LatestVersion = append(mock.calls.LatestVersion, callInfo) - mock.lockLatestVersion.Unlock() - return mock.LatestVersionFunc() -} - -// LatestVersionCalls gets all the calls that were made to LatestVersion. -// Check the length with: -// -// len(mockedMultiStore.LatestVersionCalls()) -func (mock *MultiStoreMock) LatestVersionCalls() []struct { -} { - var calls []struct { - } - mock.lockLatestVersion.RLock() - calls = mock.calls.LatestVersion - mock.lockLatestVersion.RUnlock() - return calls -} - -// SetTracer calls SetTracerFunc. -func (mock *MultiStoreMock) SetTracer(w io.Writer) storetypes.MultiStore { - if mock.SetTracerFunc == nil { - panic("MultiStoreMock.SetTracerFunc: method is nil but MultiStore.SetTracer was just called") - } - callInfo := struct { - W io.Writer - }{ - W: w, - } - mock.lockSetTracer.Lock() - mock.calls.SetTracer = append(mock.calls.SetTracer, callInfo) - mock.lockSetTracer.Unlock() - return mock.SetTracerFunc(w) -} - -// SetTracerCalls gets all the calls that were made to SetTracer. -// Check the length with: -// -// len(mockedMultiStore.SetTracerCalls()) -func (mock *MultiStoreMock) SetTracerCalls() []struct { - W io.Writer -} { - var calls []struct { - W io.Writer - } - mock.lockSetTracer.RLock() - calls = mock.calls.SetTracer - mock.lockSetTracer.RUnlock() - return calls -} - -// SetTracingContext calls SetTracingContextFunc. -func (mock *MultiStoreMock) SetTracingContext(traceContext storetypes.TraceContext) storetypes.MultiStore { - if mock.SetTracingContextFunc == nil { - panic("MultiStoreMock.SetTracingContextFunc: method is nil but MultiStore.SetTracingContext was just called") - } - callInfo := struct { - TraceContext storetypes.TraceContext - }{ - TraceContext: traceContext, - } - mock.lockSetTracingContext.Lock() - mock.calls.SetTracingContext = append(mock.calls.SetTracingContext, callInfo) - mock.lockSetTracingContext.Unlock() - return mock.SetTracingContextFunc(traceContext) -} - -// SetTracingContextCalls gets all the calls that were made to SetTracingContext. -// Check the length with: -// -// len(mockedMultiStore.SetTracingContextCalls()) -func (mock *MultiStoreMock) SetTracingContextCalls() []struct { - TraceContext storetypes.TraceContext -} { - var calls []struct { - TraceContext storetypes.TraceContext - } - mock.lockSetTracingContext.RLock() - calls = mock.calls.SetTracingContext - mock.lockSetTracingContext.RUnlock() - return calls -} - -// TracingEnabled calls TracingEnabledFunc. -func (mock *MultiStoreMock) TracingEnabled() bool { - if mock.TracingEnabledFunc == nil { - panic("MultiStoreMock.TracingEnabledFunc: method is nil but MultiStore.TracingEnabled was just called") - } - callInfo := struct { - }{} - mock.lockTracingEnabled.Lock() - mock.calls.TracingEnabled = append(mock.calls.TracingEnabled, callInfo) - mock.lockTracingEnabled.Unlock() - return mock.TracingEnabledFunc() -} - -// TracingEnabledCalls gets all the calls that were made to TracingEnabled. -// Check the length with: -// -// len(mockedMultiStore.TracingEnabledCalls()) -func (mock *MultiStoreMock) TracingEnabledCalls() []struct { -} { - var calls []struct { - } - mock.lockTracingEnabled.RLock() - calls = mock.calls.TracingEnabled - mock.lockTracingEnabled.RUnlock() - return calls -} - -// Ensure, that CacheMultiStoreMock does implement interfaces.CacheMultiStore. -// If this is not the case, regenerate this file with moq. -var _ interfaces.CacheMultiStore = &CacheMultiStoreMock{} - -// CacheMultiStoreMock is a mock implementation of interfaces.CacheMultiStore. -// -// func TestSomethingThatUsesCacheMultiStore(t *testing.T) { -// -// // make and configure a mocked interfaces.CacheMultiStore -// mockedCacheMultiStore := &CacheMultiStoreMock{ -// CacheMultiStoreFunc: func() storetypes.CacheMultiStore { -// panic("mock out the CacheMultiStore method") -// }, -// CacheMultiStoreWithVersionFunc: func(version int64) (storetypes.CacheMultiStore, error) { -// panic("mock out the CacheMultiStoreWithVersion method") -// }, -// CacheWrapFunc: func() storetypes.CacheWrap { -// panic("mock out the CacheWrap method") -// }, -// CacheWrapWithTraceFunc: func(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap { -// panic("mock out the CacheWrapWithTrace method") -// }, -// GetKVStoreFunc: func(storeKey storetypes.StoreKey) storetypes.KVStore { -// panic("mock out the GetKVStore method") -// }, -// GetStoreFunc: func(storeKey storetypes.StoreKey) storetypes.Store { -// panic("mock out the GetStore method") -// }, -// GetStoreTypeFunc: func() storetypes.StoreType { -// panic("mock out the GetStoreType method") -// }, -// LatestVersionFunc: func() int64 { -// panic("mock out the LatestVersion method") -// }, -// SetTracerFunc: func(w io.Writer) storetypes.MultiStore { -// panic("mock out the SetTracer method") -// }, -// SetTracingContextFunc: func(traceContext storetypes.TraceContext) storetypes.MultiStore { -// panic("mock out the SetTracingContext method") -// }, -// TracingEnabledFunc: func() bool { -// panic("mock out the TracingEnabled method") -// }, -// WriteFunc: func() { -// panic("mock out the Write method") -// }, -// } -// -// // use mockedCacheMultiStore in code that requires interfaces.CacheMultiStore -// // and then make assertions. -// -// } -type CacheMultiStoreMock struct { - // CacheMultiStoreFunc mocks the CacheMultiStore method. - CacheMultiStoreFunc func() storetypes.CacheMultiStore - - // CacheMultiStoreWithVersionFunc mocks the CacheMultiStoreWithVersion method. - CacheMultiStoreWithVersionFunc func(version int64) (storetypes.CacheMultiStore, error) - - // CacheWrapFunc mocks the CacheWrap method. - CacheWrapFunc func() storetypes.CacheWrap - - // CacheWrapWithTraceFunc mocks the CacheWrapWithTrace method. - CacheWrapWithTraceFunc func(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap - - // GetKVStoreFunc mocks the GetKVStore method. - GetKVStoreFunc func(storeKey storetypes.StoreKey) storetypes.KVStore - - // GetStoreFunc mocks the GetStore method. - GetStoreFunc func(storeKey storetypes.StoreKey) storetypes.Store - - // GetStoreTypeFunc mocks the GetStoreType method. - GetStoreTypeFunc func() storetypes.StoreType - - // LatestVersionFunc mocks the LatestVersion method. - LatestVersionFunc func() int64 - - // SetTracerFunc mocks the SetTracer method. - SetTracerFunc func(w io.Writer) storetypes.MultiStore - - // SetTracingContextFunc mocks the SetTracingContext method. - SetTracingContextFunc func(traceContext storetypes.TraceContext) storetypes.MultiStore - - // TracingEnabledFunc mocks the TracingEnabled method. - TracingEnabledFunc func() bool - - // WriteFunc mocks the Write method. - WriteFunc func() - - // calls tracks calls to the methods. - calls struct { - // CacheMultiStore holds details about calls to the CacheMultiStore method. - CacheMultiStore []struct { - } - // CacheMultiStoreWithVersion holds details about calls to the CacheMultiStoreWithVersion method. - CacheMultiStoreWithVersion []struct { - // Version is the version argument value. - Version int64 - } - // CacheWrap holds details about calls to the CacheWrap method. - CacheWrap []struct { - } - // CacheWrapWithTrace holds details about calls to the CacheWrapWithTrace method. - CacheWrapWithTrace []struct { - // W is the w argument value. - W io.Writer - // Tc is the tc argument value. - Tc storetypes.TraceContext - } - // GetKVStore holds details about calls to the GetKVStore method. - GetKVStore []struct { - // StoreKey is the storeKey argument value. - StoreKey storetypes.StoreKey - } - // GetStore holds details about calls to the GetStore method. - GetStore []struct { - // StoreKey is the storeKey argument value. - StoreKey storetypes.StoreKey - } - // GetStoreType holds details about calls to the GetStoreType method. - GetStoreType []struct { - } - // LatestVersion holds details about calls to the LatestVersion method. - LatestVersion []struct { - } - // SetTracer holds details about calls to the SetTracer method. - SetTracer []struct { - // W is the w argument value. - W io.Writer - } - // SetTracingContext holds details about calls to the SetTracingContext method. - SetTracingContext []struct { - // TraceContext is the traceContext argument value. - TraceContext storetypes.TraceContext - } - // TracingEnabled holds details about calls to the TracingEnabled method. - TracingEnabled []struct { - } - // Write holds details about calls to the Write method. - Write []struct { - } - } - lockCacheMultiStore sync.RWMutex - lockCacheMultiStoreWithVersion sync.RWMutex - lockCacheWrap sync.RWMutex - lockCacheWrapWithTrace sync.RWMutex - lockGetKVStore sync.RWMutex - lockGetStore sync.RWMutex - lockGetStoreType sync.RWMutex - lockLatestVersion sync.RWMutex - lockSetTracer sync.RWMutex - lockSetTracingContext sync.RWMutex - lockTracingEnabled sync.RWMutex - lockWrite sync.RWMutex -} - -// CacheMultiStore calls CacheMultiStoreFunc. -func (mock *CacheMultiStoreMock) CacheMultiStore() storetypes.CacheMultiStore { - if mock.CacheMultiStoreFunc == nil { - panic("CacheMultiStoreMock.CacheMultiStoreFunc: method is nil but CacheMultiStore.CacheMultiStore was just called") - } - callInfo := struct { - }{} - mock.lockCacheMultiStore.Lock() - mock.calls.CacheMultiStore = append(mock.calls.CacheMultiStore, callInfo) - mock.lockCacheMultiStore.Unlock() - return mock.CacheMultiStoreFunc() -} - -// CacheMultiStoreCalls gets all the calls that were made to CacheMultiStore. -// Check the length with: -// -// len(mockedCacheMultiStore.CacheMultiStoreCalls()) -func (mock *CacheMultiStoreMock) CacheMultiStoreCalls() []struct { -} { - var calls []struct { - } - mock.lockCacheMultiStore.RLock() - calls = mock.calls.CacheMultiStore - mock.lockCacheMultiStore.RUnlock() - return calls -} - -// CacheMultiStoreWithVersion calls CacheMultiStoreWithVersionFunc. -func (mock *CacheMultiStoreMock) CacheMultiStoreWithVersion(version int64) (storetypes.CacheMultiStore, error) { - if mock.CacheMultiStoreWithVersionFunc == nil { - panic("CacheMultiStoreMock.CacheMultiStoreWithVersionFunc: method is nil but CacheMultiStore.CacheMultiStoreWithVersion was just called") - } - callInfo := struct { - Version int64 - }{ - Version: version, - } - mock.lockCacheMultiStoreWithVersion.Lock() - mock.calls.CacheMultiStoreWithVersion = append(mock.calls.CacheMultiStoreWithVersion, callInfo) - mock.lockCacheMultiStoreWithVersion.Unlock() - return mock.CacheMultiStoreWithVersionFunc(version) -} - -// CacheMultiStoreWithVersionCalls gets all the calls that were made to CacheMultiStoreWithVersion. -// Check the length with: -// -// len(mockedCacheMultiStore.CacheMultiStoreWithVersionCalls()) -func (mock *CacheMultiStoreMock) CacheMultiStoreWithVersionCalls() []struct { - Version int64 -} { - var calls []struct { - Version int64 - } - mock.lockCacheMultiStoreWithVersion.RLock() - calls = mock.calls.CacheMultiStoreWithVersion - mock.lockCacheMultiStoreWithVersion.RUnlock() - return calls -} - -// CacheWrap calls CacheWrapFunc. -func (mock *CacheMultiStoreMock) CacheWrap() storetypes.CacheWrap { - if mock.CacheWrapFunc == nil { - panic("CacheMultiStoreMock.CacheWrapFunc: method is nil but CacheMultiStore.CacheWrap was just called") - } - callInfo := struct { - }{} - mock.lockCacheWrap.Lock() - mock.calls.CacheWrap = append(mock.calls.CacheWrap, callInfo) - mock.lockCacheWrap.Unlock() - return mock.CacheWrapFunc() -} - -// CacheWrapCalls gets all the calls that were made to CacheWrap. -// Check the length with: -// -// len(mockedCacheMultiStore.CacheWrapCalls()) -func (mock *CacheMultiStoreMock) CacheWrapCalls() []struct { -} { - var calls []struct { - } - mock.lockCacheWrap.RLock() - calls = mock.calls.CacheWrap - mock.lockCacheWrap.RUnlock() - return calls -} - -// CacheWrapWithTrace calls CacheWrapWithTraceFunc. -func (mock *CacheMultiStoreMock) CacheWrapWithTrace(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap { - if mock.CacheWrapWithTraceFunc == nil { - panic("CacheMultiStoreMock.CacheWrapWithTraceFunc: method is nil but CacheMultiStore.CacheWrapWithTrace was just called") - } - callInfo := struct { - W io.Writer - Tc storetypes.TraceContext - }{ - W: w, - Tc: tc, - } - mock.lockCacheWrapWithTrace.Lock() - mock.calls.CacheWrapWithTrace = append(mock.calls.CacheWrapWithTrace, callInfo) - mock.lockCacheWrapWithTrace.Unlock() - return mock.CacheWrapWithTraceFunc(w, tc) -} - -// CacheWrapWithTraceCalls gets all the calls that were made to CacheWrapWithTrace. -// Check the length with: -// -// len(mockedCacheMultiStore.CacheWrapWithTraceCalls()) -func (mock *CacheMultiStoreMock) CacheWrapWithTraceCalls() []struct { - W io.Writer - Tc storetypes.TraceContext -} { - var calls []struct { - W io.Writer - Tc storetypes.TraceContext - } - mock.lockCacheWrapWithTrace.RLock() - calls = mock.calls.CacheWrapWithTrace - mock.lockCacheWrapWithTrace.RUnlock() - return calls -} - -// GetKVStore calls GetKVStoreFunc. -func (mock *CacheMultiStoreMock) GetKVStore(storeKey storetypes.StoreKey) storetypes.KVStore { - if mock.GetKVStoreFunc == nil { - panic("CacheMultiStoreMock.GetKVStoreFunc: method is nil but CacheMultiStore.GetKVStore was just called") - } - callInfo := struct { - StoreKey storetypes.StoreKey - }{ - StoreKey: storeKey, - } - mock.lockGetKVStore.Lock() - mock.calls.GetKVStore = append(mock.calls.GetKVStore, callInfo) - mock.lockGetKVStore.Unlock() - return mock.GetKVStoreFunc(storeKey) -} - -// GetKVStoreCalls gets all the calls that were made to GetKVStore. -// Check the length with: -// -// len(mockedCacheMultiStore.GetKVStoreCalls()) -func (mock *CacheMultiStoreMock) GetKVStoreCalls() []struct { - StoreKey storetypes.StoreKey -} { - var calls []struct { - StoreKey storetypes.StoreKey - } - mock.lockGetKVStore.RLock() - calls = mock.calls.GetKVStore - mock.lockGetKVStore.RUnlock() - return calls -} - -// GetStore calls GetStoreFunc. -func (mock *CacheMultiStoreMock) GetStore(storeKey storetypes.StoreKey) storetypes.Store { - if mock.GetStoreFunc == nil { - panic("CacheMultiStoreMock.GetStoreFunc: method is nil but CacheMultiStore.GetStore was just called") - } - callInfo := struct { - StoreKey storetypes.StoreKey - }{ - StoreKey: storeKey, - } - mock.lockGetStore.Lock() - mock.calls.GetStore = append(mock.calls.GetStore, callInfo) - mock.lockGetStore.Unlock() - return mock.GetStoreFunc(storeKey) -} - -// GetStoreCalls gets all the calls that were made to GetStore. -// Check the length with: -// -// len(mockedCacheMultiStore.GetStoreCalls()) -func (mock *CacheMultiStoreMock) GetStoreCalls() []struct { - StoreKey storetypes.StoreKey -} { - var calls []struct { - StoreKey storetypes.StoreKey - } - mock.lockGetStore.RLock() - calls = mock.calls.GetStore - mock.lockGetStore.RUnlock() - return calls -} - -// GetStoreType calls GetStoreTypeFunc. -func (mock *CacheMultiStoreMock) GetStoreType() storetypes.StoreType { - if mock.GetStoreTypeFunc == nil { - panic("CacheMultiStoreMock.GetStoreTypeFunc: method is nil but CacheMultiStore.GetStoreType was just called") - } - callInfo := struct { - }{} - mock.lockGetStoreType.Lock() - mock.calls.GetStoreType = append(mock.calls.GetStoreType, callInfo) - mock.lockGetStoreType.Unlock() - return mock.GetStoreTypeFunc() -} - -// GetStoreTypeCalls gets all the calls that were made to GetStoreType. -// Check the length with: -// -// len(mockedCacheMultiStore.GetStoreTypeCalls()) -func (mock *CacheMultiStoreMock) GetStoreTypeCalls() []struct { -} { - var calls []struct { - } - mock.lockGetStoreType.RLock() - calls = mock.calls.GetStoreType - mock.lockGetStoreType.RUnlock() - return calls -} - -// LatestVersion calls LatestVersionFunc. -func (mock *CacheMultiStoreMock) LatestVersion() int64 { - if mock.LatestVersionFunc == nil { - panic("CacheMultiStoreMock.LatestVersionFunc: method is nil but CacheMultiStore.LatestVersion was just called") - } - callInfo := struct { - }{} - mock.lockLatestVersion.Lock() - mock.calls.LatestVersion = append(mock.calls.LatestVersion, callInfo) - mock.lockLatestVersion.Unlock() - return mock.LatestVersionFunc() -} - -// LatestVersionCalls gets all the calls that were made to LatestVersion. -// Check the length with: -// -// len(mockedCacheMultiStore.LatestVersionCalls()) -func (mock *CacheMultiStoreMock) LatestVersionCalls() []struct { -} { - var calls []struct { - } - mock.lockLatestVersion.RLock() - calls = mock.calls.LatestVersion - mock.lockLatestVersion.RUnlock() - return calls -} - -// SetTracer calls SetTracerFunc. -func (mock *CacheMultiStoreMock) SetTracer(w io.Writer) storetypes.MultiStore { - if mock.SetTracerFunc == nil { - panic("CacheMultiStoreMock.SetTracerFunc: method is nil but CacheMultiStore.SetTracer was just called") - } - callInfo := struct { - W io.Writer - }{ - W: w, - } - mock.lockSetTracer.Lock() - mock.calls.SetTracer = append(mock.calls.SetTracer, callInfo) - mock.lockSetTracer.Unlock() - return mock.SetTracerFunc(w) -} - -// SetTracerCalls gets all the calls that were made to SetTracer. -// Check the length with: -// -// len(mockedCacheMultiStore.SetTracerCalls()) -func (mock *CacheMultiStoreMock) SetTracerCalls() []struct { - W io.Writer -} { - var calls []struct { - W io.Writer - } - mock.lockSetTracer.RLock() - calls = mock.calls.SetTracer - mock.lockSetTracer.RUnlock() - return calls -} - -// SetTracingContext calls SetTracingContextFunc. -func (mock *CacheMultiStoreMock) SetTracingContext(traceContext storetypes.TraceContext) storetypes.MultiStore { - if mock.SetTracingContextFunc == nil { - panic("CacheMultiStoreMock.SetTracingContextFunc: method is nil but CacheMultiStore.SetTracingContext was just called") - } - callInfo := struct { - TraceContext storetypes.TraceContext - }{ - TraceContext: traceContext, - } - mock.lockSetTracingContext.Lock() - mock.calls.SetTracingContext = append(mock.calls.SetTracingContext, callInfo) - mock.lockSetTracingContext.Unlock() - return mock.SetTracingContextFunc(traceContext) -} - -// SetTracingContextCalls gets all the calls that were made to SetTracingContext. -// Check the length with: -// -// len(mockedCacheMultiStore.SetTracingContextCalls()) -func (mock *CacheMultiStoreMock) SetTracingContextCalls() []struct { - TraceContext storetypes.TraceContext -} { - var calls []struct { - TraceContext storetypes.TraceContext - } - mock.lockSetTracingContext.RLock() - calls = mock.calls.SetTracingContext - mock.lockSetTracingContext.RUnlock() - return calls -} - -// TracingEnabled calls TracingEnabledFunc. -func (mock *CacheMultiStoreMock) TracingEnabled() bool { - if mock.TracingEnabledFunc == nil { - panic("CacheMultiStoreMock.TracingEnabledFunc: method is nil but CacheMultiStore.TracingEnabled was just called") - } - callInfo := struct { - }{} - mock.lockTracingEnabled.Lock() - mock.calls.TracingEnabled = append(mock.calls.TracingEnabled, callInfo) - mock.lockTracingEnabled.Unlock() - return mock.TracingEnabledFunc() -} - -// TracingEnabledCalls gets all the calls that were made to TracingEnabled. -// Check the length with: -// -// len(mockedCacheMultiStore.TracingEnabledCalls()) -func (mock *CacheMultiStoreMock) TracingEnabledCalls() []struct { -} { - var calls []struct { - } - mock.lockTracingEnabled.RLock() - calls = mock.calls.TracingEnabled - mock.lockTracingEnabled.RUnlock() - return calls -} - -// Write calls WriteFunc. -func (mock *CacheMultiStoreMock) Write() { - if mock.WriteFunc == nil { - panic("CacheMultiStoreMock.WriteFunc: method is nil but CacheMultiStore.Write was just called") - } - callInfo := struct { - }{} - mock.lockWrite.Lock() - mock.calls.Write = append(mock.calls.Write, callInfo) - mock.lockWrite.Unlock() - mock.WriteFunc() -} - -// WriteCalls gets all the calls that were made to Write. -// Check the length with: -// -// len(mockedCacheMultiStore.WriteCalls()) -func (mock *CacheMultiStoreMock) WriteCalls() []struct { -} { - var calls []struct { - } - mock.lockWrite.RLock() - calls = mock.calls.Write - mock.lockWrite.RUnlock() - return calls -} - -// Ensure, that KVStoreMock does implement interfaces.KVStore. -// If this is not the case, regenerate this file with moq. -var _ interfaces.KVStore = &KVStoreMock{} - -// KVStoreMock is a mock implementation of interfaces.KVStore. -// -// func TestSomethingThatUsesKVStore(t *testing.T) { -// -// // make and configure a mocked interfaces.KVStore -// mockedKVStore := &KVStoreMock{ -// CacheWrapFunc: func() storetypes.CacheWrap { -// panic("mock out the CacheWrap method") -// }, -// CacheWrapWithTraceFunc: func(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap { -// panic("mock out the CacheWrapWithTrace method") -// }, -// DeleteFunc: func(key []byte) { -// panic("mock out the Delete method") -// }, -// GetFunc: func(key []byte) []byte { -// panic("mock out the Get method") -// }, -// GetStoreTypeFunc: func() storetypes.StoreType { -// panic("mock out the GetStoreType method") -// }, -// HasFunc: func(key []byte) bool { -// panic("mock out the Has method") -// }, -// IteratorFunc: func(start []byte, end []byte) db.Iterator { -// panic("mock out the Iterator method") -// }, -// ReverseIteratorFunc: func(start []byte, end []byte) db.Iterator { -// panic("mock out the ReverseIterator method") -// }, -// SetFunc: func(key []byte, value []byte) { -// panic("mock out the Set method") -// }, -// } -// -// // use mockedKVStore in code that requires interfaces.KVStore -// // and then make assertions. -// -// } -type KVStoreMock struct { - // CacheWrapFunc mocks the CacheWrap method. - CacheWrapFunc func() storetypes.CacheWrap - - // CacheWrapWithTraceFunc mocks the CacheWrapWithTrace method. - CacheWrapWithTraceFunc func(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap - - // DeleteFunc mocks the Delete method. - DeleteFunc func(key []byte) - - // GetFunc mocks the Get method. - GetFunc func(key []byte) []byte - - // GetStoreTypeFunc mocks the GetStoreType method. - GetStoreTypeFunc func() storetypes.StoreType - - // HasFunc mocks the Has method. - HasFunc func(key []byte) bool - - // IteratorFunc mocks the Iterator method. - IteratorFunc func(start []byte, end []byte) db.Iterator - - // ReverseIteratorFunc mocks the ReverseIterator method. - ReverseIteratorFunc func(start []byte, end []byte) db.Iterator - - // SetFunc mocks the Set method. - SetFunc func(key []byte, value []byte) - - // calls tracks calls to the methods. - calls struct { - // CacheWrap holds details about calls to the CacheWrap method. - CacheWrap []struct { - } - // CacheWrapWithTrace holds details about calls to the CacheWrapWithTrace method. - CacheWrapWithTrace []struct { - // W is the w argument value. - W io.Writer - // Tc is the tc argument value. - Tc storetypes.TraceContext - } - // Delete holds details about calls to the Delete method. - Delete []struct { - // Key is the key argument value. - Key []byte - } - // Get holds details about calls to the Get method. - Get []struct { - // Key is the key argument value. - Key []byte - } - // GetStoreType holds details about calls to the GetStoreType method. - GetStoreType []struct { - } - // Has holds details about calls to the Has method. - Has []struct { - // Key is the key argument value. - Key []byte - } - // Iterator holds details about calls to the Iterator method. - Iterator []struct { - // Start is the start argument value. - Start []byte - // End is the end argument value. - End []byte - } - // ReverseIterator holds details about calls to the ReverseIterator method. - ReverseIterator []struct { - // Start is the start argument value. - Start []byte - // End is the end argument value. - End []byte - } - // Set holds details about calls to the Set method. - Set []struct { - // Key is the key argument value. - Key []byte - // Value is the value argument value. - Value []byte - } - } - lockCacheWrap sync.RWMutex - lockCacheWrapWithTrace sync.RWMutex - lockDelete sync.RWMutex - lockGet sync.RWMutex - lockGetStoreType sync.RWMutex - lockHas sync.RWMutex - lockIterator sync.RWMutex - lockReverseIterator sync.RWMutex - lockSet sync.RWMutex -} - -// CacheWrap calls CacheWrapFunc. -func (mock *KVStoreMock) CacheWrap() storetypes.CacheWrap { - if mock.CacheWrapFunc == nil { - panic("KVStoreMock.CacheWrapFunc: method is nil but KVStore.CacheWrap was just called") - } - callInfo := struct { - }{} - mock.lockCacheWrap.Lock() - mock.calls.CacheWrap = append(mock.calls.CacheWrap, callInfo) - mock.lockCacheWrap.Unlock() - return mock.CacheWrapFunc() -} - -// CacheWrapCalls gets all the calls that were made to CacheWrap. -// Check the length with: -// -// len(mockedKVStore.CacheWrapCalls()) -func (mock *KVStoreMock) CacheWrapCalls() []struct { -} { - var calls []struct { - } - mock.lockCacheWrap.RLock() - calls = mock.calls.CacheWrap - mock.lockCacheWrap.RUnlock() - return calls -} - -// CacheWrapWithTrace calls CacheWrapWithTraceFunc. -func (mock *KVStoreMock) CacheWrapWithTrace(w io.Writer, tc storetypes.TraceContext) storetypes.CacheWrap { - if mock.CacheWrapWithTraceFunc == nil { - panic("KVStoreMock.CacheWrapWithTraceFunc: method is nil but KVStore.CacheWrapWithTrace was just called") - } - callInfo := struct { - W io.Writer - Tc storetypes.TraceContext - }{ - W: w, - Tc: tc, - } - mock.lockCacheWrapWithTrace.Lock() - mock.calls.CacheWrapWithTrace = append(mock.calls.CacheWrapWithTrace, callInfo) - mock.lockCacheWrapWithTrace.Unlock() - return mock.CacheWrapWithTraceFunc(w, tc) -} - -// CacheWrapWithTraceCalls gets all the calls that were made to CacheWrapWithTrace. -// Check the length with: -// -// len(mockedKVStore.CacheWrapWithTraceCalls()) -func (mock *KVStoreMock) CacheWrapWithTraceCalls() []struct { - W io.Writer - Tc storetypes.TraceContext -} { - var calls []struct { - W io.Writer - Tc storetypes.TraceContext - } - mock.lockCacheWrapWithTrace.RLock() - calls = mock.calls.CacheWrapWithTrace - mock.lockCacheWrapWithTrace.RUnlock() - return calls -} - -// Delete calls DeleteFunc. -func (mock *KVStoreMock) Delete(key []byte) { - if mock.DeleteFunc == nil { - panic("KVStoreMock.DeleteFunc: method is nil but KVStore.Delete was just called") - } - callInfo := struct { - Key []byte - }{ - Key: key, - } - mock.lockDelete.Lock() - mock.calls.Delete = append(mock.calls.Delete, callInfo) - mock.lockDelete.Unlock() - mock.DeleteFunc(key) -} - -// DeleteCalls gets all the calls that were made to Delete. -// Check the length with: -// -// len(mockedKVStore.DeleteCalls()) -func (mock *KVStoreMock) DeleteCalls() []struct { - Key []byte -} { - var calls []struct { - Key []byte - } - mock.lockDelete.RLock() - calls = mock.calls.Delete - mock.lockDelete.RUnlock() - return calls -} - -// Get calls GetFunc. -func (mock *KVStoreMock) Get(key []byte) []byte { - if mock.GetFunc == nil { - panic("KVStoreMock.GetFunc: method is nil but KVStore.Get was just called") - } - callInfo := struct { - Key []byte - }{ - Key: key, - } - mock.lockGet.Lock() - mock.calls.Get = append(mock.calls.Get, callInfo) - mock.lockGet.Unlock() - return mock.GetFunc(key) -} - -// GetCalls gets all the calls that were made to Get. -// Check the length with: -// -// len(mockedKVStore.GetCalls()) -func (mock *KVStoreMock) GetCalls() []struct { - Key []byte -} { - var calls []struct { - Key []byte - } - mock.lockGet.RLock() - calls = mock.calls.Get - mock.lockGet.RUnlock() - return calls -} - -// GetStoreType calls GetStoreTypeFunc. -func (mock *KVStoreMock) GetStoreType() storetypes.StoreType { - if mock.GetStoreTypeFunc == nil { - panic("KVStoreMock.GetStoreTypeFunc: method is nil but KVStore.GetStoreType was just called") - } - callInfo := struct { - }{} - mock.lockGetStoreType.Lock() - mock.calls.GetStoreType = append(mock.calls.GetStoreType, callInfo) - mock.lockGetStoreType.Unlock() - return mock.GetStoreTypeFunc() -} - -// GetStoreTypeCalls gets all the calls that were made to GetStoreType. -// Check the length with: -// -// len(mockedKVStore.GetStoreTypeCalls()) -func (mock *KVStoreMock) GetStoreTypeCalls() []struct { -} { - var calls []struct { - } - mock.lockGetStoreType.RLock() - calls = mock.calls.GetStoreType - mock.lockGetStoreType.RUnlock() - return calls -} - -// Has calls HasFunc. -func (mock *KVStoreMock) Has(key []byte) bool { - if mock.HasFunc == nil { - panic("KVStoreMock.HasFunc: method is nil but KVStore.Has was just called") - } - callInfo := struct { - Key []byte - }{ - Key: key, - } - mock.lockHas.Lock() - mock.calls.Has = append(mock.calls.Has, callInfo) - mock.lockHas.Unlock() - return mock.HasFunc(key) -} - -// HasCalls gets all the calls that were made to Has. -// Check the length with: -// -// len(mockedKVStore.HasCalls()) -func (mock *KVStoreMock) HasCalls() []struct { - Key []byte -} { - var calls []struct { - Key []byte - } - mock.lockHas.RLock() - calls = mock.calls.Has - mock.lockHas.RUnlock() - return calls -} - -// Iterator calls IteratorFunc. -func (mock *KVStoreMock) Iterator(start []byte, end []byte) db.Iterator { - if mock.IteratorFunc == nil { - panic("KVStoreMock.IteratorFunc: method is nil but KVStore.Iterator was just called") - } - callInfo := struct { - Start []byte - End []byte - }{ - Start: start, - End: end, - } - mock.lockIterator.Lock() - mock.calls.Iterator = append(mock.calls.Iterator, callInfo) - mock.lockIterator.Unlock() - return mock.IteratorFunc(start, end) -} - -// IteratorCalls gets all the calls that were made to Iterator. -// Check the length with: -// -// len(mockedKVStore.IteratorCalls()) -func (mock *KVStoreMock) IteratorCalls() []struct { - Start []byte - End []byte -} { - var calls []struct { - Start []byte - End []byte - } - mock.lockIterator.RLock() - calls = mock.calls.Iterator - mock.lockIterator.RUnlock() - return calls -} - -// ReverseIterator calls ReverseIteratorFunc. -func (mock *KVStoreMock) ReverseIterator(start []byte, end []byte) db.Iterator { - if mock.ReverseIteratorFunc == nil { - panic("KVStoreMock.ReverseIteratorFunc: method is nil but KVStore.ReverseIterator was just called") - } - callInfo := struct { - Start []byte - End []byte - }{ - Start: start, - End: end, - } - mock.lockReverseIterator.Lock() - mock.calls.ReverseIterator = append(mock.calls.ReverseIterator, callInfo) - mock.lockReverseIterator.Unlock() - return mock.ReverseIteratorFunc(start, end) -} - -// ReverseIteratorCalls gets all the calls that were made to ReverseIterator. -// Check the length with: -// -// len(mockedKVStore.ReverseIteratorCalls()) -func (mock *KVStoreMock) ReverseIteratorCalls() []struct { - Start []byte - End []byte -} { - var calls []struct { - Start []byte - End []byte - } - mock.lockReverseIterator.RLock() - calls = mock.calls.ReverseIterator - mock.lockReverseIterator.RUnlock() - return calls -} - -// Set calls SetFunc. -func (mock *KVStoreMock) Set(key []byte, value []byte) { - if mock.SetFunc == nil { - panic("KVStoreMock.SetFunc: method is nil but KVStore.Set was just called") - } - callInfo := struct { - Key []byte - Value []byte - }{ - Key: key, - Value: value, - } - mock.lockSet.Lock() - mock.calls.Set = append(mock.calls.Set, callInfo) - mock.lockSet.Unlock() - mock.SetFunc(key, value) -} - -// SetCalls gets all the calls that were made to Set. -// Check the length with: -// -// len(mockedKVStore.SetCalls()) -func (mock *KVStoreMock) SetCalls() []struct { - Key []byte - Value []byte -} { - var calls []struct { - Key []byte - Value []byte - } - mock.lockSet.RLock() - calls = mock.calls.Set - mock.lockSet.RUnlock() - return calls -} diff --git a/cosmos/testing/types/mock/interfaces/store.go b/cosmos/testing/types/mock/interfaces/store.go deleted file mode 100644 index 3e74a9f59a..0000000000 --- a/cosmos/testing/types/mock/interfaces/store.go +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package interfaces - -import storetypes "cosmossdk.io/store/types" - -// Interface wrappers for mocking -// -//go:generate moq -out ./mock/store.mock.go -pkg mock . MultiStore CacheMultiStore KVStore -type ( - // MultiStore wrapper for github.com/cosmos/cosmos-sdk/types.MultiStore. - MultiStore storetypes.MultiStore - // CacheMultiStore wrapper for github.com/cosmos/cosmos-sdk/types.CacheMultiStore. - CacheMultiStore storetypes.CacheMultiStore - // KVStore wrapper for github.com/cosmos/cosmos-sdk/types.KVStore. - KVStore storetypes.KVStore -) diff --git a/cosmos/testing/types/mock/store.go b/cosmos/testing/types/mock/store.go deleted file mode 100644 index 62b6f87d32..0000000000 --- a/cosmos/testing/types/mock/store.go +++ /dev/null @@ -1,326 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mock - -import ( - "bytes" - "io" - "sort" - "sync" - - "cosmossdk.io/store/types" - - "pkg.berachain.dev/polaris/cosmos/testing/types/mock/interfaces" - "pkg.berachain.dev/polaris/cosmos/testing/types/mock/interfaces/mock" - "pkg.berachain.dev/polaris/lib/utils" -) - -// MultiStore is a simple multistore used for testing. -type MultiStore struct { - kvstore map[string]interfaces.KVStore - *mock.MultiStoreMock -} - -// MultiStore implements precompile.MultiStore. -func (m MultiStore) SetReadOnly(bool) {} - -// MultiStore implements precompile.MultiStore. -func (m MultiStore) IsReadOnly() bool { return false } - -// CachedMultiStore is a simple chached multistore for testing. -type CachedMultiStore struct { - kvstore map[string]interfaces.KVStore - *mock.CacheMultiStoreMock -} - -// NewMultiStore returns a new Multistore instance used for testing. -func NewMultiStore() types.MultiStore { - ms := MultiStore{ - kvstore: map[string]interfaces.KVStore{}, - MultiStoreMock: &mock.MultiStoreMock{}, - } - ms.GetKVStoreFunc = func(storeKey types.StoreKey) types.KVStore { - if store, ok := ms.kvstore[storeKey.String()]; ok { - return store - } - store := newTestKVStore() - ms.kvstore[storeKey.String()] = store - return store - } - - ms.CacheMultiStoreFunc = func() types.CacheMultiStore { - return NewCachedMultiStore(ms) - } - - return ms -} - -// NewCachedMultiStore returns a new CacheMultiStore instance for testing. -func NewCachedMultiStore(ms MultiStore) types.CacheMultiStore { - kvstore := map[string]interfaces.KVStore{} - - for key, store := range ms.kvstore { - kvstore[key] = utils.MustGetAs[interfaces.KVStore](store.CacheWrap()) - } - - cached := CachedMultiStore{ - kvstore: kvstore, - CacheMultiStoreMock: &mock.CacheMultiStoreMock{}, - } - cached.GetKVStoreFunc = func(storeKey types.StoreKey) types.KVStore { - if store, ok := cached.kvstore[storeKey.String()]; ok { - return store - } - store := newTestKVStore() - store.write = func() { - ms.kvstore[storeKey.String()] = store - } - cached.kvstore[storeKey.String()] = store - return store - } - - cached.WriteFunc = func() { - for _, store := range cached.kvstore { - utils.MustGetAs[*TestKVStore](store).Write() - } - } - return cached -} - -// TestKVStore is a kv store for testing. -type TestKVStore struct { - mutex *sync.RWMutex - store map[string][]byte - write func() -} - -func (t TestKVStore) Write() { - t.write() -} - -// newTestKVStore returns a new kv store instance for testing. -func newTestKVStore() *TestKVStore { - return &TestKVStore{ - mutex: &sync.RWMutex{}, - store: map[string][]byte{}, - write: func() {}, - } -} - -// GetStoreType is not implemented. -func (t TestKVStore) GetStoreType() types.StoreType { - panic("implement me") -} - -// CacheWrap is not implemented. -func (t *TestKVStore) CacheWrap() types.CacheWrap { - t.mutex.RLock() - defer t.mutex.RUnlock() - - cache := &TestKVStore{ - mutex: &sync.RWMutex{}, - store: map[string][]byte{}, - } - cache.write = func() { t.store = cache.store } - - for key, val := range t.store { - cache.store[key] = val - } - - return cache -} - -// CacheWrapWithTrace is not implemented. -func (t TestKVStore) CacheWrapWithTrace(_ io.Writer, _ types.TraceContext) types.CacheWrap { - panic("implement me") -} - -// Get returns the value of the given key, nil if it does not exist. -func (t TestKVStore) Get(key []byte) []byte { - t.mutex.RLock() - defer t.mutex.RUnlock() - val, ok := t.store[string(key)] - - if !ok { - return nil - } - return val -} - -// Has checks if an entry for the given key exists. -func (t TestKVStore) Has(key []byte) bool { - t.mutex.RLock() - defer t.mutex.RUnlock() - _, ok := t.store[string(key)] - return ok -} - -// Set stores the given key value pair. -func (t TestKVStore) Set(key, value []byte) { - t.mutex.Lock() - defer t.mutex.Unlock() - t.store[string(key)] = value -} - -// Delete deletes a key if it exists. -func (t TestKVStore) Delete(key []byte) { - t.mutex.Lock() - defer t.mutex.Unlock() - - delete(t.store, string(key)) -} - -// Iterator returns an interator over the given key domain. -func (t TestKVStore) Iterator(start, end []byte) types.Iterator { - t.mutex.Lock() - defer t.mutex.Unlock() - - return newMockIterator(start, end, t.store) -} - -// ReverseIterator returns an iterator -// that iterates over all keys in the given domain in reverse order. -func (t TestKVStore) ReverseIterator(start, end []byte) types.Iterator { - t.mutex.Lock() - defer t.mutex.Unlock() - - iter := newMockIterator(start, end, t.store) - - // reverse the order of the iterator, which is returned already - // sorted in ascending order - for i, j := 0, len(iter.keys)-1; i < j; i, j = i+1, j-1 { - iter.keys[i], iter.keys[j] = iter.keys[j], iter.keys[i] - iter.values[i], iter.values[j] = iter.values[j], iter.values[i] - } - - iter.start = end - iter.end = start - - return iter -} - -// fake iterator. -type mockIterator struct { - keys [][]byte - values [][]byte - index int - start, end []byte -} - -func newMockIterator(start, end []byte, content map[string][]byte) *mockIterator { - keys := make([][]byte, 0) - - // select the keys according to the specified domain - for k := range content { - b := []byte(k) - - if (start == nil && end == nil) || - (bytes.Compare(b, start) >= 0 && bytes.Compare(b, end) < 0) { - // make sure data is a copy so that there is no concurrent writing - temp := make([]byte, len(k)) - copy(temp, k) - keys = append(keys, temp) - } - } - - // Sort the keys in ascending order - sort.Slice(keys, func(i, j int) bool { - return bytes.Compare(keys[i], keys[j]) < 0 - }) - - // With the keys chosen and sorted, we can now populate the slice of values - values := make([][]byte, len(keys)) - - for i := 0; i < len(keys); i++ { - // make sure data is a copy so that there is no concurrent writing - value := content[string(keys[i])] - temp := make([]byte, len(value)) - copy(temp, value) - - values[i] = temp - } - - return &mockIterator{ - keys: keys, - values: values, - index: 0, - start: start, - end: end, - } -} - -// Domain returns the key domain of the iterator. -// The start & end (exclusive) limits to iterate over. -// If end < start, then the Iterator goes in reverse order. -// -// A domain of ([]byte{12, 13}, []byte{12, 14}) will iterate -// over anything with the prefix []byte{12, 13}. -// -// The smallest key is the empty byte array []byte{} - see BeginningKey(). -// The largest key is the nil byte array []byte(nil) - see EndingKey(). -// CONTRACT: start, end readonly []byte. -func (mi mockIterator) Domain() ([]byte, []byte) { - return mi.start, mi.end -} - -// Valid returns whether the current position is valid. -// Once invalid, an Iterator is forever invalid. -func (mi mockIterator) Valid() bool { - return mi.index < len(mi.keys) -} - -// Next moves the iterator to the next sequential key in the database, as -// defined by order of iteration. -// If Valid returns false, this method will panic. -func (mi *mockIterator) Next() { - mi.index++ -} - -// Key returns the key of the cursor. -// If Valid returns false, this method will panic. -// CONTRACT: key readonly []byte. -func (mi mockIterator) Key() []byte { - if !mi.Valid() { - panic("Iterator position out of bounds") - } - - return mi.keys[mi.index] -} - -// Value returns the value of the cursor. -// If Valid returns false, this method will panic. -// CONTRACT: value readonly []byte. -func (mi mockIterator) Value() []byte { - if !mi.Valid() { - panic("Iterator position out of bounds") - } - - return mi.values[mi.index] -} - -func (mi mockIterator) Error() error { - return nil -} - -// Close releases the Iterator. -func (mi mockIterator) Close() error { - return nil -} diff --git a/cosmos/testing/utils/bank.go b/cosmos/testutil/bank.go similarity index 98% rename from cosmos/testing/utils/bank.go rename to cosmos/testutil/bank.go index 07509382f8..2bcf453318 100644 --- a/cosmos/testing/utils/bank.go +++ b/cosmos/testutil/bank.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package utils +package testutil import ( "context" diff --git a/cosmos/testing/utils/interfaces.go b/cosmos/testutil/interfaces.go similarity index 98% rename from cosmos/testing/utils/interfaces.go rename to cosmos/testutil/interfaces.go index 56502eb9bd..b1b944e56e 100644 --- a/cosmos/testing/utils/interfaces.go +++ b/cosmos/testutil/interfaces.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package utils +package testutil import ( "context" diff --git a/cosmos/testing/utils/setup.go b/cosmos/testutil/setup.go similarity index 84% rename from cosmos/testing/utils/setup.go rename to cosmos/testutil/setup.go index 8c84ee9552..32a6a70006 100644 --- a/cosmos/testing/utils/setup.go +++ b/cosmos/testutil/setup.go @@ -18,12 +18,16 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package utils +package testutil import ( "testing" + cdb "github.com/cosmos/cosmos-db" + "cosmossdk.io/log" + "cosmossdk.io/store/metrics" + "cosmossdk.io/store/rootmulti" storetypes "cosmossdk.io/store/types" cometproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -50,7 +54,6 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "pkg.berachain.dev/polaris/cosmos/testing/types/mock" "pkg.berachain.dev/polaris/cosmos/types" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" @@ -66,13 +69,26 @@ var ( ) // NewContext creates a SDK context and mounts a mock multistore. -func NewContext() sdk.Context { - return sdk.NewContext( - mock.NewMultiStore(), cometproto.Header{}, false, log.NewTestLogger(&testing.T{})) +func NewContext(logger log.Logger, storekeys ...storetypes.StoreKey) sdk.Context { + cdb := cdb.NewMemDB() + rms := rootmulti.NewStore(cdb, logger, metrics.NewNoOpMetrics()) + + // Register defaults + rms.MountStoreWithDB(AccKey, storetypes.StoreTypeIAVL, cdb) + rms.MountStoreWithDB(BankKey, storetypes.StoreTypeIAVL, cdb) + rms.MountStoreWithDB(EvmKey, storetypes.StoreTypeIAVL, cdb) + rms.MountStoreWithDB(StakingKey, storetypes.StoreTypeIAVL, cdb) + + // Allow extending the + for _, storeKey := range storekeys { + rms.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, cdb) + } + _ = rms.LoadLatestVersion() + return NewContextWithMultiStore(rms, logger) } -func NewContextWithMultiStore(ms storetypes.MultiStore) sdk.Context { - return sdk.NewContext(ms, cometproto.Header{}, false, log.NewTestLogger(&testing.T{})) +func NewContextWithMultiStore(ms storetypes.MultiStore, logger log.Logger) sdk.Context { + return sdk.NewContext(ms, cometproto.Header{}, false, logger) } // TestEncodingConfig defines an encoding configuration that is used for testing @@ -112,14 +128,14 @@ func MakeTestEncodingConfig(modules ...module.AppModuleBasic) TestEncodingConfig } // SetupMinimalKeepers creates and returns keepers for the base SDK modules. -func SetupMinimalKeepers() ( +func SetupMinimalKeepers(logger log.Logger, keys ...storetypes.StoreKey) ( sdk.Context, authkeeper.AccountKeeper, bankkeeper.BaseKeeper, stakingkeeper.Keeper, ) { types.SetupCosmosConfig() - ctx := NewContext().WithBlockHeight(1) + ctx := NewContext(logger, keys...).WithBlockHeight(1) encodingConfig := testutil.MakeTestEncodingConfig( auth.AppModuleBasic{}, @@ -144,7 +160,6 @@ func SetupMinimalKeepers() ( govtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, distrtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, }, - // TODO: switch to eip-55 fuck bech32. addrCodec, "cosmos", authority, diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 644e4d6cb2..003b1cdd7c 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -27,7 +27,6 @@ import ( "math/big" "cosmossdk.io/log" - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" @@ -35,7 +34,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" @@ -64,7 +63,7 @@ var _ = Describe("", func() { ) BeforeEach(func() { - ctx, ak, _, sk = testutil.SetupMinimalKeepers() + ctx, ak, _, sk = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) ctx = ctx.WithBlockHeight(0) sc = staking.NewPrecompileContract(ak, &sk) cfg := config.DefaultConfig() @@ -73,7 +72,7 @@ var _ = Describe("", func() { cfg.Node.KeyStoreDir = GinkgoT().TempDir() k = keeper.NewKeeper( ak, sk, - storetypes.NewKVStoreKey("evm"), + testutil.EvmKey, func() *ethprecompile.Injector { return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) }, diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go index d5d1691394..b882cc3c0b 100644 --- a/cosmos/x/evm/keeper/processor_test.go +++ b/cosmos/x/evm/keeper/processor_test.go @@ -36,7 +36,7 @@ import ( bindings "pkg.berachain.dev/polaris/contracts/bindings/testing" "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/eth/accounts/abi" @@ -88,14 +88,14 @@ var _ = Describe("Processor", func() { } // before chain, init genesis state - ctx, ak, _, sk = testutil.SetupMinimalKeepers() + ctx, ak, _, sk = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) cfg := config.DefaultConfig() cfg.Node.DataDir = GinkgoT().TempDir() cfg.Node.KeyStoreDir = GinkgoT().TempDir() sc = staking.NewPrecompileContract(ak, &sk) k = keeper.NewKeeper( ak, sk, - storetypes.NewKVStoreKey("evm"), + testutil.EvmKey, func() *ethprecompile.Injector { return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) }, diff --git a/cosmos/x/evm/plugins/block/header_test.go b/cosmos/x/evm/plugins/block/header_test.go index 07a6abe291..87212a5fd7 100644 --- a/cosmos/x/evm/plugins/block/header_test.go +++ b/cosmos/x/evm/plugins/block/header_test.go @@ -24,11 +24,12 @@ import ( "errors" "math/big" + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" @@ -44,8 +45,10 @@ var _ = Describe("Header", func() { var p *plugin BeforeEach(func() { - _, _, _, sk := testutil.SetupMinimalKeepers() - ctx = testutil.NewContext().WithBlockGasMeter(storetypes.NewGasMeter(uint64(10000))) + _, _, _, sk := testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) + ctx = testutil.NewContext( + log.NewTestLogger(GinkgoT())). + WithBlockGasMeter(storetypes.NewGasMeter(uint64(10000))) p = utils.MustGetAs[*plugin](NewPlugin(testutil.EvmKey, sk)) p.SetQueryContextFn( func() func(height int64, prove bool) (sdk.Context, error) { return mockQueryContext }) @@ -134,7 +137,7 @@ func mockQueryContext(height int64, _ bool) (sdk.Context, error) { if height <= 0 { return sdk.Context{}, errors.New("cannot query context at this height") } - ctx := testutil.NewContext().WithBlockHeight(height) + ctx := testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockHeight(height) header := generateHeaderAtHeight(height) headerBz, err := types.MarshalHeader(header) if err != nil { diff --git a/cosmos/x/evm/plugins/gas/plugin_test.go b/cosmos/x/evm/plugins/gas/plugin_test.go index 4ac1564860..d45b267a8a 100644 --- a/cosmos/x/evm/plugins/gas/plugin_test.go +++ b/cosmos/x/evm/plugins/gas/plugin_test.go @@ -23,11 +23,12 @@ package gas import ( "math" + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/lib/utils" . "github.com/onsi/ginkgo/v2" @@ -43,14 +44,14 @@ var _ = Describe("plugin", func() { BeforeEach(func() { // new block blockGasMeter = storetypes.NewGasMeter(blockGasLimit) - ctx = testutil.NewContext().WithBlockGasMeter(blockGasMeter) + ctx = testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter) p = utils.MustGetAs[*plugin](NewPlugin()) p.Reset(ctx) p.Prepare(ctx) }) It("correctly consume, refund, and report cumulative in the same block", func() { - p.Reset(testutil.NewContext().WithBlockGasMeter(blockGasMeter)) + p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) // tx 1 p.gasMeter = storetypes.NewGasMeter(1000) @@ -65,7 +66,7 @@ var _ = Describe("plugin", func() { // as block gas is handled by the baseapp. blockGasMeter.ConsumeGas(250, "") // finalize tx 1 - p.Reset(testutil.NewContext().WithBlockGasMeter(blockGasMeter)) + p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) // tx 2 p.gasMeter = storetypes.NewGasMeter(1000) @@ -77,7 +78,7 @@ var _ = Describe("plugin", func() { Expect(p.BlockGasConsumed()).To(Equal(uint64(250))) // shouldn't use any xtra gas yet. blockGasMeter.ConsumeGas(1000, "") // finalize tx 2 Expect(p.BlockGasConsumed()).To(Equal(uint64(1250))) - p.Reset(testutil.NewContext().WithBlockGasMeter(blockGasMeter)) + p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) // tx 3 p.gasMeter = storetypes.NewGasMeter(1000) @@ -110,14 +111,14 @@ var _ = Describe("plugin", func() { It("should error on block gas overconsumption", func() { Expect(p.BlockGasLimit()).To(Equal(blockGasLimit)) - p.Reset(testutil.NewContext().WithBlockGasMeter(blockGasMeter)) + p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) // tx 1 err := p.ConsumeTxGas(1000) Expect(err).ToNot(HaveOccurred()) blockGasMeter.ConsumeGas(1000, "") // finalize tx 1 - p.Reset(testutil.NewContext().WithBlockGasMeter(blockGasMeter)) + p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) // tx 2 err = p.ConsumeTxGas(1000) diff --git a/cosmos/x/evm/plugins/historical/plugin_test.go b/cosmos/x/evm/plugins/historical/plugin_test.go index 7815df67f2..e6f52e89fa 100644 --- a/cosmos/x/evm/plugins/historical/plugin_test.go +++ b/cosmos/x/evm/plugins/historical/plugin_test.go @@ -23,11 +23,13 @@ package historical import ( "math/big" + "cosmossdk.io/log" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/trie" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/mock" @@ -45,7 +47,7 @@ var _ = Describe("Historical Data", func() { ) BeforeEach(func() { - ctx = testutil.NewContext().WithBlockHeight(0) + ctx = testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockHeight(0) cp := mock.NewConfigurationPluginMock() bp := mock.NewBlockPluginMock() diff --git a/cosmos/x/evm/plugins/precompile/log/factory_test.go b/cosmos/x/evm/plugins/precompile/log/factory_test.go index d5e7ffd8c8..7b74eb6d14 100644 --- a/cosmos/x/evm/plugins/precompile/log/factory_test.go +++ b/cosmos/x/evm/plugins/precompile/log/factory_test.go @@ -24,13 +24,14 @@ import ( "errors" "strconv" + "cosmossdk.io/log" sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" cosmlib "pkg.berachain.dev/polaris/cosmos/lib" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/eth/accounts/abi" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/precompile" @@ -54,7 +55,7 @@ var _ = Describe("Factory", func() { ) BeforeEach(func() { - _, _, _, sk = testutil.SetupMinimalKeepers() + _, _, _, sk = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) valAddr = sdk.ValAddress([]byte("alice")) delAddr = sdk.AccAddress([]byte("bob")) creationHeight = int64(10) diff --git a/cosmos/x/evm/plugins/precompile/plugin_test.go b/cosmos/x/evm/plugins/precompile/plugin_test.go index 4ed23ffd42..135be6f22e 100644 --- a/cosmos/x/evm/plugins/precompile/plugin_test.go +++ b/cosmos/x/evm/plugins/precompile/plugin_test.go @@ -25,12 +25,13 @@ import ( "errors" "math/big" + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - tmock "pkg.berachain.dev/polaris/cosmos/testing/types/mock" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + "pkg.berachain.dev/polaris/cosmos/store/snapmulti" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events/mock" @@ -50,10 +51,11 @@ var _ = Describe("plugin", func() { var ctx sdk.Context BeforeEach(func() { - ctx = testutil.NewContext() + ctx = testutil.NewContext(log.NewTestLogger(GinkgoT())) ctx = ctx.WithEventManager( events.NewManagerFrom(ctx.EventManager(), mock.NewPrecompileLogFactory()), ) + ctx = ctx.WithMultiStore(snapmulti.NewStoreFrom(ctx.MultiStore())) p = utils.MustGetAs[*plugin](NewPlugin()) e = &mockEVM{nil, ctx, &mockSDB{nil, ctx, 0}} }) @@ -70,7 +72,7 @@ var _ = Describe("plugin", func() { }) It("should handle read-only static calls", func() { - ms := utils.MustGetAs[tmock.MultiStore](ctx.MultiStore()) + ms := utils.MustGetAs[MultiStore](ctx.MultiStore()) cem := utils.MustGetAs[state.ControllableEventManager](ctx.EventManager()) // verify its not read-only right now Expect(ms.IsReadOnly()).To(BeFalse()) diff --git a/cosmos/x/evm/plugins/state/events/manager_test.go b/cosmos/x/evm/plugins/state/events/manager_test.go index 9b454393aa..f6f1e19212 100644 --- a/cosmos/x/evm/plugins/state/events/manager_test.go +++ b/cosmos/x/evm/plugins/state/events/manager_test.go @@ -18,9 +18,11 @@ package events_test import ( + "cosmossdk.io/log" + sdk "github.com/cosmos/cosmos-sdk/types" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state/events/mock" @@ -37,7 +39,7 @@ var _ = Describe("Manager", func() { BeforeEach(func() { ldb = mock.NewEmptyLogsDB() - ctx = testutil.NewContext() + ctx = testutil.NewContext(log.NewTestLogger(GinkgoT())) ctx.EventManager().EmitEvent(sdk.NewEvent("1")) cem = events.NewManagerFrom(ctx.EventManager(), mock.NewPrecompileLogFactory()) diff --git a/cosmos/x/evm/plugins/state/genesis_test.go b/cosmos/x/evm/plugins/state/genesis_test.go index fe7228fb6e..81818fbebe 100644 --- a/cosmos/x/evm/plugins/state/genesis_test.go +++ b/cosmos/x/evm/plugins/state/genesis_test.go @@ -23,9 +23,11 @@ package state_test import ( "math/big" + "cosmossdk.io/log" + sdk "github.com/cosmos/cosmos-sdk/types" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" @@ -44,7 +46,7 @@ var _ = Describe("Genesis", func() { BeforeEach(func() { var ak state.AccountKeeper - ctx, ak, _, _ = testutil.SetupMinimalKeepers() + ctx, ak, _, _ = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) // Create account for alice, bob diff --git a/cosmos/x/evm/plugins/state/plugin_benchmark_test.go b/cosmos/x/evm/plugins/state/plugin_benchmark_test.go index 7004c07209..1be40c1c27 100644 --- a/cosmos/x/evm/plugins/state/plugin_benchmark_test.go +++ b/cosmos/x/evm/plugins/state/plugin_benchmark_test.go @@ -24,7 +24,9 @@ import ( "math/big" "testing" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + "cosmossdk.io/log" + + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" @@ -37,7 +39,7 @@ var ( ) func GetNewStatePlugin() core.StatePlugin { - ctx, ak, _, _ := testutil.SetupMinimalKeepers() + ctx, ak, _, _ := testutil.SetupMinimalKeepers(log.NewTestLogger(&testing.B{})) sp := state.NewPlugin(ak, testutil.EvmKey, nil) sp.Reset(ctx) return sp diff --git a/cosmos/x/evm/plugins/state/plugin_test.go b/cosmos/x/evm/plugins/state/plugin_test.go index 9796970650..a506dcd658 100644 --- a/cosmos/x/evm/plugins/state/plugin_test.go +++ b/cosmos/x/evm/plugins/state/plugin_test.go @@ -23,9 +23,11 @@ package state_test import ( "math/big" + "cosmossdk.io/log" + sdk "github.com/cosmos/cosmos-sdk/types" - testutil "pkg.berachain.dev/polaris/cosmos/testing/utils" + testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/eth/common" coretypes "pkg.berachain.dev/polaris/eth/core/types" @@ -47,7 +49,7 @@ var _ = Describe("State Plugin", func() { var sp state.Plugin BeforeEach(func() { - ctx, ak, _, _ = testutil.SetupMinimalKeepers() + ctx, ak, _, _ = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) sp.Reset(ctx) }) @@ -63,7 +65,7 @@ var _ = Describe("State Plugin", func() { sp.SetCode(alice, []byte{1, 2, 3}) sp.SetState(alice, common.BytesToHash([]byte{1}), common.BytesToHash([]byte{2})) - sp.Reset(testutil.NewContext()) + sp.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT()))) Expect(sp.Exist(alice)).To(BeFalse()) Expect(sp.GetBalance(alice)).To(Equal(new(big.Int))) From 7b31a3647f4b3fe79f9a59a9d1e23cb6ab916f07 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 9 Oct 2023 01:18:44 -0400 Subject: [PATCH 078/122] chore(testing): more general cleanup --- cosmos/config/config.go | 204 ++++++++++-------- cosmos/{types => config}/config_test.go | 37 +--- cosmos/config/flags.go | 125 ----------- cosmos/config/flags/flags.go | 124 +++++++++++ .../precompile/governance/governance_test.go | 3 - cosmos/testutil/bank.go | 9 + cosmos/testutil/interfaces.go | 36 ---- cosmos/testutil/setup.go | 2 - cosmos/types/config.go | 48 ----- e2e/testapp/polard/cmd/root_test.go | 5 - e2e/testapp/polard/main.go | 4 +- go.work.sum | 2 - 12 files changed, 251 insertions(+), 348 deletions(-) rename cosmos/{types => config}/config_test.go (56%) delete mode 100644 cosmos/config/flags.go create mode 100644 cosmos/config/flags/flags.go delete mode 100644 cosmos/testutil/interfaces.go delete mode 100644 cosmos/types/config.go diff --git a/cosmos/config/config.go b/cosmos/config/config.go index 7f672f7c66..c9dd76499c 100644 --- a/cosmos/config/config.go +++ b/cosmos/config/config.go @@ -23,14 +23,30 @@ package config import ( "math/big" - "github.com/cosmos/cosmos-sdk/client/flags" + sdkflags "github.com/cosmos/cosmos-sdk/client/flags" servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/node" + "pkg.berachain.dev/polaris/cosmos/config/flags" + "pkg.berachain.dev/polaris/eth/accounts" "pkg.berachain.dev/polaris/eth/polar" ) +// SetupCosmosConfig sets up the Cosmos SDK configuration to be compatible with the +// semantics of etheruem. +func SetupCosmosConfig() { + // set the address prefixes + config := sdk.GetConfig() + + // We use CoinType == 60 to match Ethereum. + // This is not strictly necessary, though highly recommended. + config.SetCoinType(accounts.Bip44CoinType) + config.SetPurpose(sdk.Purpose) + config.Seal() +} + // DefaultConfig returns the default configuration for a polaris chain. func DefaultConfig() *Config { nodeCfg := *polar.DefaultGethNodeConfig() @@ -42,11 +58,15 @@ func DefaultConfig() *Config { } } +// Config represents the configuration options for a node running a polar +// evm. type Config struct { Polar polar.Config Node node.Config } +// MustReadConfigFromAppOpts reads the configuration options from the given +// application options. Panics if the configuration cannot be read. func MustReadConfigFromAppOpts(opts servertypes.AppOptions) *Config { cfg, err := ReadConfigFromAppOpts(opts) if err != nil { @@ -55,6 +75,8 @@ func MustReadConfigFromAppOpts(opts servertypes.AppOptions) *Config { return cfg } +// ReadConfigFromAppOpts reads the configuration options from the given +// application options. func ReadConfigFromAppOpts(opts servertypes.AppOptions) (*Config, error) { return readConfigFromAppOptsParser(AppOptionsParser{AppOptions: opts}) } @@ -67,398 +89,398 @@ func readConfigFromAppOptsParser(parser AppOptionsParser) (*Config, error) { // Polar settings if conf.Polar.RPCGasCap, err = - parser.GetUint64(flagRPCGasCap); err != nil { + parser.GetUint64(flags.RPCGasCap); err != nil { return nil, err } if conf.Polar.RPCEVMTimeout, err = - parser.GetTimeDuration(flagRPCEvmTimeout); err != nil { + parser.GetTimeDuration(flags.RPCEvmTimeout); err != nil { return nil, err } if conf.Polar.RPCTxFeeCap, err = - parser.GetFloat64(flagRPCTxFeeCap); err != nil { + parser.GetFloat64(flags.RPCTxFeeCap); err != nil { return nil, err } // Polar Miner settings if conf.Polar.Miner.Etherbase, err = - parser.GetCommonAddress(flagMinerEtherbase); err != nil { + parser.GetCommonAddress(flags.MinerEtherbase); err != nil { return nil, err } if conf.Polar.Miner.ExtraData, err = - parser.GetHexutilBytes(flagMinerExtraData); err != nil { + parser.GetHexutilBytes(flags.MinerExtraData); err != nil { return nil, err } if conf.Polar.Miner.GasFloor, err = - parser.GetUint64(flagMinerGasFloor); err != nil { + parser.GetUint64(flags.MinerGasFloor); err != nil { return nil, err } if conf.Polar.Miner.GasCeil, err = - parser.GetUint64(flagMinerGasCeil); err != nil { + parser.GetUint64(flags.MinerGasCeil); err != nil { return nil, err } if conf.Polar.Miner.GasPrice, err = - parser.GetBigInt(flagMinerGasPrice); err != nil { + parser.GetBigInt(flags.MinerGasPrice); err != nil { return nil, err } if conf.Polar.Miner.Recommit, err = - parser.GetTimeDuration(flagMinerRecommit); err != nil { + parser.GetTimeDuration(flags.MinerRecommit); err != nil { return nil, err } if conf.Polar.Miner.NewPayloadTimeout, err = - parser.GetTimeDuration(flagMinerNewPayloadTimeout); err != nil { + parser.GetTimeDuration(flags.MinerNewPayloadTimeout); err != nil { return nil, err } // Polar Chain settings if conf.Polar.Chain.ChainID, err = - parser.GetBigInt(flagChainID); err != nil { + parser.GetBigInt(flags.ChainID); err != nil { return nil, err } if conf.Polar.Chain.HomesteadBlock, err = - parser.GetBigInt(flagHomesteadBlock); err != nil { + parser.GetBigInt(flags.HomesteadBlock); err != nil { return nil, err } if conf.Polar.Chain.DAOForkBlock, err = - parser.GetBigInt(flagDAOForkBlock); err != nil { + parser.GetBigInt(flags.DAOForkBlock); err != nil { return nil, err } if conf.Polar.Chain.DAOForkSupport, err = - parser.GetBool(flagDAOForkSupport); err != nil { + parser.GetBool(flags.DAOForkSupport); err != nil { return nil, err } if conf.Polar.Chain.EIP150Block, err = - parser.GetBigInt(flagEIP150Block); err != nil { + parser.GetBigInt(flags.EIP150Block); err != nil { return nil, err } if conf.Polar.Chain.EIP155Block, err = - parser.GetBigInt(flagEIP155Block); err != nil { + parser.GetBigInt(flags.EIP155Block); err != nil { return nil, err } if conf.Polar.Chain.EIP158Block, err = - parser.GetBigInt(flagEIP158Block); err != nil { + parser.GetBigInt(flags.EIP158Block); err != nil { return nil, err } if conf.Polar.Chain.ByzantiumBlock, err = - parser.GetBigInt(flagByzantiumBlock); err != nil { + parser.GetBigInt(flags.ByzantiumBlock); err != nil { return nil, err } if conf.Polar.Chain.ConstantinopleBlock, err = - parser.GetBigInt(flagConstantinopleBlock); err != nil { + parser.GetBigInt(flags.ConstantinopleBlock); err != nil { return nil, err } if conf.Polar.Chain.PetersburgBlock, err = - parser.GetBigInt(flagPetersburgBlock); err != nil { + parser.GetBigInt(flags.PetersburgBlock); err != nil { return nil, err } if conf.Polar.Chain.IstanbulBlock, err = - parser.GetBigInt(flagIstanbulBlock); err != nil { + parser.GetBigInt(flags.IstanbulBlock); err != nil { return nil, err } if conf.Polar.Chain.MuirGlacierBlock, err = - parser.GetBigInt(flagMuirGlacierBlock); err != nil { + parser.GetBigInt(flags.MuirGlacierBlock); err != nil { return nil, err } if conf.Polar.Chain.BerlinBlock, err = - parser.GetBigInt(flagBerlinBlock); err != nil { + parser.GetBigInt(flags.BerlinBlock); err != nil { return nil, err } if conf.Polar.Chain.LondonBlock, err = - parser.GetBigInt(flagLondonBlock); err != nil { + parser.GetBigInt(flags.LondonBlock); err != nil { return nil, err } if conf.Polar.Chain.ArrowGlacierBlock, err = - parser.GetBigInt(flagArrowGlacierBlock); err != nil { + parser.GetBigInt(flags.ArrowGlacierBlock); err != nil { return nil, err } if conf.Polar.Chain.GrayGlacierBlock, err = - parser.GetBigInt(flagGrayGlacierBlock); err != nil { + parser.GetBigInt(flags.GrayGlacierBlock); err != nil { return nil, err } if conf.Polar.Chain.MergeNetsplitBlock, err = - parser.GetBigInt(flagMergeNetsplitBlock); err != nil { + parser.GetBigInt(flags.MergeNetsplitBlock); err != nil { return nil, err } if conf.Polar.Chain.ShanghaiTime, err = - parser.GetUint64Ptr(flagShanghaiTime); err != nil { + parser.GetUint64Ptr(flags.ShanghaiTime); err != nil { return nil, err } if conf.Polar.Chain.CancunTime, err = - parser.GetUint64Ptr(flagCancunTime); err != nil { + parser.GetUint64Ptr(flags.CancunTime); err != nil { return nil, err } if conf.Polar.Chain.PragueTime, err = - parser.GetUint64Ptr(flagPragueTime); err != nil { + parser.GetUint64Ptr(flags.PragueTime); err != nil { return nil, err } if conf.Polar.Chain.VerkleTime, err = - parser.GetUint64Ptr(flagVerkleTime); err != nil { + parser.GetUint64Ptr(flags.VerkleTime); err != nil { return nil, err } if conf.Polar.Chain.TerminalTotalDifficulty, err = parser.GetBigInt( - flagTerminalTotalDifficulty); err != nil { + flags.TerminalTotalDifficulty); err != nil { return nil, err } if conf.Polar.Chain.TerminalTotalDifficultyPassed, err = parser.GetBool( - flagTerminalTotalDifficultyPassed); err != nil { + flags.TerminalTotalDifficultyPassed); err != nil { return nil, err } if conf.Polar.Chain.IsDevMode, err = - parser.GetBool(flagIsDevMode); err != nil { + parser.GetBool(flags.IsDevMode); err != nil { return nil, err } // Polar.GPO settings if conf.Polar.GPO.Blocks, err = - parser.GetInt(flagBlocks); err != nil { + parser.GetInt(flags.Blocks); err != nil { return nil, err } if conf.Polar.GPO.Percentile, err = - parser.GetInt(flagPercentile); err != nil { + parser.GetInt(flags.Percentile); err != nil { return nil, err } if conf.Polar.GPO.MaxHeaderHistory, err = - parser.GetUint64(flagMaxHeaderHistory); err != nil { + parser.GetUint64(flags.MaxHeaderHistory); err != nil { return nil, err } if conf.Polar.GPO.MaxBlockHistory, err = - parser.GetUint64(flagMaxBlockHistory); err != nil { + parser.GetUint64(flags.MaxBlockHistory); err != nil { return nil, err } if val, err = - parser.GetInt64(flagDefault); err != nil { + parser.GetInt64(flags.Default); err != nil { return nil, err } conf.Polar.GPO.Default = big.NewInt(val) if val, err = - parser.GetInt64(flagMaxPrice); err != nil { + parser.GetInt64(flags.MaxPrice); err != nil { return nil, err } conf.Polar.GPO.MaxPrice = big.NewInt(val) if val, err = - parser.GetInt64(flagIgnorePrice); err != nil { + parser.GetInt64(flags.IgnorePrice); err != nil { return nil, err } conf.Polar.GPO.IgnorePrice = big.NewInt(val) // LegacyPool if conf.Polar.LegacyTxPool.Locals, err = - parser.GetCommonAddressList(flagLocals); err != nil { + parser.GetCommonAddressList(flags.Locals); err != nil { return nil, err } if conf.Polar.LegacyTxPool.NoLocals, err = - parser.GetBool(flagNoLocals); err != nil { + parser.GetBool(flags.NoLocals); err != nil { return nil, err } if conf.Polar.LegacyTxPool.Journal, err = - parser.GetString(flagJournal); err != nil { + parser.GetString(flags.Journal); err != nil { return nil, err } if conf.Polar.LegacyTxPool.Rejournal, err = - parser.GetTimeDuration(flagReJournal); err != nil { + parser.GetTimeDuration(flags.ReJournal); err != nil { return nil, err } if conf.Polar.LegacyTxPool.PriceLimit, err = - parser.GetUint64(flagPriceLimit); err != nil { + parser.GetUint64(flags.PriceLimit); err != nil { return nil, err } if conf.Polar.LegacyTxPool.PriceBump, err = - parser.GetUint64(flagPriceBump); err != nil { + parser.GetUint64(flags.PriceBump); err != nil { return nil, err } if conf.Polar.LegacyTxPool.AccountSlots, err = - parser.GetUint64(flagAccountSlots); err != nil { + parser.GetUint64(flags.AccountSlots); err != nil { return nil, err } if conf.Polar.LegacyTxPool.GlobalSlots, err = - parser.GetUint64(flagGlobalSlots); err != nil { + parser.GetUint64(flags.GlobalSlots); err != nil { return nil, err } if conf.Polar.LegacyTxPool.AccountQueue, err = - parser.GetUint64(flagAccountQueue); err != nil { + parser.GetUint64(flags.AccountQueue); err != nil { return nil, err } if conf.Polar.LegacyTxPool.GlobalQueue, err = - parser.GetUint64(flagGlobalQueue); err != nil { + parser.GetUint64(flags.GlobalQueue); err != nil { return nil, err } if conf.Polar.LegacyTxPool.Lifetime, err = - parser.GetTimeDuration(flagLifetime); err != nil { + parser.GetTimeDuration(flags.Lifetime); err != nil { return nil, err } // Node settings if conf.Node.Name, err = - parser.GetString(flagName); err != nil { + parser.GetString(flags.Name); err != nil { return nil, err } if conf.Node.UserIdent, err = - parser.GetString(flagUserIdent); err != nil { + parser.GetString(flags.UserIdent); err != nil { return nil, err } if conf.Node.Version, err = - parser.GetString(flagVersion); err != nil { + parser.GetString(flags.Version); err != nil { return nil, err } if conf.Node.DataDir, err = - parser.GetString(flagDataDir); err != nil { + parser.GetString(flags.DataDir); err != nil { return nil, err } if conf.Node.DataDir == "" { conf.Node.DataDir, err = - parser.GetString(flags.FlagHome) + parser.GetString(sdkflags.FlagHome) if err != nil { return nil, err } } if conf.Node.KeyStoreDir, err = - parser.GetString(flagKeyStoreDir); err != nil { + parser.GetString(flags.KeyStoreDir); err != nil { return nil, err } if conf.Node.ExternalSigner, err = - parser.GetString(flagExternalSigner); err != nil { + parser.GetString(flags.ExternalSigner); err != nil { return nil, err } if conf.Node.UseLightweightKDF, err = - parser.GetBool(flagUseLightweightKdf); err != nil { + parser.GetBool(flags.UseLightweightKdf); err != nil { return nil, err } if conf.Node.InsecureUnlockAllowed, err = - parser.GetBool(flagInsecureUnlockAllowed); err != nil { + parser.GetBool(flags.InsecureUnlockAllowed); err != nil { return nil, err } if conf.Node.USB, err = - parser.GetBool(flagUsb); err != nil { + parser.GetBool(flags.Usb); err != nil { return nil, err } if conf.Node.SmartCardDaemonPath, err = - parser.GetString(flagSmartCardDaemonPath); err != nil { + parser.GetString(flags.SmartCardDaemonPath); err != nil { return nil, err } if conf.Node.IPCPath, err = - parser.GetString(flagIpcPath); err != nil { + parser.GetString(flags.IpcPath); err != nil { return nil, err } if conf.Node.HTTPHost, err = - parser.GetString(flagHTTPHost); err != nil { + parser.GetString(flags.HTTPHost); err != nil { return nil, err } if conf.Node.HTTPPort, err = - parser.GetInt(flagHTTPPort); err != nil { + parser.GetInt(flags.HTTPPort); err != nil { return nil, err } if conf.Node.HTTPCors, err = - parser.GetStringSlice(flagHTTPCors); err != nil { + parser.GetStringSlice(flags.HTTPCors); err != nil { return nil, err } if conf.Node.HTTPVirtualHosts, err = - parser.GetStringSlice(flagHTTPVirtualHosts); err != nil { + parser.GetStringSlice(flags.HTTPVirtualHosts); err != nil { return nil, err } if conf.Node.HTTPModules, err = - parser.GetStringSlice(flagHTTPModules); err != nil { + parser.GetStringSlice(flags.HTTPModules); err != nil { return nil, err } if conf.Node.HTTPPathPrefix, err = - parser.GetString(flagHTTPPathPrefix); err != nil { + parser.GetString(flags.HTTPPathPrefix); err != nil { return nil, err } if conf.Node.AuthAddr, err = - parser.GetString(flagAuthAddr); err != nil { + parser.GetString(flags.AuthAddr); err != nil { return nil, err } if conf.Node.AuthPort, err = - parser.GetInt(flagAuthPort); err != nil { + parser.GetInt(flags.AuthPort); err != nil { return nil, err } if conf.Node.AuthVirtualHosts, err = - parser.GetStringSlice(flagAuthVirtualHosts); err != nil { + parser.GetStringSlice(flags.AuthVirtualHosts); err != nil { return nil, err } if conf.Node.WSHost, err = - parser.GetString(flagWsHost); err != nil { + parser.GetString(flags.WsHost); err != nil { return nil, err } if conf.Node.WSPort, err = - parser.GetInt(flagWsPort); err != nil { + parser.GetInt(flags.WsPort); err != nil { return nil, err } if conf.Node.WSPathPrefix, err = - parser.GetString(flagWsPathPrefix); err != nil { + parser.GetString(flags.WsPathPrefix); err != nil { return nil, err } if conf.Node.WSOrigins, err = - parser.GetStringSlice(flagWsOrigins); err != nil { + parser.GetStringSlice(flags.WsOrigins); err != nil { return nil, err } if conf.Node.WSModules, err = - parser.GetStringSlice(flagWsModules); err != nil { + parser.GetStringSlice(flags.WsModules); err != nil { return nil, err } if conf.Node.WSExposeAll, err = - parser.GetBool(flagWsExposeAll); err != nil { + parser.GetBool(flags.WsExposeAll); err != nil { return nil, err } if conf.Node.GraphQLCors, err = - parser.GetStringSlice(flagGraphqlCors); err != nil { + parser.GetStringSlice(flags.GraphqlCors); err != nil { return nil, err } if conf.Node.GraphQLVirtualHosts, err = - parser.GetStringSlice(flagGraphqlVirtualHosts); err != nil { + parser.GetStringSlice(flags.GraphqlVirtualHosts); err != nil { return nil, err } if conf.Node.AllowUnprotectedTxs, err = - parser.GetBool(flagAllowUnprotectedTxs); err != nil { + parser.GetBool(flags.AllowUnprotectedTxs); err != nil { return nil, err } if conf.Node.BatchRequestLimit, err = - parser.GetInt(flagBatchRequestLimit); err != nil { + parser.GetInt(flags.BatchRequestLimit); err != nil { return nil, err } if conf.Node.BatchResponseMaxSize, err = - parser.GetInt(flagBatchResponseMaxSize); err != nil { + parser.GetInt(flags.BatchResponseMaxSize); err != nil { return nil, err } if conf.Node.JWTSecret, err = - parser.GetString(flagJwtSecret); err != nil { + parser.GetString(flags.JwtSecret); err != nil { return nil, err } if conf.Node.DBEngine, err = - parser.GetString(flagDBEngine); err != nil { + parser.GetString(flags.DBEngine); err != nil { return nil, err } // Node.HTTPTimeouts settings if conf.Node.HTTPTimeouts.ReadTimeout, err = - parser.GetTimeDuration(flagReadTimeout); err != nil { + parser.GetTimeDuration(flags.ReadTimeout); err != nil { return nil, err } if conf.Node.HTTPTimeouts.ReadHeaderTimeout, err = parser.GetTimeDuration( - flagReadHeaderTimeout); err != nil { + flags.ReadHeaderTimeout); err != nil { return nil, err } if conf.Node.HTTPTimeouts.WriteTimeout, err = - parser.GetTimeDuration(flagWriteTimeout); err != nil { + parser.GetTimeDuration(flags.WriteTimeout); err != nil { return nil, err } if conf.Node.HTTPTimeouts.IdleTimeout, err = - parser.GetTimeDuration(flagIdleTimeout); err != nil { + parser.GetTimeDuration(flags.IdleTimeout); err != nil { return nil, err } diff --git a/cosmos/types/config_test.go b/cosmos/config/config_test.go similarity index 56% rename from cosmos/types/config_test.go rename to cosmos/config/config_test.go index 9f548eae1e..988da0af17 100644 --- a/cosmos/types/config_test.go +++ b/cosmos/config/config_test.go @@ -18,58 +18,27 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package types_test +package config_test import ( - "testing" - "github.com/cosmos/cosmos-sdk/crypto/hd" sdk "github.com/cosmos/cosmos-sdk/types" - sgconfig "pkg.berachain.dev/polaris/cosmos/types" + sgconfig "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/eth/accounts" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) -func TestConfig(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/types") -} - var _ = Describe("Configuration", func() { - It("should set Bech32 prefixes", func() { - config := sdk.GetConfig() - - Expect(config.GetBech32AccountAddrPrefix()).To(Equal(sdk.Bech32PrefixAccAddr)) - Expect(config.GetBech32AccountPubPrefix()).To(Equal(sdk.Bech32PrefixAccPub)) - Expect(config.GetBech32ValidatorAddrPrefix()).To(Equal(sdk.Bech32PrefixValAddr)) - Expect(config.GetBech32ValidatorPubPrefix()).To(Equal(sdk.Bech32PrefixValPub)) - Expect(config.GetBech32ConsensusAddrPrefix()).To(Equal(sdk.Bech32PrefixConsAddr)) - Expect(config.GetBech32ConsensusPubPrefix()).To(Equal(sdk.Bech32PrefixConsPub)) - - Expect(config.GetBech32AccountAddrPrefix()). - To(Equal(sdk.GetConfig().GetBech32AccountAddrPrefix())) - Expect(config.GetBech32AccountPubPrefix()). - To(Equal(sdk.GetConfig().GetBech32AccountPubPrefix())) - Expect(config.GetBech32ValidatorAddrPrefix()). - To(Equal(sdk.GetConfig().GetBech32ValidatorAddrPrefix())) - Expect(config.GetBech32ValidatorPubPrefix()). - To(Equal(sdk.GetConfig().GetBech32ValidatorPubPrefix())) - Expect(config.GetBech32ConsensusAddrPrefix()). - To(Equal(sdk.GetConfig().GetBech32ConsensusAddrPrefix())) - Expect(config.GetBech32ConsensusPubPrefix()). - To(Equal(sdk.GetConfig().GetBech32ConsensusPubPrefix())) - }) - It("should set CoinType", func() { config := sdk.GetConfig() Expect(int(config.GetCoinType())).To(Equal(sdk.CoinType)) Expect(config.GetFullBIP44Path()).To(Equal(sdk.FullFundraiserPath)) - sgconfig.SetBip44CoinType(config) + sgconfig.SetupCosmosConfig() Expect(int(config.GetCoinType())).To(Equal(int(accounts.Bip44CoinType))) Expect(config.GetCoinType()).To(Equal(sdk.GetConfig().GetCoinType())) diff --git a/cosmos/config/flags.go b/cosmos/config/flags.go deleted file mode 100644 index 7c7ded0aa4..0000000000 --- a/cosmos/config/flags.go +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package config - -const ( - - // Polar Root. - flagRPCEvmTimeout = "polaris.polar.rpc-evm-timeout" - flagRPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" - flagRPCGasCap = "polaris.polar.rpc-gas-cap" - - // Miner. - flagMinerEtherbase = "polaris.polar.miner.etherbase" - flagMinerExtraData = "polaris.polar.miner.extra-data" - flagMinerGasFloor = "polaris.polar.miner.gas-floor" - flagMinerGasCeil = "polaris.polar.miner.gas-ceil" - flagMinerGasPrice = "polaris.polar.miner.gas-price" - flagMinerRecommit = "polaris.polar.miner.recommit" - flagMinerNewPayloadTimeout = "polaris.polar.miner.new-payload-timeout" - - // GPO. - flagBlocks = "polaris.polar.gpo.blocks" - flagMaxBlockHistory = "polaris.polar.gpo.max-block-history" - flagPercentile = "polaris.polar.gpo.percentile" - flagMaxHeaderHistory = "polaris.polar.gpo.max-header-history" - - // Node. - flagJwtSecret = "polaris.node.jwt-secret" //#nosec: G101 // not a secret. - flagWsPort = "polaris.node.ws-port" - flagBatchRequestLimit = "polaris.node.batch-request-limit" - flagKeyStoreDir = "polaris.node.key-store-dir" - flagDBEngine = "polaris.node.db-engine" - flagReadTimeout = "polaris.node.http-timeouts.read-timeout" - flagDataDir = "polaris.node.data-dir" - flagUserIdent = "polaris.node.user-ident" - flagGraphqlCors = "polaris.node.graphql-cors" - flagSmartCardDaemonPath = "polaris.node.smart-card-daemon-path" - flagWsModules = "polaris.node.ws-modules" - flagHTTPCors = "polaris.node.http-cors" - flagIdleTimeout = "polaris.node.http-timeouts.idle-timeout" - flagAuthAddr = "polaris.node.auth-addr" - flagAllowUnprotectedTxs = "polaris.node.allow-unprotected-txs" - flagHTTPHost = "polaris.node.http-host" - flagUseLightweightKdf = "polaris.node.use-lightweight-kdf" - flagWsExposeAll = "polaris.node.ws-expose-all" - flagInsecureUnlockAllowed = "polaris.node.insecure-unlock-allowed" - flagWsPathPrefix = "polaris.node.ws-path-prefix" - flagWsHost = "polaris.node.ws-host" - flagName = "polaris.node.name" - flagAuthVirtualHosts = "polaris.node.auth-virtual-hosts" - flagAuthPort = "polaris.node.auth-port" - flagUsb = "polaris.node.usb" - flagHTTPPort = "polaris.node.http-port" - flagBatchResponseMaxSize = "polaris.node.batch-response-max-size" - flagVersion = "polaris.node.version" - flagHTTPVirtualHosts = "polaris.node.http-virtual-hosts" - flagExternalSigner = "polaris.node.external-signer" - flagHTTPPathPrefix = "polaris.node.http-path-prefix" - flagWriteTimeout = "polaris.node.http-timeouts.write-timeout" - flagReadHeaderTimeout = "polaris.node.http-timeouts.read-header-timeout" - flagHTTPModules = "polaris.node.http-modules" - flagWsOrigins = "polaris.node.ws-origins" - flagDefault = "polaris.node.http-timeouts.default" - flagMaxPrice = "polaris.node.http-timeouts.max-price" - flagIgnorePrice = "polaris.node.http-timeouts.ignore-price" - flagGraphqlVirtualHosts = "polaris.node.graphql-virtual-hosts" - flagIpcPath = "polaris.node.ipc-path" - - // Legacy TxPool. - flagLocals = "polaris.polar.legacy-tx-pool.locals" - flagNoLocals = "polaris.polar.legacy-tx-pool.no-locals" - flagJournal = "polaris.polar.legacy-tx-pool.journal" - flagReJournal = "polaris.polar.legacy-tx-pool.rejournal" - flagPriceLimit = "polaris.polar.legacy-tx-pool.price-limit" - flagPriceBump = "polaris.polar.legacy-tx-pool.price-bump" - flagAccountSlots = "polaris.polar.legacy-tx-pool.account-slots" - flagGlobalSlots = "polaris.polar.legacy-tx-pool.global-slots" - flagAccountQueue = "polaris.polar.legacy-tx-pool.account-queue" - flagGlobalQueue = "polaris.polar.legacy-tx-pool.global-queue" - flagLifetime = "polaris.polar.legacy-tx-pool.lifetime" - - // Chain Config. - flagChainID = "polaris.polar.chain.chain-id" - flagHomesteadBlock = "polaris.polar.chain.homestead-block" - flagDAOForkBlock = "polaris.polar.chain.dao-fork-block" - flagDAOForkSupport = "polaris.polar.chain.dao-fork-support" - flagEIP150Block = "polaris.polar.chain.eip150-block" - flagEIP155Block = "polaris.polar.chain.eip155-block" - flagEIP158Block = "polaris.polar.chain.eip158-block" - flagByzantiumBlock = "polaris.polar.chain.byzantium-block" - flagConstantinopleBlock = "polaris.polar.chain.constantinople-block" - flagPetersburgBlock = "polaris.polar.chain.petersburg-block" - flagIstanbulBlock = "polaris.polar.chain.istanbul-block" - flagMuirGlacierBlock = "polaris.polar.chain.muir-glacier-block" - flagBerlinBlock = "polaris.polar.chain.berlin-block" - flagLondonBlock = "polaris.polar.chain.london-block" - flagArrowGlacierBlock = "polaris.polar.chain.arrow-glacier-block" - flagGrayGlacierBlock = "polaris.polar.chain.gray-glacier-block" - flagMergeNetsplitBlock = "polaris.polar.chain.merge-netsplit-block" - flagShanghaiTime = "polaris.polar.chain.shanghai-time" - flagCancunTime = "polaris.polar.chain.cancun-time" - flagPragueTime = "polaris.polar.chain.prague-time" - flagVerkleTime = "polaris.polar.chain.verkle-time" - flagTerminalTotalDifficulty = "polaris.polar.chain.terminal-total-difficulty" - flagTerminalTotalDifficultyPassed = "polaris.polar.chain.terminal-total-difficulty-passed" - flagIsDevMode = "polaris.polar.chain.is-dev-mode" -) diff --git a/cosmos/config/flags/flags.go b/cosmos/config/flags/flags.go new file mode 100644 index 0000000000..75a5ff258f --- /dev/null +++ b/cosmos/config/flags/flags.go @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package flags + +const ( + // Polar Root. + RPCEvmTimeout = "polaris.polar.rpc-evm-timeout" + RPCTxFeeCap = "polaris.polar.rpc-tx-fee-cap" + RPCGasCap = "polaris.polar.rpc-gas-cap" + + // Miner. + MinerEtherbase = "polaris.polar.miner.etherbase" + MinerExtraData = "polaris.polar.miner.extra-data" + MinerGasFloor = "polaris.polar.miner.gas-floor" + MinerGasCeil = "polaris.polar.miner.gas-ceil" + MinerGasPrice = "polaris.polar.miner.gas-price" + MinerRecommit = "polaris.polar.miner.recommit" + MinerNewPayloadTimeout = "polaris.polar.miner.new-payload-timeout" + + // GPO. + Blocks = "polaris.polar.gpo.blocks" + MaxBlockHistory = "polaris.polar.gpo.max-block-history" + Percentile = "polaris.polar.gpo.percentile" + MaxHeaderHistory = "polaris.polar.gpo.max-header-history" + + // Node. + JwtSecret = "polaris.node.jwt-secret" //#nosec: G101 // not a secret. + WsPort = "polaris.node.ws-port" + BatchRequestLimit = "polaris.node.batch-request-limit" + KeyStoreDir = "polaris.node.key-store-dir" + DBEngine = "polaris.node.db-engine" + ReadTimeout = "polaris.node.http-timeouts.read-timeout" + DataDir = "polaris.node.data-dir" + UserIdent = "polaris.node.user-ident" + GraphqlCors = "polaris.node.graphql-cors" + SmartCardDaemonPath = "polaris.node.smart-card-daemon-path" + WsModules = "polaris.node.ws-modules" + HTTPCors = "polaris.node.http-cors" + IdleTimeout = "polaris.node.http-timeouts.idle-timeout" + AuthAddr = "polaris.node.auth-addr" + AllowUnprotectedTxs = "polaris.node.allow-unprotected-txs" + HTTPHost = "polaris.node.http-host" + UseLightweightKdf = "polaris.node.use-lightweight-kdf" + WsExposeAll = "polaris.node.ws-expose-all" + InsecureUnlockAllowed = "polaris.node.insecure-unlock-allowed" + WsPathPrefix = "polaris.node.ws-path-prefix" + WsHost = "polaris.node.ws-host" + Name = "polaris.node.name" + AuthVirtualHosts = "polaris.node.auth-virtual-hosts" + AuthPort = "polaris.node.auth-port" + Usb = "polaris.node.usb" + HTTPPort = "polaris.node.http-port" + BatchResponseMaxSize = "polaris.node.batch-response-max-size" + Version = "polaris.node.version" + HTTPVirtualHosts = "polaris.node.http-virtual-hosts" + ExternalSigner = "polaris.node.external-signer" + HTTPPathPrefix = "polaris.node.http-path-prefix" + WriteTimeout = "polaris.node.http-timeouts.write-timeout" + ReadHeaderTimeout = "polaris.node.http-timeouts.read-header-timeout" + HTTPModules = "polaris.node.http-modules" + WsOrigins = "polaris.node.ws-origins" + Default = "polaris.node.http-timeouts.default" + MaxPrice = "polaris.node.http-timeouts.max-price" + IgnorePrice = "polaris.node.http-timeouts.ignore-price" + GraphqlVirtualHosts = "polaris.node.graphql-virtual-hosts" + IpcPath = "polaris.node.ipc-path" + + // Legacy TxPool. + Locals = "polaris.polar.legacy-tx-pool.locals" + NoLocals = "polaris.polar.legacy-tx-pool.no-locals" + Journal = "polaris.polar.legacy-tx-pool.journal" + ReJournal = "polaris.polar.legacy-tx-pool.rejournal" + PriceLimit = "polaris.polar.legacy-tx-pool.price-limit" + PriceBump = "polaris.polar.legacy-tx-pool.price-bump" + AccountSlots = "polaris.polar.legacy-tx-pool.account-slots" + GlobalSlots = "polaris.polar.legacy-tx-pool.global-slots" + AccountQueue = "polaris.polar.legacy-tx-pool.account-queue" + GlobalQueue = "polaris.polar.legacy-tx-pool.global-queue" + Lifetime = "polaris.polar.legacy-tx-pool.lifetime" + + // Chain Config. + ChainID = "polaris.polar.chain.chain-id" + HomesteadBlock = "polaris.polar.chain.homestead-block" + DAOForkBlock = "polaris.polar.chain.dao-fork-block" + DAOForkSupport = "polaris.polar.chain.dao-fork-support" + EIP150Block = "polaris.polar.chain.eip150-block" + EIP155Block = "polaris.polar.chain.eip155-block" + EIP158Block = "polaris.polar.chain.eip158-block" + ByzantiumBlock = "polaris.polar.chain.byzantium-block" + ConstantinopleBlock = "polaris.polar.chain.constantinople-block" + PetersburgBlock = "polaris.polar.chain.petersburg-block" + IstanbulBlock = "polaris.polar.chain.istanbul-block" + MuirGlacierBlock = "polaris.polar.chain.muir-glacier-block" + BerlinBlock = "polaris.polar.chain.berlin-block" + LondonBlock = "polaris.polar.chain.london-block" + ArrowGlacierBlock = "polaris.polar.chain.arrow-glacier-block" + GrayGlacierBlock = "polaris.polar.chain.gray-glacier-block" + MergeNetsplitBlock = "polaris.polar.chain.merge-netsplit-block" + ShanghaiTime = "polaris.polar.chain.shanghai-time" + CancunTime = "polaris.polar.chain.cancun-time" + PragueTime = "polaris.polar.chain.prague-time" + VerkleTime = "polaris.polar.chain.verkle-time" + TerminalTotalDifficulty = "polaris.polar.chain.terminal-total-difficulty" + TerminalTotalDifficultyPassed = "polaris.polar.chain.terminal-total-difficulty-passed" + IsDevMode = "polaris.polar.chain.is-dev-mode" +) diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 9aa4ea2833..262fbd10df 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -44,7 +44,6 @@ import ( cbindings "pkg.berachain.dev/polaris/contracts/bindings/cosmos/lib" generated "pkg.berachain.dev/polaris/contracts/bindings/cosmos/precompile/governance" testutils "pkg.berachain.dev/polaris/cosmos/testutil" - "pkg.berachain.dev/polaris/cosmos/types" "pkg.berachain.dev/polaris/eth/common" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/vm" @@ -76,7 +75,6 @@ var _ = Describe("Governance Precompile", func() { BeforeEach(func() { t := ginkgoTestReporter{} mockCtrl = gomock.NewController(t) - types.SetupCosmosConfig() caller = testutils.Alice.Bytes() sdkCtx, ak, bk, gk = setupGovTest(mockCtrl, caller) sdk.RegisterInterfaces(ir) @@ -87,7 +85,6 @@ var _ = Describe("Governance Precompile", func() { governancekeeper.NewQueryServer(gk), ir, )) - types.SetupCosmosConfig() sf = ethprecompile.NewStatefulFactory() ctx = vm.NewPolarContext( sdkCtx, diff --git a/cosmos/testutil/bank.go b/cosmos/testutil/bank.go index 2bcf453318..44d4322907 100644 --- a/cosmos/testutil/bank.go +++ b/cosmos/testutil/bank.go @@ -31,6 +31,15 @@ import ( "pkg.berachain.dev/polaris/eth/common" ) +type BankKeeper interface { + SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, + recipientAddr sdk.AccAddress, amt sdk.Coins) error + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, + recipientModule string, amt sdk.Coins) error + MintCoins(ctx context.Context, moduleName string, amt sdk.Coins) error + BurnCoins(ctx context.Context, moduleName string, amt sdk.Coins) error +} + // MintCoinsToAddress mints coins to a given address. func MintCoinsToAddress( ctx context.Context, diff --git a/cosmos/testutil/interfaces.go b/cosmos/testutil/interfaces.go deleted file mode 100644 index b1b944e56e..0000000000 --- a/cosmos/testutil/interfaces.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package testutil - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -type BankKeeper interface { - SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, - recipientAddr sdk.AccAddress, amt sdk.Coins) error - SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, - recipientModule string, amt sdk.Coins) error - MintCoins(ctx context.Context, moduleName string, amt sdk.Coins) error - BurnCoins(ctx context.Context, moduleName string, amt sdk.Coins) error -} diff --git a/cosmos/testutil/setup.go b/cosmos/testutil/setup.go index 32a6a70006..45e6086e79 100644 --- a/cosmos/testutil/setup.go +++ b/cosmos/testutil/setup.go @@ -54,7 +54,6 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "pkg.berachain.dev/polaris/cosmos/types" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" ) @@ -134,7 +133,6 @@ func SetupMinimalKeepers(logger log.Logger, keys ...storetypes.StoreKey) ( bankkeeper.BaseKeeper, stakingkeeper.Keeper, ) { - types.SetupCosmosConfig() ctx := NewContext(logger, keys...).WithBlockHeight(1) encodingConfig := testutil.MakeTestEncodingConfig( diff --git a/cosmos/types/config.go b/cosmos/types/config.go deleted file mode 100644 index e478bd7628..0000000000 --- a/cosmos/types/config.go +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package types - -import ( - "sync" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/eth/accounts" -) - -var initConfig sync.Once - -// SetupCosmosConfig sets up the Cosmos SDK configuration to be compatible with the -// semantics of etheruem. -func SetupCosmosConfig() { - initConfig.Do(func() { - // set the address prefixes - config := sdk.GetConfig() - SetBip44CoinType(config) - config.Seal() - }) -} - -// SetBip44CoinType sets the global coin type to be used in hierarchical deterministic wallets. -func SetBip44CoinType(config *sdk.Config) { - config.SetCoinType(accounts.Bip44CoinType) - config.SetPurpose(sdk.Purpose) -} diff --git a/e2e/testapp/polard/cmd/root_test.go b/e2e/testapp/polard/cmd/root_test.go index aa1dcd01c0..d24e1ac297 100644 --- a/e2e/testapp/polard/cmd/root_test.go +++ b/e2e/testapp/polard/cmd/root_test.go @@ -29,7 +29,6 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "pkg.berachain.dev/polaris/cosmos/types" testapp "pkg.berachain.dev/polaris/e2e/testapp" "pkg.berachain.dev/polaris/e2e/testapp/polard/cmd" @@ -42,10 +41,6 @@ func TestCmd(t *testing.T) { RunSpecs(t, "e2e/testapp/polard/cmd") } -var _ = BeforeSuite(func() { - types.SetupCosmosConfig() -}) - var _ = Describe("Init command", func() { It("should initialize the app with given options", func() { stdout := os.Stdout diff --git a/e2e/testapp/polard/main.go b/e2e/testapp/polard/main.go index 3f7eacc2d2..02bc9f9dbc 100644 --- a/e2e/testapp/polard/main.go +++ b/e2e/testapp/polard/main.go @@ -27,13 +27,13 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - "pkg.berachain.dev/polaris/cosmos/types" + "pkg.berachain.dev/polaris/cosmos/config" testapp "pkg.berachain.dev/polaris/e2e/testapp" "pkg.berachain.dev/polaris/e2e/testapp/polard/cmd" ) func main() { - types.SetupCosmosConfig() + config.SetupCosmosConfig() rootCmd := cmd.NewRootCmd() if err := svrcmd.Execute(rootCmd, "", testapp.DefaultNodeHome); err != nil { log.NewLogger(rootCmd.OutOrStderr()).Error("failure when running app", "err", err) diff --git a/go.work.sum b/go.work.sum index f381a18609..64707d71c6 100644 --- a/go.work.sum +++ b/go.work.sum @@ -436,8 +436,6 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= From 417527617f809dfb2fbc3003bb0f263de42c708c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 9 Oct 2023 01:36:56 -0400 Subject: [PATCH 079/122] chore(testing): additional cleanup --- cosmos/x/evm/evm_test.go | 33 -------------------------------- cosmos/x/evm/genesis_test.go | 6 ++++++ cosmos/x/evm/interfaces.go | 12 ------------ cosmos/x/evm/types/constants.go | 26 ------------------------- cosmos/x/evm/types/keys.go | 5 +++++ cosmos/x/evm/types/types_test.go | 33 -------------------------------- 6 files changed, 11 insertions(+), 104 deletions(-) delete mode 100644 cosmos/x/evm/evm_test.go delete mode 100644 cosmos/x/evm/types/constants.go delete mode 100644 cosmos/x/evm/types/types_test.go diff --git a/cosmos/x/evm/evm_test.go b/cosmos/x/evm/evm_test.go deleted file mode 100644 index 6609aa60ea..0000000000 --- a/cosmos/x/evm/evm_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package evm_test - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestTypes(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm") -} diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 003b1cdd7c..e026d28adf 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -25,6 +25,7 @@ import ( "encoding/json" "fmt" "math/big" + "testing" "cosmossdk.io/log" @@ -50,6 +51,11 @@ var ( ethGen = core.DefaultGenesis ) +func TestGenesis(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/x/evm") +} + var _ = Describe("", func() { var ( cdc codec.JSONCodec diff --git a/cosmos/x/evm/interfaces.go b/cosmos/x/evm/interfaces.go index cea88cc24b..8b47b0676f 100644 --- a/cosmos/x/evm/interfaces.go +++ b/cosmos/x/evm/interfaces.go @@ -42,18 +42,6 @@ type AccountKeeper interface { IterateAccounts(ctx context.Context, cb func(account sdk.AccountI) bool) } -// BankKeeper defines the expected bank keeper. -type BankKeeper interface { - GetBalance(ctx context.Context, addr sdk.AccAddress, denom string) sdk.Coin - SendCoinsFromModuleToAccount(ctx context.Context, - senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error - SendCoinsFromAccountToModule(ctx context.Context, - senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - MintCoins(ctx context.Context, moduleName string, amt sdk.Coins) error - BurnCoins(ctx context.Context, moduleName string, amt sdk.Coins) error - SendCoins(ctx context.Context, from sdk.AccAddress, to sdk.AccAddress, amt sdk.Coins) error -} - type StakingKeeper interface { GetValidatorByConsAddr(context.Context, sdk.ConsAddress) (stakingtypes.Validator, error) ValidatorAddressCodec() addresscodec.Codec diff --git a/cosmos/x/evm/types/constants.go b/cosmos/x/evm/types/constants.go deleted file mode 100644 index 9eb9c2cde2..0000000000 --- a/cosmos/x/evm/types/constants.go +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package types - -const ( - StoreKey = "evm" - ModuleName = "evm" -) diff --git a/cosmos/x/evm/types/keys.go b/cosmos/x/evm/types/keys.go index 9c593119dc..5f064797f2 100644 --- a/cosmos/x/evm/types/keys.go +++ b/cosmos/x/evm/types/keys.go @@ -20,6 +20,11 @@ package types +const ( + StoreKey = "evm" + ModuleName = "evm" +) + const ( CodeKeyPrefix byte = iota BalanceKeyPrefix diff --git a/cosmos/x/evm/types/types_test.go b/cosmos/x/evm/types/types_test.go deleted file mode 100644 index f8006dea4e..0000000000 --- a/cosmos/x/evm/types/types_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package types_test - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestTypes(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/types") -} From 96e1b889c1fefa7bcb2eb07e9f541646d7b13221 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 9 Oct 2023 17:22:36 -0400 Subject: [PATCH 080/122] chore(repo): cleanup --- cosmos/config/parser.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cosmos/config/parser.go b/cosmos/config/parser.go index 274f46d973..2dbea539ef 100644 --- a/cosmos/config/parser.go +++ b/cosmos/config/parser.go @@ -58,7 +58,7 @@ func (c *AppOptionsParser) GetCommonAddress(key string) (common.Address, error) return common.Address{}, err } if !common.IsHexAddress(addressStr) { - return common.Address{}, fmt.Errorf("invalid address: %s", addressStr) + return common.Address{}, fmt.Errorf("invalid address: %s flag %s", addressStr, key) } return common.HexToAddress(addressStr), nil } @@ -70,7 +70,7 @@ func (c *AppOptionsParser) GetCommonAddressList(key string) ([]common.Address, e for _, addressStr := range addressStrs { address := common.HexToAddress(addressStr) if !common.IsHexAddress(addressStr) { - return nil, fmt.Errorf("invalid address: %s", addressStr) + return nil, fmt.Errorf("invalid address in list: %s flag %s", addressStr, key) } addresses = append(addresses, address) } From 63876cd5682f03e6ae176aa9ffd4150fea462e1b Mon Sep 17 00:00:00 2001 From: Cal Bera Date: Tue, 10 Oct 2023 11:49:55 -0400 Subject: [PATCH 081/122] chore(gov): Convert `uint8[]` to `bytes` for Message value bz (#1211) ### Summary by CodeRabbit - Refactor: Updated the `CosmosCodecAny` and `CosmosCoin` structs, replacing `[]uint8` with `[]byte` for the `Value` field to align with functional usage in Cosmos SDK. - Refactor: Updated the ABI definition for the `GovernanceModule` contract, replacing `uint8[]` with `bytes` in the `getProposal` and `getProposals` functions. - Refactor: Updated the `decodeProposalMessages` function to handle different types using reflection. - Chore: Updated the code generation tool version from v2.35.2 to v2.35.3 across multiple files. - Chore: Added build constraints for the `rlpgen` tool in `transaction.rlpgen.go`. --- .../cosmos/lib/cosmos_types.abigen.go | 18 +++++------ .../governance/i_governance_module.abigen.go | 28 ++++++++--------- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 30 +++++++++---------- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- contracts/src/cosmos/CosmosTypes.sol | 3 +- cosmos/config/mocks/app_options.go | 2 +- cosmos/lib/conversions.go | 20 ++++++------- cosmos/txpool/mocks/geth_tx_pool.go | 2 +- cosmos/txpool/mocks/lifecycle.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_broadcaster.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/polar_state_db.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- eth/core/types/transaction.rlpgen.go | 3 ++ 28 files changed, 74 insertions(+), 72 deletions(-) diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index 14f70f9e4e..a6277b2955 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -32,7 +32,7 @@ var ( // CosmosCodecAny is an auto generated low-level Go binding around an user-defined struct. type CosmosCodecAny struct { TypeURL string - Value []uint8 + Value []byte } // CosmosCoin is an auto generated low-level Go binding around an user-defined struct. @@ -58,8 +58,8 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063050cea7c1461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220b24960b7384ca1abf8290dc87cefbb7f835f93af11afbf266c837880cf6cd57064736f6c63430008150033", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220b8747d134404de4f68ec89426a62d8617708e74ff07ea4e11939db7028c8355664736f6c63430008150033", } // CosmosTypesABI is the input ABI used to generate the binding from. @@ -229,9 +229,9 @@ func (_CosmosTypes *CosmosTypesTransactorRaw) Transact(opts *bind.TransactOpts, return _CosmosTypes.Contract.contract.Transact(opts, method, params...) } -// CodecAny is a free data retrieval call binding the contract method 0x050cea7c. +// CodecAny is a free data retrieval call binding the contract method 0x1713cb13. // -// Solidity: function codecAny((string,uint8[]) ) pure returns() +// Solidity: function codecAny((string,bytes) ) pure returns() func (_CosmosTypes *CosmosTypesCaller) CodecAny(opts *bind.CallOpts, arg0 CosmosCodecAny) error { var out []interface{} err := _CosmosTypes.contract.Call(opts, &out, "codecAny", arg0) @@ -244,16 +244,16 @@ func (_CosmosTypes *CosmosTypesCaller) CodecAny(opts *bind.CallOpts, arg0 Cosmos } -// CodecAny is a free data retrieval call binding the contract method 0x050cea7c. +// CodecAny is a free data retrieval call binding the contract method 0x1713cb13. // -// Solidity: function codecAny((string,uint8[]) ) pure returns() +// Solidity: function codecAny((string,bytes) ) pure returns() func (_CosmosTypes *CosmosTypesSession) CodecAny(arg0 CosmosCodecAny) error { return _CosmosTypes.Contract.CodecAny(&_CosmosTypes.CallOpts, arg0) } -// CodecAny is a free data retrieval call binding the contract method 0x050cea7c. +// CodecAny is a free data retrieval call binding the contract method 0x1713cb13. // -// Solidity: function codecAny((string,uint8[]) ) pure returns() +// Solidity: function codecAny((string,bytes) ) pure returns() func (_CosmosTypes *CosmosTypesCallerSession) CodecAny(arg0 CosmosCodecAny) error { return _CosmosTypes.Contract.CodecAny(&_CosmosTypes.CallOpts, arg0) } diff --git a/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go b/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go index 15b595ed6f..4301ea5390 100644 --- a/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go +++ b/contracts/bindings/cosmos/precompile/governance/i_governance_module.abigen.go @@ -32,7 +32,7 @@ var ( // CosmosCodecAny is an auto generated low-level Go binding around an user-defined struct. type CosmosCodecAny struct { TypeURL string - Value []uint8 + Value []byte } // CosmosCoin is an auto generated low-level Go binding around an user-defined struct. @@ -145,7 +145,7 @@ type IGovernanceModuleWeightedVoteOption struct { // GovernanceModuleMetaData contains all meta data concerning the GovernanceModule contract. var GovernanceModuleMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CancelProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"ProposalDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposalSender\",\"type\":\"address\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"proposalVote\",\"type\":\"tuple\"}],\"name\":\"ProposalVoted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConstitution\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.DepositParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"minInitialDepositRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelDest\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"expeditedVotingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"expeditedThreshold\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"expeditedMinDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"burnVoteQuorum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnProposalDepositPrevote\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnVoteVeto\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.Params\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"getProposalDepositsByDepositor\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalTallyResult\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposalVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"getProposalVotesByVoter\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTallyParams\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.VotingParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"submitProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"voteWeighted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"CancelProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structCosmos.Coin[]\",\"name\":\"amount\",\"type\":\"tuple[]\"}],\"name\":\"ProposalDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposalSender\",\"type\":\"address\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"indexed\":false,\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"proposalVote\",\"type\":\"tuple\"}],\"name\":\"ProposalVoted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConstitution\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.DepositParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParams\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"minDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxDepositPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"minInitialDepositRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelRatio\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"proposalCancelDest\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"expeditedVotingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"expeditedThreshold\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"expeditedMinDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"burnVoteQuorum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnProposalDepositPrevote\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"burnVoteVeto\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.Params\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"}],\"name\":\"getProposalDepositsByDepositor\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposalTallyResult\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposalVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"getProposalVotesByVoter\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.Vote\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"pagination\",\"type\":\"tuple\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTallyParams\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"quorum\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"threshold\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"vetoThreshold\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"votingPeriod\",\"type\":\"uint64\"}],\"internalType\":\"structIGovernanceModule.VotingParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"submitProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"int32\",\"name\":\"voteOption\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"weight\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.WeightedVoteOption[]\",\"name\":\"options\",\"type\":\"tuple[]\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"voteWeighted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // GovernanceModuleABI is the input ABI used to generate the binding from. @@ -389,7 +389,7 @@ func (_GovernanceModule *GovernanceModuleCallerSession) GetParams() (IGovernance // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceModule *GovernanceModuleCaller) GetProposal(opts *bind.CallOpts, proposalId uint64) (IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceModule.contract.Call(opts, &out, "getProposal", proposalId) @@ -406,14 +406,14 @@ func (_GovernanceModule *GovernanceModuleCaller) GetProposal(opts *bind.CallOpts // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceModule *GovernanceModuleSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceModule.Contract.GetProposal(&_GovernanceModule.CallOpts, proposalId) } // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceModule *GovernanceModuleCallerSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceModule.Contract.GetProposal(&_GovernanceModule.CallOpts, proposalId) } @@ -576,7 +576,7 @@ func (_GovernanceModule *GovernanceModuleCallerSession) GetProposalVotesByVoter( // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleCaller) GetProposals(opts *bind.CallOpts, proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { var out []interface{} err := _GovernanceModule.contract.Call(opts, &out, "getProposals", proposalStatus, pagination) @@ -594,14 +594,14 @@ func (_GovernanceModule *GovernanceModuleCaller) GetProposals(opts *bind.CallOpt // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleSession) GetProposals(proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { return _GovernanceModule.Contract.GetProposals(&_GovernanceModule.CallOpts, proposalStatus, pagination) } // GetProposals is a free data retrieval call binding the contract method 0x917c9d92. // -// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) +// Solidity: function getProposals(int32 proposalStatus, (string,uint64,uint64,bool,bool) pagination) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[], (string,uint64)) func (_GovernanceModule *GovernanceModuleCallerSession) GetProposals(proposalStatus int32, pagination CosmosPageRequest) ([]IGovernanceModuleProposal, CosmosPageResponse, error) { return _GovernanceModule.Contract.GetProposals(&_GovernanceModule.CallOpts, proposalStatus, pagination) } @@ -689,23 +689,23 @@ func (_GovernanceModule *GovernanceModuleTransactorSession) CancelProposal(propo return _GovernanceModule.Contract.CancelProposal(&_GovernanceModule.TransactOpts, proposalId) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xe4112572. +// SubmitProposal is a paid mutator transaction binding the contract method 0x8ed6982d. // -// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) +// Solidity: function submitProposal(((string,bytes)[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) func (_GovernanceModule *GovernanceModuleTransactor) SubmitProposal(opts *bind.TransactOpts, proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { return _GovernanceModule.contract.Transact(opts, "submitProposal", proposal) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xe4112572. +// SubmitProposal is a paid mutator transaction binding the contract method 0x8ed6982d. // -// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) +// Solidity: function submitProposal(((string,bytes)[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) func (_GovernanceModule *GovernanceModuleSession) SubmitProposal(proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposal) } -// SubmitProposal is a paid mutator transaction binding the contract method 0xe4112572. +// SubmitProposal is a paid mutator transaction binding the contract method 0x8ed6982d. // -// Solidity: function submitProposal(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) +// Solidity: function submitProposal(((string,bytes)[],(uint256,string)[],address,string,string,string,bool) proposal) returns(uint64) func (_GovernanceModule *GovernanceModuleTransactorSession) SubmitProposal(proposal IGovernanceModuleMsgSubmitProposal) (*types.Transaction, error) { return _GovernanceModule.Contract.SubmitProposal(&_GovernanceModule.TransactOpts, proposal) } diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index 7f38d198c2..3ed97e890f 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220d55ff6e47540c6013ff6f852d1f50dafdad161b2c9b5cc3e82260979ddd5d45864736f6c63430008150033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index 109a788534..2c1f8a9225 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220ab851443f7dbbdb8ff6ac1cdc960be254e43dfab414b10faa6d010e5aa77683f64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220eb7f57407b06306a368cfd6b44ffe4a4c87116d2894dad0b67f2516e7d8ff05564736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index 741f06ddbe..fd4f26d9ec 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -32,7 +32,7 @@ var ( // CosmosCodecAny is an auto generated low-level Go binding around an user-defined struct. type CosmosCodecAny struct { TypeURL string - Value []uint8 + Value []byte } // CosmosCoin is an auto generated low-level Go binding around an user-defined struct. @@ -79,8 +79,8 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"uint8[]\",\"name\":\"value\",\"type\":\"uint8[]\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b50604051620027773803806200277783398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b6080516125a0620001d75f395f61036101526125a05ff3fe608060405260043610610073575f3560e01c806376cdb03b1161004d57806376cdb03b146101215780637752e8e41461014b578063b5828df21461017b578063f1610a28146101b75761007a565b806319f7a0fb1461007e5780632b0a7032146100ba57806337a9a59e146100e45761007a565b3661007a57005b5f80fd5b348015610089575f80fd5b506100a4600480360381019061009f919061095c565b6101f3565b6040516100b191906109e2565b60405180910390f35b3480156100c5575f80fd5b506100ce61029a565b6040516100db9190610a75565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190610a8e565b6102bd565b604051610118929190610ac8565b60405180910390f35b34801561012c575f80fd5b5061013561035f565b6040516101429190610b0f565b60405180910390f35b61016560048036038101906101609190610bda565b610383565b6040516101729190610c67565b60405180910390f35b348015610186575f80fd5b506101a1600480360381019061019c9190610c80565b610508565b6040516101ae919061128f565b60405180910390f35b3480156101c2575f80fd5b506101dd60048036038101906101d89190610a8e565b6105bd565b6040516101ea91906113e8565b60405180910390f35b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016102519392919061145f565b6020604051808303815f875af115801561026d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029191906114c5565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b81526004016103179190610c67565b60408051808303815f875af1158015610332573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103569190611504565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80600167ffffffffffffffff8111156103a05761039f610838565b5b6040519080825280602002602001820160405280156103d957816020015b6103c6610666565b8152602001906001900390816103be5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f8151811061043357610432611542565b5b60200260200101516020018190525082815f8151811061045657610455611542565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4112572876040518263ffffffff1660e01b81526004016104bd9190611b88565b6020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190611ba8565b915050949350505050565b606061051261067f565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056e929190611c46565b5f60405180830381865afa158015610588573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105b091906124ad565b5090508092505050919050565b6105c56106c2565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061d9190610c67565b5f60405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065f9190612523565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f6610774565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b6107c9816107ad565b81146107d3575f80fd5b50565b5f813590506107e4816107c0565b92915050565b5f8160030b9050919050565b6107ff816107ea565b8114610809575f80fd5b50565b5f8135905061081a816107f6565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61086e82610828565b810181811067ffffffffffffffff8211171561088d5761088c610838565b5b80604052505050565b5f61089f61079c565b90506108ab8282610865565b919050565b5f67ffffffffffffffff8211156108ca576108c9610838565b5b6108d382610828565b9050602081019050919050565b828183375f83830152505050565b5f6109006108fb846108b0565b610896565b90508281526020810184848401111561091c5761091b610824565b5b6109278482856108e0565b509392505050565b5f82601f83011261094357610942610820565b5b81356109538482602086016108ee565b91505092915050565b5f805f60608486031215610973576109726107a5565b5b5f610980868287016107d6565b93505060206109918682870161080c565b925050604084013567ffffffffffffffff8111156109b2576109b16107a9565b5b6109be8682870161092f565b9150509250925092565b5f8115159050919050565b6109dc816109c8565b82525050565b5f6020820190506109f55f8301846109d3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610a3d610a38610a33846109fb565b610a1a565b6109fb565b9050919050565b5f610a4e82610a23565b9050919050565b5f610a5f82610a44565b9050919050565b610a6f81610a55565b82525050565b5f602082019050610a885f830184610a66565b92915050565b5f60208284031215610aa357610aa26107a5565b5b5f610ab0848285016107d6565b91505092915050565b610ac2816107ad565b82525050565b5f604082019050610adb5f830185610ab9565b610ae86020830184610ab9565b9392505050565b5f610af982610a44565b9050919050565b610b0981610aef565b82525050565b5f602082019050610b225f830184610b00565b92915050565b5f80fd5b5f60e08284031215610b4157610b40610b28565b5b81905092915050565b5f80fd5b5f80fd5b5f8083601f840112610b6757610b66610820565b5b8235905067ffffffffffffffff811115610b8457610b83610b4a565b5b602083019150836001820283011115610ba057610b9f610b4e565b5b9250929050565b5f819050919050565b610bb981610ba7565b8114610bc3575f80fd5b50565b5f81359050610bd481610bb0565b92915050565b5f805f8060608587031215610bf257610bf16107a5565b5b5f85013567ffffffffffffffff811115610c0f57610c0e6107a9565b5b610c1b87828801610b2c565b945050602085013567ffffffffffffffff811115610c3c57610c3b6107a9565b5b610c4887828801610b52565b93509350506040610c5b87828801610bc6565b91505092959194509250565b5f602082019050610c7a5f830184610ab9565b92915050565b5f60208284031215610c9557610c946107a5565b5b5f610ca28482850161080c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdd816107ad565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d43578082015181840152602081019050610d28565b5f8484015250505050565b5f610d5882610d0c565b610d628185610d16565b9350610d72818560208601610d26565b610d7b81610828565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60ff82169050919050565b610dc481610daf565b82525050565b5f610dd58383610dbb565b60208301905092915050565b5f602082019050919050565b5f610df782610d86565b610e018185610d90565b9350610e0c83610da0565b805f5b83811015610e3c578151610e238882610dca565b9750610e2e83610de1565b925050600181019050610e0f565b5085935050505092915050565b5f604083015f8301518482035f860152610e638282610d4e565b91505060208301518482036020860152610e7d8282610ded565b9150508091505092915050565b5f610e958383610e49565b905092915050565b5f602082019050919050565b5f610eb382610ce3565b610ebd8185610ced565b935083602082028501610ecf85610cfd565b805f5b85811015610f0a5784840389528151610eeb8582610e8a565b9450610ef683610e9d565b925060208a01995050600181019050610ed2565b50829750879550505050505092915050565b610f25816107ea565b82525050565b5f608083015f8301518482035f860152610f458282610d4e565b91505060208301518482036020860152610f5f8282610d4e565b91505060408301518482036040860152610f798282610d4e565b91505060608301518482036060860152610f938282610d4e565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610fd281610ba7565b82525050565b5f604083015f830151610fed5f860182610fc9565b50602083015184820360208601526110058282610d4e565b9150508091505092915050565b5f61101d8383610fd8565b905092915050565b5f602082019050919050565b5f61103b82610fa0565b6110458185610faa565b93508360208202850161105785610fba565b805f5b8581101561109257848403895281516110738582611012565b945061107e83611025565b925060208a0199505060018101905061105a565b50829750879550505050505092915050565b5f6110ae826109fb565b9050919050565b6110be816110a4565b82525050565b5f6101a083015f8301516110da5f860182610cd4565b50602083015184820360208601526110f28282610ea9565b91505060408301516111076040860182610f1c565b506060830151848203606086015261111f8282610f2b565b91505060808301516111346080860182610cd4565b5060a083015161114760a0860182610cd4565b5060c083015184820360c086015261115f8282611031565b91505060e083015161117460e0860182610cd4565b50610100830151611189610100860182610cd4565b506101208301518482036101208601526111a38282610d4e565b9150506101408301518482036101408601526111bf8282610d4e565b9150506101608301518482036101608601526111db8282610d4e565b9150506101808301516111f26101808601826110b5565b508091505092915050565b5f61120883836110c4565b905092915050565b5f602082019050919050565b5f61122682610cab565b6112308185610cb5565b93508360208202850161124285610cc5565b805f5b8581101561127d578484038952815161125e85826111fd565b945061126983611210565b925060208a01995050600181019050611245565b50829750879550505050505092915050565b5f6020820190508181035f8301526112a7818461121c565b905092915050565b5f6101a083015f8301516112c55f860182610cd4565b50602083015184820360208601526112dd8282610ea9565b91505060408301516112f26040860182610f1c565b506060830151848203606086015261130a8282610f2b565b915050608083015161131f6080860182610cd4565b5060a083015161133260a0860182610cd4565b5060c083015184820360c086015261134a8282611031565b91505060e083015161135f60e0860182610cd4565b50610100830151611374610100860182610cd4565b5061012083015184820361012086015261138e8282610d4e565b9150506101408301518482036101408601526113aa8282610d4e565b9150506101608301518482036101608601526113c68282610d4e565b9150506101808301516113dd6101808601826110b5565b508091505092915050565b5f6020820190508181035f83015261140081846112af565b905092915050565b611411816107ea565b82525050565b5f82825260208201905092915050565b5f61143182610d0c565b61143b8185611417565b935061144b818560208601610d26565b61145481610828565b840191505092915050565b5f6060820190506114725f830186610ab9565b61147f6020830185611408565b81810360408301526114918184611427565b9050949350505050565b6114a4816109c8565b81146114ae575f80fd5b50565b5f815190506114bf8161149b565b92915050565b5f602082840312156114da576114d96107a5565b5b5f6114e7848285016114b1565b91505092915050565b5f815190506114fe816107c0565b92915050565b5f806040838503121561151a576115196107a5565b5b5f611527858286016114f0565b9250506020611538858286016114f0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261159757611596611577565b5b83810192508235915060208301925067ffffffffffffffff8211156115bf576115be61156f565b5b6020820236038313156115d5576115d4611573565b5b509250929050565b5f819050919050565b5f808335600160200384360303811261160257611601611577565b5b83810192508235915060208301925067ffffffffffffffff82111561162a5761162961156f565b5b6001820236038313156116405761163f611573565b5b509250929050565b5f6116538385610d16565b93506116608385846108e0565b61166983610828565b840190509392505050565b5f80833560016020038436030381126116905761168f611577565b5b83810192508235915060208301925067ffffffffffffffff8211156116b8576116b761156f565b5b6020820236038313156116ce576116cd611573565b5b509250929050565b5f819050919050565b6116e881610daf565b81146116f2575f80fd5b50565b5f81359050611703816116df565b92915050565b5f61171760208401846116f5565b905092915050565b5f602082019050919050565b5f6117368385610d90565b9350611741826116d6565b805f5b85811015611779576117568284611709565b6117608882610dca565b975061176b8361171f565b925050600181019050611744565b5085925050509392505050565b5f604083016117975f8401846115e6565b8583035f8701526117a9838284611648565b925050506117ba6020840184611674565b85830360208701526117cd83828461172b565b925050508091505092915050565b5f6117e68383611786565b905092915050565b5f8235600160400383360303811261180957611808611577565b5b82810191505092915050565b5f602082019050919050565b5f61182c8385610ced565b93508360208402850161183e846115dd565b805f5b8781101561188157848403895261185882846117ee565b61186285826117db565b945061186d83611815565b925060208a01995050600181019050611841565b50829750879450505050509392505050565b5f80833560016020038436030381126118af576118ae611577565b5b83810192508235915060208301925067ffffffffffffffff8211156118d7576118d661156f565b5b6020820236038313156118ed576118ec611573565b5b509250929050565b5f819050919050565b5f61190c6020840184610bc6565b905092915050565b5f604083016119255f8401846118fe565b6119315f860182610fc9565b5061193f60208401846115e6565b8583036020870152611952838284611648565b925050508091505092915050565b5f61196b8383611914565b905092915050565b5f8235600160400383360303811261198e5761198d611577565b5b82810191505092915050565b5f602082019050919050565b5f6119b18385610faa565b9350836020840285016119c3846118f5565b805f5b87811015611a065784840389526119dd8284611973565b6119e78582611960565b94506119f28361199a565b925060208a019950506001810190506119c6565b50829750879450505050509392505050565b611a21816110a4565b8114611a2b575f80fd5b50565b5f81359050611a3c81611a18565b92915050565b5f611a506020840184611a2e565b905092915050565b5f81359050611a668161149b565b92915050565b5f611a7a6020840184611a58565b905092915050565b611a8b816109c8565b82525050565b5f60e08301611aa25f84018461157b565b8583035f870152611ab4838284611821565b92505050611ac56020840184611893565b8583036020870152611ad88382846119a6565b92505050611ae96040840184611a42565b611af660408601826110b5565b50611b0460608401846115e6565b8583036060870152611b17838284611648565b92505050611b2860808401846115e6565b8583036080870152611b3b838284611648565b92505050611b4c60a08401846115e6565b85830360a0870152611b5f838284611648565b92505050611b7060c0840184611a6c565b611b7d60c0860182611a82565b508091505092915050565b5f6020820190508181035f830152611ba08184611a91565b905092915050565b5f60208284031215611bbd57611bbc6107a5565b5b5f611bca848285016114f0565b91505092915050565b5f60a083015f8301518482035f860152611bed8282610d4e565b9150506020830151611c026020860182610cd4565b506040830151611c156040860182610cd4565b506060830151611c286060860182611a82565b506080830151611c3b6080860182611a82565b508091505092915050565b5f604082019050611c595f830185611408565b8181036020830152611c6b8184611bd3565b90509392505050565b5f67ffffffffffffffff821115611c8e57611c8d610838565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611cc157611cc0610838565b5b602082029050602081019050919050565b5f611ce4611cdf846108b0565b610896565b905082815260208101848484011115611d0057611cff610824565b5b611d0b848285610d26565b509392505050565b5f82601f830112611d2757611d26610820565b5b8151611d37848260208601611cd2565b91505092915050565b5f67ffffffffffffffff821115611d5a57611d59610838565b5b602082029050602081019050919050565b5f81519050611d79816116df565b92915050565b5f611d91611d8c84611d40565b610896565b90508083825260208201905060208402830185811115611db457611db3610b4e565b5b835b81811015611ddd5780611dc98882611d6b565b845260208401935050602081019050611db6565b5050509392505050565b5f82601f830112611dfb57611dfa610820565b5b8151611e0b848260208601611d7f565b91505092915050565b5f60408284031215611e2957611e28611c9f565b5b611e336040610896565b90505f82015167ffffffffffffffff811115611e5257611e51611ca3565b5b611e5e84828501611d13565b5f83015250602082015167ffffffffffffffff811115611e8157611e80611ca3565b5b611e8d84828501611de7565b60208301525092915050565b5f611eab611ea684611ca7565b610896565b90508083825260208201905060208402830185811115611ece57611ecd610b4e565b5b835b81811015611f1557805167ffffffffffffffff811115611ef357611ef2610820565b5b808601611f008982611e14565b85526020850194505050602081019050611ed0565b5050509392505050565b5f82601f830112611f3357611f32610820565b5b8151611f43848260208601611e99565b91505092915050565b5f81519050611f5a816107f6565b92915050565b5f60808284031215611f7557611f74611c9f565b5b611f7f6080610896565b90505f82015167ffffffffffffffff811115611f9e57611f9d611ca3565b5b611faa84828501611d13565b5f83015250602082015167ffffffffffffffff811115611fcd57611fcc611ca3565b5b611fd984828501611d13565b602083015250604082015167ffffffffffffffff811115611ffd57611ffc611ca3565b5b61200984828501611d13565b604083015250606082015167ffffffffffffffff81111561202d5761202c611ca3565b5b61203984828501611d13565b60608301525092915050565b5f67ffffffffffffffff82111561205f5761205e610838565b5b602082029050602081019050919050565b5f8151905061207e81610bb0565b92915050565b5f6040828403121561209957612098611c9f565b5b6120a36040610896565b90505f6120b284828501612070565b5f83015250602082015167ffffffffffffffff8111156120d5576120d4611ca3565b5b6120e184828501611d13565b60208301525092915050565b5f6120ff6120fa84612045565b610896565b9050808382526020820190506020840283018581111561212257612121610b4e565b5b835b8181101561216957805167ffffffffffffffff81111561214757612146610820565b5b8086016121548982612084565b85526020850194505050602081019050612124565b5050509392505050565b5f82601f83011261218757612186610820565b5b81516121978482602086016120ed565b91505092915050565b5f815190506121ae81611a18565b92915050565b5f6101a082840312156121ca576121c9611c9f565b5b6121d56101a0610896565b90505f6121e4848285016114f0565b5f83015250602082015167ffffffffffffffff81111561220757612206611ca3565b5b61221384828501611f1f565b602083015250604061222784828501611f4c565b604083015250606082015167ffffffffffffffff81111561224b5761224a611ca3565b5b61225784828501611f60565b606083015250608061226b848285016114f0565b60808301525060a061227f848285016114f0565b60a08301525060c082015167ffffffffffffffff8111156122a3576122a2611ca3565b5b6122af84828501612173565b60c08301525060e06122c3848285016114f0565b60e0830152506101006122d8848285016114f0565b6101008301525061012082015167ffffffffffffffff8111156122fe576122fd611ca3565b5b61230a84828501611d13565b6101208301525061014082015167ffffffffffffffff8111156123305761232f611ca3565b5b61233c84828501611d13565b6101408301525061016082015167ffffffffffffffff81111561236257612361611ca3565b5b61236e84828501611d13565b61016083015250610180612384848285016121a0565b6101808301525092915050565b5f6123a361239e84611c74565b610896565b905080838252602082019050602084028301858111156123c6576123c5610b4e565b5b835b8181101561240d57805167ffffffffffffffff8111156123eb576123ea610820565b5b8086016123f889826121b4565b855260208501945050506020810190506123c8565b5050509392505050565b5f82601f83011261242b5761242a610820565b5b815161243b848260208601612391565b91505092915050565b5f6040828403121561245957612458611c9f565b5b6124636040610896565b90505f82015167ffffffffffffffff81111561248257612481611ca3565b5b61248e84828501611d13565b5f8301525060206124a1848285016114f0565b60208301525092915050565b5f80604083850312156124c3576124c26107a5565b5b5f83015167ffffffffffffffff8111156124e0576124df6107a9565b5b6124ec85828601612417565b925050602083015167ffffffffffffffff81111561250d5761250c6107a9565b5b61251985828601612444565b9150509250929050565b5f60208284031215612538576125376107a5565b5b5f82015167ffffffffffffffff811115612555576125546107a9565b5b612561848285016121b4565b9150509291505056fea2646970667358221220306d2b017ebeaa83c1fae5293a08fd14264774f7f36721a01dc2fb8dd35515ac64736f6c63430008150033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea26469706673582212206e68cc9e1af8c1457b7c19bae135a8ae3e3ab13687c25f67afeb4537de87481464736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. @@ -283,7 +283,7 @@ func (_GovernanceWrapper *GovernanceWrapperCallerSession) Bank() (common.Address // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposal(opts *bind.CallOpts, proposalId uint64) (IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceWrapper.contract.Call(opts, &out, "getProposal", proposalId) @@ -300,21 +300,21 @@ func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposal(opts *bind.CallOp // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceWrapper *GovernanceWrapperSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposal(&_GovernanceWrapper.CallOpts, proposalId) } // GetProposal is a free data retrieval call binding the contract method 0xf1610a28. // -// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) +// Solidity: function getProposal(uint64 proposalId) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)) func (_GovernanceWrapper *GovernanceWrapperCallerSession) GetProposal(proposalId uint64) (IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposal(&_GovernanceWrapper.CallOpts, proposalId) } // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposals(opts *bind.CallOpts, proposalStatus int32) ([]IGovernanceModuleProposal, error) { var out []interface{} err := _GovernanceWrapper.contract.Call(opts, &out, "getProposals", proposalStatus) @@ -331,14 +331,14 @@ func (_GovernanceWrapper *GovernanceWrapperCaller) GetProposals(opts *bind.CallO // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) func (_GovernanceWrapper *GovernanceWrapperSession) GetProposals(proposalStatus int32) ([]IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposals(&_GovernanceWrapper.CallOpts, proposalStatus) } // GetProposals is a free data retrieval call binding the contract method 0xb5828df2. // -// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,uint8[])[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) +// Solidity: function getProposals(int32 proposalStatus) view returns((uint64,(string,bytes)[],int32,(string,string,string,string),uint64,uint64,(uint256,string)[],uint64,uint64,string,string,string,address)[]) func (_GovernanceWrapper *GovernanceWrapperCallerSession) GetProposals(proposalStatus int32) ([]IGovernanceModuleProposal, error) { return _GovernanceWrapper.Contract.GetProposals(&_GovernanceWrapper.CallOpts, proposalStatus) } @@ -395,23 +395,23 @@ func (_GovernanceWrapper *GovernanceWrapperTransactorSession) CancelProposal(pro return _GovernanceWrapper.Contract.CancelProposal(&_GovernanceWrapper.TransactOpts, proposalId) } -// Submit is a paid mutator transaction binding the contract method 0x7752e8e4. +// Submit is a paid mutator transaction binding the contract method 0x00e66c9a. // -// Solidity: function submit(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +// Solidity: function submit(((string,bytes)[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) func (_GovernanceWrapper *GovernanceWrapperTransactor) Submit(opts *bind.TransactOpts, proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.contract.Transact(opts, "submit", proposal, denom, amount) } -// Submit is a paid mutator transaction binding the contract method 0x7752e8e4. +// Submit is a paid mutator transaction binding the contract method 0x00e66c9a. // -// Solidity: function submit(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +// Solidity: function submit(((string,bytes)[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) func (_GovernanceWrapper *GovernanceWrapperSession) Submit(proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.Contract.Submit(&_GovernanceWrapper.TransactOpts, proposal, denom, amount) } -// Submit is a paid mutator transaction binding the contract method 0x7752e8e4. +// Submit is a paid mutator transaction binding the contract method 0x00e66c9a. // -// Solidity: function submit(((string,uint8[])[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) +// Solidity: function submit(((string,bytes)[],(uint256,string)[],address,string,string,string,bool) proposal, string denom, uint256 amount) payable returns(uint64) func (_GovernanceWrapper *GovernanceWrapperTransactorSession) Submit(proposal IGovernanceModuleMsgSubmitProposal, denom string, amount *big.Int) (*types.Transaction, error) { return _GovernanceWrapper.Contract.Submit(&_GovernanceWrapper.TransactOpts, proposal, denom, amount) } diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 93edbbb45f..30836b560e 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220a95be8fcf27bad0ecf864e34943144209da0a3001ad28554839a5f08d46bea2864736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220c7e84b6db206f5d9266ae734b492fdafba600b28130ce87ee834c4d9603e490864736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index 0ca17e0e43..bbca3ec106 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220375eb2d2c8922549992938778c24612176f4fc0c735c5b703ff757b1e3dde82064736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122026d74557dd2a531de3f06b31fa0092f284f80f0768ed6793e01c3bd2f031323764736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index ee50028de0..10953f09ae 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212202e51cf7fd61df0464d3a27dd6535d12e463c0bf3246e7a15387d926c38d7288764736f6c63430008150033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/src/cosmos/CosmosTypes.sol b/contracts/src/cosmos/CosmosTypes.sol index 81e2dba39d..559bd213f8 100644 --- a/contracts/src/cosmos/CosmosTypes.sol +++ b/contracts/src/cosmos/CosmosTypes.sol @@ -52,11 +52,10 @@ library Cosmos { /** * @dev Represents a Cosmos SDK `codectypes.Any`. - * @notice value is of type uint8[] instead of bytes, functionally used as []byte in Cosmos. */ struct CodecAny { string typeURL; - uint8[] value; + bytes value; } } diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go index 4a23fb8ab4..3dab32675a 100644 --- a/cosmos/config/mocks/app_options.go +++ b/cosmos/config/mocks/app_options.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/lib/conversions.go b/cosmos/lib/conversions.go index 3028eec560..d780a9bc23 100644 --- a/cosmos/lib/conversions.go +++ b/cosmos/lib/conversions.go @@ -338,32 +338,32 @@ func ConvertMsgSubmitProposalToSdk( // decodeProposalMessages is a helper function to convert the unnamed type of Messages into a // usable Messages slice. func decodeProposalMessages(propMsgs any) ([]struct { - TypeURL string `json:"typeURL"` - Value []uint8 `json:"value"` + TypeURL string `json:"typeURL"` + Value []byte `json:"value"` }, error) { var proposalMsgs []struct { - TypeURL string `json:"typeURL"` - Value []uint8 `json:"value"` + TypeURL string `json:"typeURL"` + Value []byte `json:"value"` } switch reflect.TypeOf(propMsgs) { case reflect.TypeOf([]governance.CosmosCodecAny{}): for _, propMsg := range utils.MustGetAs[[]governance.CosmosCodecAny](propMsgs) { proposalMsgs = append(proposalMsgs, struct { - TypeURL string `json:"typeURL"` - Value []uint8 `json:"value"` + TypeURL string `json:"typeURL"` + Value []byte `json:"value"` }{ TypeURL: propMsg.TypeURL, Value: propMsg.Value, }) } case reflect.TypeOf([]struct { - TypeURL string `json:"typeURL"` - Value []uint8 `json:"value"` + TypeURL string `json:"typeURL"` + Value []byte `json:"value"` }{}): proposalMsgs = utils.MustGetAs[[]struct { - TypeURL string `json:"typeURL"` - Value []uint8 `json:"value"` + TypeURL string `json:"typeURL"` + Value []byte `json:"value"` }](propMsgs) default: return nil, precompile.ErrInvalidSubmitProposal diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index 5bd365e04a..d07f24ab9c 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index 406f3c5ffc..d298fc6edd 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index 87d77fbee7..fb4978bad6 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index 134e480af0..40e832bdac 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index f6798fa323..005dac8dd9 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 19d4e5142d..5d23bf5718 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index ec684dd312..84c81460f1 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 257ab722b4..0ecc9f0b1a 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index ae16a6e5e0..005d3584ae 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index a1799e851f..1f4aa681e6 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 5633c28620..038ead2256 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index 4f657c938f..64f0e7bc98 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index 40f35c8cbb..27dde8ee58 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index 0b295c7f7b..efc5426ea5 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/polar_state_db.go b/eth/core/state/mocks/polar_state_db.go index 5fdcf96287..7171448e27 100644 --- a/eth/core/state/mocks/polar_state_db.go +++ b/eth/core/state/mocks/polar_state_db.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index 00a8851f82..71b4b7ea13 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.2. DO NOT EDIT. +// Code generated by mockery v2.35.3. DO NOT EDIT. package mocks diff --git a/eth/core/types/transaction.rlpgen.go b/eth/core/types/transaction.rlpgen.go index 5006261ca3..c335ec137e 100644 --- a/eth/core/types/transaction.rlpgen.go +++ b/eth/core/types/transaction.rlpgen.go @@ -1,5 +1,8 @@ // Code generated by rlpgen. DO NOT EDIT. +//go:build !norlpgen +// +build !norlpgen + package types import "github.com/ethereum/go-ethereum/common" From 14bbbbd8f41fc0e0d022070adcca0c0455f7405c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 10 Oct 2023 12:11:23 -0400 Subject: [PATCH 082/122] feat(miner): 1 Block == 1 Txn (#1166) ### Summary by CodeRabbit - New Feature: Introduced a new RPC method `ProcessPayloadEnvelope` for processing payload envelopes. - Refactor: Updated the `Miner` struct and its methods to use the new `EnvelopeSerializer` and `GethMiner` interfaces. - Refactor: Modified the `ProcessTransaction` function to `ProcessPayloadEnvelope` in the `Keeper` struct, changing its functionality to handle payload envelopes. - Refactor: Updated the `ChainWriter` interface and the `blockchain` struct to handle batch block insertion and state updates. - Refactor: Removed the old miner functionality from the `Polaris` struct. - Chore: Updated the `Distribution Precompile` test to wait for 3 blocks instead of 2. - Chore: Updated various parts of the codebase to handle the wrapping and unwrapping of payload data between different formats. --------- Co-authored-by: Cal Bera Co-authored-by: ocnc <97242826+ocnc@users.noreply.github.com> --- cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go | 933 +++++++++++++++++- cosmos/api/polaris/evm/v1alpha1/tx_grpc.pb.go | 41 +- cosmos/go.mod | 6 +- cosmos/go.sum | 8 +- cosmos/lib/signing/signers.go | 1 - cosmos/miner/miner.go | 63 +- cosmos/miner/miner_test.go | 49 - cosmos/x/evm/keeper/abci.go | 38 - cosmos/x/evm/keeper/genesis.go | 6 +- cosmos/x/evm/keeper/host.go | 11 +- cosmos/x/evm/keeper/msg_server.go | 51 - cosmos/x/evm/keeper/processor.go | 66 +- cosmos/x/evm/keeper/processor_test.go | 239 ----- cosmos/x/evm/module.go | 20 +- cosmos/x/evm/plugins/block/header.go | 4 +- cosmos/x/evm/plugins/gas/gas_test.go | 33 - cosmos/x/evm/plugins/gas/plugin.go | 126 --- cosmos/x/evm/plugins/gas/plugin_test.go | 127 --- cosmos/x/evm/types/codec.go | 1 + cosmos/x/evm/types/tx.go | 23 + cosmos/x/evm/types/tx.pb.go | 384 ++++++- e2e/localnet/go.mod | 2 +- e2e/localnet/go.sum | 4 +- e2e/precompile/go.mod | 2 +- e2e/precompile/go.sum | 4 +- e2e/testapp/app.go | 27 +- e2e/testapp/app_config.go | 2 - e2e/testapp/entrypoint.sh | 3 +- e2e/testapp/go.mod | 4 +- e2e/testapp/go.sum | 8 +- e2e/testapp/polard/cmd/root.go | 2 +- eth/core/chain.go | 49 +- eth/core/chain_context.go | 2 +- eth/core/chain_reader.go | 1 + eth/core/chain_writer.go | 23 + eth/core/host.go | 25 - eth/core/mock/gas.go | 110 --- eth/core/mock/host.go | 8 +- eth/core/mock/host.mock.go | 37 - eth/core/processor.go | 162 --- eth/core/processor_test.go | 188 ---- eth/crypto/imported.go | 2 - eth/go.mod | 4 +- eth/go.sum | 8 +- eth/log/imported.go | 3 + eth/miner/miner.go | 261 ----- eth/polar/api_backend.go | 602 +++++++++++ eth/polar/backend.go | 713 ++++--------- eth/polar/config.go | 6 +- eth/polar/mining.go | 49 - eth/polar/node.go | 6 - eth/polar/polaris.go | 244 ----- go.work.sum | 148 --- lib/go.mod | 2 +- lib/go.sum | 4 +- proto/polaris/evm/v1alpha1/tx.proto | 12 + tools/go.mod | 2 +- tools/go.sum | 4 +- 58 files changed, 2334 insertions(+), 2629 deletions(-) delete mode 100644 cosmos/miner/miner_test.go delete mode 100644 cosmos/x/evm/keeper/abci.go delete mode 100644 cosmos/x/evm/keeper/msg_server.go delete mode 100644 cosmos/x/evm/keeper/processor_test.go delete mode 100644 cosmos/x/evm/plugins/gas/gas_test.go delete mode 100644 cosmos/x/evm/plugins/gas/plugin.go delete mode 100644 cosmos/x/evm/plugins/gas/plugin_test.go delete mode 100644 eth/core/mock/gas.go delete mode 100644 eth/core/processor.go delete mode 100644 eth/core/processor_test.go delete mode 100644 eth/miner/miner.go create mode 100644 eth/polar/api_backend.go delete mode 100644 eth/polar/mining.go delete mode 100644 eth/polar/polaris.go diff --git a/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go b/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go index cc7068d1ef..498cc51905 100644 --- a/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go +++ b/cosmos/api/polaris/evm/v1alpha1/tx.pulsar.go @@ -435,6 +435,784 @@ func (x *fastReflection_WrappedEthereumTransaction) ProtoMethods() *protoiface.M } } +var ( + md_WrappedPayloadEnvelope protoreflect.MessageDescriptor + fd_WrappedPayloadEnvelope_data protoreflect.FieldDescriptor +) + +func init() { + file_polaris_evm_v1alpha1_tx_proto_init() + md_WrappedPayloadEnvelope = File_polaris_evm_v1alpha1_tx_proto.Messages().ByName("WrappedPayloadEnvelope") + fd_WrappedPayloadEnvelope_data = md_WrappedPayloadEnvelope.Fields().ByName("data") +} + +var _ protoreflect.Message = (*fastReflection_WrappedPayloadEnvelope)(nil) + +type fastReflection_WrappedPayloadEnvelope WrappedPayloadEnvelope + +func (x *WrappedPayloadEnvelope) ProtoReflect() protoreflect.Message { + return (*fastReflection_WrappedPayloadEnvelope)(x) +} + +func (x *WrappedPayloadEnvelope) slowProtoReflect() protoreflect.Message { + mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_WrappedPayloadEnvelope_messageType fastReflection_WrappedPayloadEnvelope_messageType +var _ protoreflect.MessageType = fastReflection_WrappedPayloadEnvelope_messageType{} + +type fastReflection_WrappedPayloadEnvelope_messageType struct{} + +func (x fastReflection_WrappedPayloadEnvelope_messageType) Zero() protoreflect.Message { + return (*fastReflection_WrappedPayloadEnvelope)(nil) +} +func (x fastReflection_WrappedPayloadEnvelope_messageType) New() protoreflect.Message { + return new(fastReflection_WrappedPayloadEnvelope) +} +func (x fastReflection_WrappedPayloadEnvelope_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_WrappedPayloadEnvelope +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_WrappedPayloadEnvelope) Descriptor() protoreflect.MessageDescriptor { + return md_WrappedPayloadEnvelope +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_WrappedPayloadEnvelope) Type() protoreflect.MessageType { + return _fastReflection_WrappedPayloadEnvelope_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_WrappedPayloadEnvelope) New() protoreflect.Message { + return new(fastReflection_WrappedPayloadEnvelope) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_WrappedPayloadEnvelope) Interface() protoreflect.ProtoMessage { + return (*WrappedPayloadEnvelope)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_WrappedPayloadEnvelope) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Data) != 0 { + value := protoreflect.ValueOfBytes(x.Data) + if !f(fd_WrappedPayloadEnvelope_data, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_WrappedPayloadEnvelope) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "polaris.evm.v1alpha1.WrappedPayloadEnvelope.data": + return len(x.Data) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelope")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelope does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelope) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "polaris.evm.v1alpha1.WrappedPayloadEnvelope.data": + x.Data = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelope")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelope does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_WrappedPayloadEnvelope) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "polaris.evm.v1alpha1.WrappedPayloadEnvelope.data": + value := x.Data + return protoreflect.ValueOfBytes(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelope")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelope does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelope) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "polaris.evm.v1alpha1.WrappedPayloadEnvelope.data": + x.Data = value.Bytes() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelope")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelope does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelope) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "polaris.evm.v1alpha1.WrappedPayloadEnvelope.data": + panic(fmt.Errorf("field data of message polaris.evm.v1alpha1.WrappedPayloadEnvelope is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelope")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelope does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_WrappedPayloadEnvelope) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "polaris.evm.v1alpha1.WrappedPayloadEnvelope.data": + return protoreflect.ValueOfBytes(nil) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelope")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelope does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_WrappedPayloadEnvelope) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in polaris.evm.v1alpha1.WrappedPayloadEnvelope", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_WrappedPayloadEnvelope) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelope) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_WrappedPayloadEnvelope) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_WrappedPayloadEnvelope) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*WrappedPayloadEnvelope) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Data) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*WrappedPayloadEnvelope) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Data) > 0 { + i -= len(x.Data) + copy(dAtA[i:], x.Data) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Data))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*WrappedPayloadEnvelope) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: WrappedPayloadEnvelope: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: WrappedPayloadEnvelope: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Data = append(x.Data[:0], dAtA[iNdEx:postIndex]...) + if x.Data == nil { + x.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_WrappedPayloadEnvelopeResponse protoreflect.MessageDescriptor +) + +func init() { + file_polaris_evm_v1alpha1_tx_proto_init() + md_WrappedPayloadEnvelopeResponse = File_polaris_evm_v1alpha1_tx_proto.Messages().ByName("WrappedPayloadEnvelopeResponse") +} + +var _ protoreflect.Message = (*fastReflection_WrappedPayloadEnvelopeResponse)(nil) + +type fastReflection_WrappedPayloadEnvelopeResponse WrappedPayloadEnvelopeResponse + +func (x *WrappedPayloadEnvelopeResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_WrappedPayloadEnvelopeResponse)(x) +} + +func (x *WrappedPayloadEnvelopeResponse) slowProtoReflect() protoreflect.Message { + mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_WrappedPayloadEnvelopeResponse_messageType fastReflection_WrappedPayloadEnvelopeResponse_messageType +var _ protoreflect.MessageType = fastReflection_WrappedPayloadEnvelopeResponse_messageType{} + +type fastReflection_WrappedPayloadEnvelopeResponse_messageType struct{} + +func (x fastReflection_WrappedPayloadEnvelopeResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_WrappedPayloadEnvelopeResponse)(nil) +} +func (x fastReflection_WrappedPayloadEnvelopeResponse_messageType) New() protoreflect.Message { + return new(fastReflection_WrappedPayloadEnvelopeResponse) +} +func (x fastReflection_WrappedPayloadEnvelopeResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_WrappedPayloadEnvelopeResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Descriptor() protoreflect.MessageDescriptor { + return md_WrappedPayloadEnvelopeResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Type() protoreflect.MessageType { + return _fastReflection_WrappedPayloadEnvelopeResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) New() protoreflect.Message { + return new(fastReflection_WrappedPayloadEnvelopeResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Interface() protoreflect.ProtoMessage { + return (*WrappedPayloadEnvelopeResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse")) + } + panic(fmt.Errorf("message polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_WrappedPayloadEnvelopeResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*WrappedPayloadEnvelopeResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*WrappedPayloadEnvelopeResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*WrappedPayloadEnvelopeResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: WrappedPayloadEnvelopeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: WrappedPayloadEnvelopeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_WrappedEthereumTransactionResult protoreflect.MessageDescriptor fd_WrappedEthereumTransactionResult_status protoreflect.FieldDescriptor @@ -455,7 +1233,7 @@ func (x *WrappedEthereumTransactionResult) ProtoReflect() protoreflect.Message { } func (x *WrappedEthereumTransactionResult) slowProtoReflect() protoreflect.Message { - mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[1] + mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -963,6 +1741,70 @@ func (x *WrappedEthereumTransaction) GetData() []byte { return nil } +// WrappedPayloadEnvelope encapsulates an Ethereum transaction as an SDK message. +type WrappedPayloadEnvelope struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // data is inner transaction data of the Ethereum transaction. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *WrappedPayloadEnvelope) Reset() { + *x = WrappedPayloadEnvelope{} + if protoimpl.UnsafeEnabled { + mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WrappedPayloadEnvelope) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WrappedPayloadEnvelope) ProtoMessage() {} + +// Deprecated: Use WrappedPayloadEnvelope.ProtoReflect.Descriptor instead. +func (*WrappedPayloadEnvelope) Descriptor() ([]byte, []int) { + return file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP(), []int{1} +} + +func (x *WrappedPayloadEnvelope) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// WrappedPayloadEnvelopeResponse defines the block response. +type WrappedPayloadEnvelopeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *WrappedPayloadEnvelopeResponse) Reset() { + *x = WrappedPayloadEnvelopeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WrappedPayloadEnvelopeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WrappedPayloadEnvelopeResponse) ProtoMessage() {} + +// Deprecated: Use WrappedPayloadEnvelopeResponse.ProtoReflect.Descriptor instead. +func (*WrappedPayloadEnvelopeResponse) Descriptor() ([]byte, []int) { + return file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP(), []int{2} +} + // WrappedEthereumTransactionResult defines the Msg/EthereumTx response type. type WrappedEthereumTransactionResult struct { state protoimpl.MessageState @@ -976,7 +1818,7 @@ type WrappedEthereumTransactionResult struct { func (x *WrappedEthereumTransactionResult) Reset() { *x = WrappedEthereumTransactionResult{} if protoimpl.UnsafeEnabled { - mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[1] + mi := &file_polaris_evm_v1alpha1_tx_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -990,7 +1832,7 @@ func (*WrappedEthereumTransactionResult) ProtoMessage() {} // Deprecated: Use WrappedEthereumTransactionResult.ProtoReflect.Descriptor instead. func (*WrappedEthereumTransactionResult) Descriptor() ([]byte, []int) { - return file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP(), []int{1} + return file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP(), []int{3} } func (x *WrappedEthereumTransactionResult) GetStatus() Status { @@ -1011,6 +1853,11 @@ var file_polaris_evm_v1alpha1_tx_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x2c, 0x0a, 0x16, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, + 0x0a, 0x1e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x0a, 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, @@ -1022,7 +1869,7 @@ var file_polaris_evm_v1alpha1_tx_proto_rawDesc = []byte{ 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x44, 0x10, 0x02, - 0x32, 0x8f, 0x01, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x32, 0x8d, 0x02, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7a, 0x0a, 0x0e, 0x45, 0x74, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, @@ -1030,21 +1877,29 @@ var file_polaris_evm_v1alpha1_tx_proto_rawDesc = []byte{ 0x69, 0x6f, 0x6e, 0x1a, 0x36, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x05, 0x80, 0xe7, 0xb0, - 0x2a, 0x01, 0x42, 0xc8, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, - 0x69, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, - 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6c, - 0x61, 0x72, 0x69, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x3b, 0x65, 0x76, 0x6d, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, - 0x50, 0x45, 0x58, 0xaa, 0x02, 0x14, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x45, 0x76, - 0x6d, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x14, 0x50, 0x6f, 0x6c, - 0x61, 0x72, 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0xe2, 0x02, 0x20, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x3a, 0x3a, - 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x7c, 0x0a, 0x16, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, + 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x1a, 0x34, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x65, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, + 0x42, 0xc8, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x07, 0x54, + 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6c, 0x61, 0x72, + 0x69, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, + 0x65, 0x76, 0x6d, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x45, + 0x58, 0xaa, 0x02, 0x14, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x14, 0x50, 0x6f, 0x6c, 0x61, 0x72, + 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, + 0x02, 0x20, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x16, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x3a, 0x3a, 0x45, 0x76, + 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1060,18 +1915,22 @@ func file_polaris_evm_v1alpha1_tx_proto_rawDescGZIP() []byte { } var file_polaris_evm_v1alpha1_tx_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_polaris_evm_v1alpha1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_polaris_evm_v1alpha1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_polaris_evm_v1alpha1_tx_proto_goTypes = []interface{}{ (Status)(0), // 0: polaris.evm.v1alpha1.Status (*WrappedEthereumTransaction)(nil), // 1: polaris.evm.v1alpha1.WrappedEthereumTransaction - (*WrappedEthereumTransactionResult)(nil), // 2: polaris.evm.v1alpha1.WrappedEthereumTransactionResult + (*WrappedPayloadEnvelope)(nil), // 2: polaris.evm.v1alpha1.WrappedPayloadEnvelope + (*WrappedPayloadEnvelopeResponse)(nil), // 3: polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse + (*WrappedEthereumTransactionResult)(nil), // 4: polaris.evm.v1alpha1.WrappedEthereumTransactionResult } var file_polaris_evm_v1alpha1_tx_proto_depIdxs = []int32{ 0, // 0: polaris.evm.v1alpha1.WrappedEthereumTransactionResult.status:type_name -> polaris.evm.v1alpha1.Status 1, // 1: polaris.evm.v1alpha1.MsgService.EthTransaction:input_type -> polaris.evm.v1alpha1.WrappedEthereumTransaction - 2, // 2: polaris.evm.v1alpha1.MsgService.EthTransaction:output_type -> polaris.evm.v1alpha1.WrappedEthereumTransactionResult - 2, // [2:3] is the sub-list for method output_type - 1, // [1:2] is the sub-list for method input_type + 2, // 2: polaris.evm.v1alpha1.MsgService.ProcessPayloadEnvelope:input_type -> polaris.evm.v1alpha1.WrappedPayloadEnvelope + 4, // 3: polaris.evm.v1alpha1.MsgService.EthTransaction:output_type -> polaris.evm.v1alpha1.WrappedEthereumTransactionResult + 3, // 4: polaris.evm.v1alpha1.MsgService.ProcessPayloadEnvelope:output_type -> polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse + 3, // [3:5] is the sub-list for method output_type + 1, // [1:3] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name @@ -1096,6 +1955,30 @@ func file_polaris_evm_v1alpha1_tx_proto_init() { } } file_polaris_evm_v1alpha1_tx_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WrappedPayloadEnvelope); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_polaris_evm_v1alpha1_tx_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WrappedPayloadEnvelopeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_polaris_evm_v1alpha1_tx_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WrappedEthereumTransactionResult); i { case 0: return &v.state @@ -1114,7 +1997,7 @@ func file_polaris_evm_v1alpha1_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_polaris_evm_v1alpha1_tx_proto_rawDesc, NumEnums: 1, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, diff --git a/cosmos/api/polaris/evm/v1alpha1/tx_grpc.pb.go b/cosmos/api/polaris/evm/v1alpha1/tx_grpc.pb.go index 820c37827d..94e43acd99 100644 --- a/cosmos/api/polaris/evm/v1alpha1/tx_grpc.pb.go +++ b/cosmos/api/polaris/evm/v1alpha1/tx_grpc.pb.go @@ -39,7 +39,8 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - MsgService_EthTransaction_FullMethodName = "/polaris.evm.v1alpha1.MsgService/EthTransaction" + MsgService_EthTransaction_FullMethodName = "/polaris.evm.v1alpha1.MsgService/EthTransaction" + MsgService_ProcessPayloadEnvelope_FullMethodName = "/polaris.evm.v1alpha1.MsgService/ProcessPayloadEnvelope" ) // MsgServiceClient is the client API for MsgService service. @@ -48,6 +49,8 @@ const ( type MsgServiceClient interface { // EthTransaction defines a method submitting Ethereum transactions. EthTransaction(ctx context.Context, in *WrappedEthereumTransaction, opts ...grpc.CallOption) (*WrappedEthereumTransactionResult, error) + // ProcessPayloadEnvelope defines a method to process CL paylods. + ProcessPayloadEnvelope(ctx context.Context, in *WrappedPayloadEnvelope, opts ...grpc.CallOption) (*WrappedPayloadEnvelopeResponse, error) } type msgServiceClient struct { @@ -67,12 +70,23 @@ func (c *msgServiceClient) EthTransaction(ctx context.Context, in *WrappedEthere return out, nil } +func (c *msgServiceClient) ProcessPayloadEnvelope(ctx context.Context, in *WrappedPayloadEnvelope, opts ...grpc.CallOption) (*WrappedPayloadEnvelopeResponse, error) { + out := new(WrappedPayloadEnvelopeResponse) + err := c.cc.Invoke(ctx, MsgService_ProcessPayloadEnvelope_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServiceServer is the server API for MsgService service. // All implementations must embed UnimplementedMsgServiceServer // for forward compatibility type MsgServiceServer interface { // EthTransaction defines a method submitting Ethereum transactions. EthTransaction(context.Context, *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) + // ProcessPayloadEnvelope defines a method to process CL paylods. + ProcessPayloadEnvelope(context.Context, *WrappedPayloadEnvelope) (*WrappedPayloadEnvelopeResponse, error) mustEmbedUnimplementedMsgServiceServer() } @@ -83,6 +97,9 @@ type UnimplementedMsgServiceServer struct { func (UnimplementedMsgServiceServer) EthTransaction(context.Context, *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) { return nil, status.Errorf(codes.Unimplemented, "method EthTransaction not implemented") } +func (UnimplementedMsgServiceServer) ProcessPayloadEnvelope(context.Context, *WrappedPayloadEnvelope) (*WrappedPayloadEnvelopeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProcessPayloadEnvelope not implemented") +} func (UnimplementedMsgServiceServer) mustEmbedUnimplementedMsgServiceServer() {} // UnsafeMsgServiceServer may be embedded to opt out of forward compatibility for this service. @@ -114,6 +131,24 @@ func _MsgService_EthTransaction_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _MsgService_ProcessPayloadEnvelope_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WrappedPayloadEnvelope) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServiceServer).ProcessPayloadEnvelope(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MsgService_ProcessPayloadEnvelope_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServiceServer).ProcessPayloadEnvelope(ctx, req.(*WrappedPayloadEnvelope)) + } + return interceptor(ctx, in, info, handler) +} + // MsgService_ServiceDesc is the grpc.ServiceDesc for MsgService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -125,6 +160,10 @@ var MsgService_ServiceDesc = grpc.ServiceDesc{ MethodName: "EthTransaction", Handler: _MsgService_EthTransaction_Handler, }, + { + MethodName: "ProcessPayloadEnvelope", + Handler: _MsgService_ProcessPayloadEnvelope_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "polaris/evm/v1alpha1/tx.proto", diff --git a/cosmos/go.mod b/cosmos/go.mod index ecaca6463a..947cdb0405 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 @@ -15,7 +15,7 @@ require ( cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 - cosmossdk.io/errors v1.0.0 + cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 cosmossdk.io/math v1.1.3-rc.1 cosmossdk.io/store v1.0.0-rc.0 @@ -32,7 +32,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/holiman/uint256 v1.2.3 // indirect github.com/huandu/skiplist v1.2.0 // indirect - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 diff --git a/cosmos/go.sum b/cosmos/go.sum index e55d14d582..d67e7291e6 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -112,8 +112,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= +github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -737,8 +737,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= diff --git a/cosmos/lib/signing/signers.go b/cosmos/lib/signing/signers.go index 7085a678b6..c232d63103 100644 --- a/cosmos/lib/signing/signers.go +++ b/cosmos/lib/signing/signers.go @@ -32,7 +32,6 @@ func ProvideNoopGetSigners[T proto.Message]() signing.CustomGetSigner { return signing.CustomGetSigner{ MsgType: proto.MessageName(t), Fn: func(msg proto.Message) ([][]byte, error) { - // Return the signer in the required format. return [][]byte{{0x0}}, nil }, } diff --git a/cosmos/miner/miner.go b/cosmos/miner/miner.go index 930c037583..a4169088c6 100644 --- a/cosmos/miner/miner.go +++ b/cosmos/miner/miner.go @@ -28,6 +28,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/miner" @@ -37,29 +38,34 @@ import ( // emptyHash is a common.Hash initialized to all zeros. var emptyHash = common.Hash{} -// EthTxSerializer represents a struct that can serialize ethereum transactions -// to valid sdk.Tx's and bytes that can be used by CometBFT. -type EthTxSerializer interface { - ToSdkTx(input *types.Transaction, gasLimit uint64) (sdk.Tx, error) - ToSdkTxBytes(input *types.Transaction, gasLimit uint64) ([]byte, error) +// EnvelopeSerializer is used to convert an envelope into a byte slice that represents +// a cosmos sdk.Tx. +type EnvelopeSerializer interface { + ToSdkTxBytes(*engine.ExecutionPayloadEnvelope, uint64) ([]byte, error) +} + +// GethMiner represents the underlying *miner.Miner from geth. +type GethMiner interface { + BuildPayload(*miner.BuildPayloadArgs) (*miner.Payload, error) + Etherbase() common.Address } // Miner implements the baseapp.TxSelector interface. type Miner struct { - *miner.Miner - serializer EthTxSerializer + GethMiner + serializer EnvelopeSerializer currentPayload *miner.Payload } // New produces a cosmos miner from a geth miner. -func New(gm *miner.Miner) *Miner { +func New(gm GethMiner) *Miner { return &Miner{ - Miner: gm, + GethMiner: gm, } } // Init sets the transaction serializer. -func (m *Miner) Init(serializer EthTxSerializer) { +func (m *Miner) Init(serializer EnvelopeSerializer) { m.serializer = serializer } @@ -67,22 +73,22 @@ func (m *Miner) Init(serializer EthTxSerializer) { func (m *Miner) PrepareProposal( ctx sdk.Context, _ *abci.RequestPrepareProposal, ) (*abci.ResponsePrepareProposal, error) { - var txs [][]byte + var payloadEnvelopeBz []byte var err error - if txs, err = m.buildBlock(ctx); err != nil { + if payloadEnvelopeBz, err = m.buildBlock(ctx); err != nil { return nil, err } - return &abci.ResponsePrepareProposal{Txs: txs}, err + return &abci.ResponsePrepareProposal{Txs: [][]byte{payloadEnvelopeBz}}, err } // buildBlock builds and submits a payload, it also waits for the txs // to resolve from the underying worker. -func (m *Miner) buildBlock(ctx sdk.Context) ([][]byte, error) { +func (m *Miner) buildBlock(ctx sdk.Context) ([]byte, error) { defer m.clearPayload() if err := m.submitPayloadForBuilding(ctx); err != nil { return nil, err } - return m.resolveTxs(), nil + return m.resolveEnvelope(), nil } // submitPayloadForBuilding submits a payload for building. @@ -107,35 +113,24 @@ func (m *Miner) submitPayloadForBuilding(ctx context.Context) error { func (m *Miner) constructPayloadArgs(ctx sdk.Context) *miner.BuildPayloadArgs { return &miner.BuildPayloadArgs{ Timestamp: uint64(ctx.BlockTime().Unix()), - FeeRecipient: common.Address{}, /* todo: set etherbase */ - Random: common.Hash{}, /* todo: generated random */ + FeeRecipient: m.Etherbase(), + Random: common.Hash{}, /* todo: generated random */ Withdrawals: make(types.Withdrawals, 0), BeaconRoot: &emptyHash, } } -// resolveTxs resolves the transactions from the payload. -func (m *Miner) resolveTxs() [][]byte { +// resolveEnvelope resolves the payload. +func (m *Miner) resolveEnvelope() []byte { if m.currentPayload == nil { return nil } envelope := m.currentPayload.ResolveFull() - ethTxBzs := envelope.ExecutionPayload.Transactions - txs := make([][]byte, len(envelope.ExecutionPayload.Transactions)) - - // encode to sdk.txs and then - for i, ethTxBz := range ethTxBzs { - var tx types.Transaction - if err := tx.UnmarshalBinary(ethTxBz); err != nil { - return nil - } - bz, err := m.serializer.ToSdkTxBytes(&tx, tx.Gas()) - if err != nil { - panic(err) - } - txs[i] = bz + bz, err := m.serializer.ToSdkTxBytes(envelope, envelope.ExecutionPayload.GasLimit) + if err != nil { + panic(err) } - return txs + return bz } // clearPayload clears the payload. diff --git a/cosmos/miner/miner_test.go b/cosmos/miner/miner_test.go deleted file mode 100644 index 527ef815bf..0000000000 --- a/cosmos/miner/miner_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package miner - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestMiner(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/miner") -} - -var _ = Describe("", func() { - - var ( - // t = GinkgoT() - // txPool *mocks.GethTxPool - // sdkTx *mocks.SdkTx - // mempool *Miner - // ctx = context.Background() - ) - - BeforeEach(func() { - // mempool = &Miner{} - }) - -}) diff --git a/cosmos/x/evm/keeper/abci.go b/cosmos/x/evm/keeper/abci.go deleted file mode 100644 index b2610cfb10..0000000000 --- a/cosmos/x/evm/keeper/abci.go +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package keeper - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func (k *Keeper) BeginBlocker(ctx context.Context) error { - // Prepare the Polaris Ethereum block. - _ = k.polaris.SPMiner().Prepare(ctx, uint64(sdk.UnwrapSDKContext(ctx).BlockHeight())) - return nil -} - -func (k *Keeper) EndBlock(ctx context.Context) error { - // Finalize the Polaris Ethereum block. - return k.polaris.SPMiner().Finalize(ctx) -} diff --git a/cosmos/x/evm/keeper/genesis.go b/cosmos/x/evm/keeper/genesis.go index 355074b2b3..3c3fc37d0c 100644 --- a/cosmos/x/evm/keeper/genesis.go +++ b/cosmos/x/evm/keeper/genesis.go @@ -42,7 +42,11 @@ func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { } } } - return nil + + // Insert to chain. + k.polaris.Blockchain(). + PreparePlugins(ctx.WithEventManager(sdk.NewEventManager())) + return k.polaris.Blockchain().InsertBlockWithoutSetHead(genState.ToBlock()) } // ExportGenesis returns the exported genesis state. diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index 3b54844648..a4a1c66976 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -30,7 +30,6 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/configuration" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/gas" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/historical" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile" pclog "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" @@ -55,7 +54,6 @@ type host struct { bp block.Plugin cp configuration.Plugin ep engine.Plugin - gp gas.Plugin hp historical.Plugin pp precompile.Plugin sp state.Plugin @@ -84,7 +82,6 @@ func NewHost( h.bp = block.NewPlugin(storeKey, sk) h.cp = configuration.NewPlugin(&cfg.Polar.Chain) h.ep = engine.NewPlugin() - h.gp = gas.NewPlugin() h.pcs = precompiles h.storeKey = storeKey h.ak = ak @@ -129,12 +126,6 @@ func (h *host) GetConfigurationPlugin() core.ConfigurationPlugin { func (h *host) GetEnginePlugin() core.EnginePlugin { return h.ep } - -// GetGasPlugin returns the gas plugin. -func (h *host) GetGasPlugin() core.GasPlugin { - return h.gp -} - func (h *host) GetHistoricalPlugin() core.HistoricalPlugin { return h.hp } @@ -151,5 +142,5 @@ func (h *host) GetStatePlugin() core.StatePlugin { // GetAllPlugins returns all the plugins. func (h *host) GetAllPlugins() []any { - return []any{h.bp, h.cp, h.gp, h.hp, h.pp, h.sp} + return []any{h.bp, h.cp, h.hp, h.pp, h.sp} } diff --git a/cosmos/x/evm/keeper/msg_server.go b/cosmos/x/evm/keeper/msg_server.go deleted file mode 100644 index c4741db300..0000000000 --- a/cosmos/x/evm/keeper/msg_server.go +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package keeper - -import ( - "context" - - errorsmod "cosmossdk.io/errors" - - "pkg.berachain.dev/polaris/cosmos/x/evm/types" -) - -// Compile-time check to ensure `Keeper` implements the `MsgServiceServer` interface. -var _ types.MsgServiceServer = &Keeper{} - -// EthTransaction implements the MsgServiceServer interface. It processes an incoming request -// and applies it to the Polaris Chain. -func (k *Keeper) EthTransaction( - ctx context.Context, msg *types.WrappedEthereumTransaction, -) (*types.WrappedEthereumTransactionResult, error) { - // Process the transaction and return the result. - receipt, err := k.ProcessTransaction(ctx, msg.Unwrap()) - if err != nil { - return &types.WrappedEthereumTransactionResult{ - Status: types.Status_STATUS_NOT_INCLUDED, - }, errorsmod.Wrapf(err, "failed to process transaction") - } - - // Included the receipt status code in the response. - return &types.WrappedEthereumTransactionResult{ - Status: types.Status(receipt.Status), - }, nil -} diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 336b66e443..7a103fb3c0 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -26,51 +26,47 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - coretypes "pkg.berachain.dev/polaris/eth/core/types" + "github.com/ethereum/go-ethereum/beacon/engine" + + evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" ) -// ProcessTransaction is called during the DeliverTx processing of the ABCI lifecycle. -func (k *Keeper) ProcessTransaction( - ctx context.Context, - tx *coretypes.Transaction, -) (*coretypes.Receipt, error) { +func (k *Keeper) ProcessPayloadEnvelope( + ctx context.Context, msg *evmtypes.WrappedPayloadEnvelope, +) (*evmtypes.WrappedPayloadEnvelopeResponse, error) { + envelope := engine.ExecutionPayloadEnvelope{} + err := envelope.UnmarshalJSON(msg.Data) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal payload envelope: %w", err) + } + sCtx := sdk.UnwrapSDKContext(ctx) gasMeter := sCtx.GasMeter() - // We zero-out the gas meter prior to evm execution in order to ensure that the receipt output - // from the EVM is correct. In the future, we will revisit this to allow gas metering for more - // complex operations prior to entering the EVM. - gasMeter.RefundGas(gasMeter.GasConsumed(), - "reset gas meter prior to ethereum state transition") - // Process the transaction and return the EVM's execution result. - receipt, err := k.polaris.SPMiner().ProcessTransaction(ctx, tx) + block, err := engine.ExecutableDataToBlock(*envelope.ExecutionPayload, nil, nil) if err != nil { - k.Logger(sCtx).Error("failed to process transaction", "err", err) + k.Logger(sCtx).Error("failed to build evm block", "err", err) return nil, err } - // Add some safety checks. - // TODO: we can probably do these once at the end of the block? - if receipt.GasUsed != gasMeter.GasConsumed() { - panic(fmt.Sprintf( - "receipt gas used and ctx gas used differ. receipt: %d, ctx: %d", - receipt.GasUsed, gasMeter.GasConsumed(), - )) - } else if receipt.CumulativeGasUsed != sCtx.BlockGasMeter().GasConsumed()+receipt.GasUsed { - panic(fmt.Sprintf( - "receipt cumulative gas used and block gas used differ. receipt: %d, ctx: %d", - receipt.CumulativeGasUsed, sCtx.BlockGasMeter().GasConsumed()+receipt.GasUsed, - )) + // Prepare should be moved to the blockchain? THIS IS VERY HOOD YES NEEDS TO BE MOVED. + k.polaris.Blockchain(). + PreparePlugins(ctx) + + if err = k.polaris.Blockchain().InsertBlockWithoutSetHead(block); err != nil { + return nil, err } - // Log the receipt. - k.Logger(sCtx).Debug( - "evm execution completed", - "tx_hash", receipt.TxHash, - "gas_consumed", receipt.GasUsed, - "status", receipt.Status, - ) + // Consume the gas used by the execution of the ethereum block. + gasMeter.ConsumeGas(block.GasUsed(), "block gas used") + + return &evmtypes.WrappedPayloadEnvelopeResponse{}, nil +} - // Return the execution result. - return receipt, err +// EthTransaction implements the MsgServer interface. It is intentionally a no-op, but is required +// for the cosmos-sdk to not freak out. +func (k *Keeper) EthTransaction( + context.Context, *evmtypes.WrappedEthereumTransaction, +) (*evmtypes.WrappedEthereumTransactionResult, error) { + panic("intentionally not implemented") } diff --git a/cosmos/x/evm/keeper/processor_test.go b/cosmos/x/evm/keeper/processor_test.go deleted file mode 100644 index b882cc3c0b..0000000000 --- a/cosmos/x/evm/keeper/processor_test.go +++ /dev/null @@ -1,239 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package keeper_test - -import ( - "math/big" - "os" - - "cosmossdk.io/log" - storetypes "cosmossdk.io/store/types" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - bindings "pkg.berachain.dev/polaris/contracts/bindings/testing" - "pkg.berachain.dev/polaris/cosmos/config" - "pkg.berachain.dev/polaris/cosmos/precompile/staking" - testutil "pkg.berachain.dev/polaris/cosmos/testutil" - "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - "pkg.berachain.dev/polaris/eth/accounts/abi" - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core" - ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" - coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/eth/params" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func NewValidator( - operator sdk.ValAddress, - pubKey cryptotypes.PubKey, -) (stakingtypes.Validator, error) { - return stakingtypes.NewValidator( - operator.String() /* todo move to codec */, pubKey, stakingtypes.Description{}) -} - -var ( - PKs = simtestutil.CreateTestPubKeys(500) -) - -var _ = Describe("Processor", func() { - var ( - k *keeper.Keeper - ak state.AccountKeeper - sk stakingkeeper.Keeper - ctx sdk.Context - sc ethprecompile.StatefulImpl - key, _ = crypto.GenerateEthKey() - signer = coretypes.LatestSignerForChainID(params.DefaultChainConfig.ChainID) - legacyTxData *coretypes.LegacyTx - valAddr = common.Address{0x21}.Bytes() - ) - - BeforeEach(func() { - err := os.RemoveAll("tmp/berachain") - Expect(err).ToNot(HaveOccurred()) - - legacyTxData = &coretypes.LegacyTx{ - Nonce: 0, - Gas: 10000000000, - Data: []byte("abcdef"), - GasPrice: big.NewInt(2 ^ 63), // overpaying so test doesn't fail due to EIP-1559 math. - } - - // before chain, init genesis state - ctx, ak, _, sk = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) - cfg := config.DefaultConfig() - cfg.Node.DataDir = GinkgoT().TempDir() - cfg.Node.KeyStoreDir = GinkgoT().TempDir() - sc = staking.NewPrecompileContract(ak, &sk) - k = keeper.NewKeeper( - ak, sk, - testutil.EvmKey, - func() *ethprecompile.Injector { - return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) - }, - nil, - log.NewTestLogger(GinkgoT()), - cfg, - ) - err = k.SetupPrecompiles() - Expect(err).ToNot(HaveOccurred()) - // Init won't work yet due to no multistore existing yet at genesis. - // TODO: probably need to refactor state/plugin.StateAtBlockNumber (its really hood rn). - err = k.Init() - Expect(err).To(HaveOccurred()) - ctx = ctx.WithBlockHeight(0) - genState := core.DefaultGenesis - Expect(k.InitGenesis(ctx, genState)).ToNot(HaveOccurred()) - validator, err := NewValidator(sdk.ValAddress(valAddr), PKs[0]) - Expect(err).ToNot(HaveOccurred()) - validator.Status = stakingtypes.Bonded - Expect(sk.SetValidator(ctx, validator)).To(Succeed()) - - _ = sk.SetParams(ctx, stakingtypes.DefaultParams()) - - // Set validator with consensus address. - consAddr, err := validator.GetConsAddr() - Expect(err).ToNot(HaveOccurred()) - err = sk.SetValidatorByConsAddr(ctx, validator) - Expect(err).ToNot(HaveOccurred()) - - // Set header's consensus address to match the validator's. - header := ctx.BlockHeader() - header.ProposerAddress = consAddr - ctx = ctx.WithBlockHeader(header) - - ctx = ctx.WithBlockGasMeter(storetypes.NewGasMeter(100000000000000)). - WithKVGasConfig(storetypes.GasConfig{}). - WithBlockHeight(1) - err = k.BeginBlocker(ctx) - Expect(err).ToNot(HaveOccurred()) - }) - - Context("New Block", func() { - BeforeEach(func() { - // before every tx - ctx = ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) - }) - - AfterEach(func() { - err := k.EndBlock(ctx) - Expect(err).ToNot(HaveOccurred()) - err = os.RemoveAll("tmp/berachain") - Expect(err).ToNot(HaveOccurred()) - }) - - It("should panic on nil, empty transaction", func() { - Expect(func() { - _, err := k.ProcessTransaction(ctx, nil) - Expect(err).To(HaveOccurred()) - }).To(Panic()) - Expect(func() { - _, err := k.ProcessTransaction(ctx, &coretypes.Transaction{}) - Expect(err).To(HaveOccurred()) - }).To(Panic()) - }) - - It("should successfully deploy a valid contract and call it", func() { - legacyTxData.Data = common.FromHex(bindings.SolmateERC20Bin) - legacyTxData.GasPrice = big.NewInt(10000000000) - tx := coretypes.MustSignNewTx(key, signer, legacyTxData) - addr, err := signer.Sender(tx) - Expect(err).ToNot(HaveOccurred()) - k.Polaris().Host().GetStatePlugin().Reset(ctx) - k.Polaris().Host().GetStatePlugin().CreateAccount(addr) - k.Polaris().Host().GetStatePlugin().AddBalance(addr, - (&big.Int{}).Mul(big.NewInt(9000000000000000000), big.NewInt(999))) - k.Polaris().Host().GetStatePlugin().Finalize() - - // create the contract - // Zero out the meters. - ctx.BlockGasMeter().RefundGas( - ctx.BlockGasMeter().GasConsumed(), - "reset gas meter prior to ethereum state transition") - Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal(uint64(0))) - - // Execute state transition. - result, err := k.ProcessTransaction(ctx, tx) - Expect(err).ToNot(HaveOccurred()) - Expect(result.Status).To(Equal(uint64(1))) - - // Confirm gas usage is correct. - Expect(ctx.GasMeter().GasConsumed()).To(Equal((result.GasUsed))) - // After the tx is fully processed. - ctx.BlockGasMeter().ConsumeGas(result.GasUsed, "consume gas") - Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed))) - - // call the contract non-view function - deployAddress := crypto.CreateAddress(crypto.PubkeyToAddress(key.PublicKey), 0) - legacyTxData.To = &deployAddress - var solmateABI abi.ABI - err = solmateABI.UnmarshalJSON([]byte(bindings.SolmateERC20ABI)) - Expect(err).ToNot(HaveOccurred()) - input, err := solmateABI.Pack("mint", common.BytesToAddress([]byte{0x88}), - big.NewInt(8888888)) - Expect(err).ToNot(HaveOccurred()) - legacyTxData.Data = input - legacyTxData.Nonce++ - tx = coretypes.MustSignNewTx(key, signer, legacyTxData) - - // Nothing should've changed here. - Expect(ctx.GasMeter().GasConsumed()).To(Equal((result.GasUsed))) - Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed))) - - // Execute another transaction. - var result2 *coretypes.Receipt - result2, err = k.ProcessTransaction(ctx, tx) - Expect(err).ToNot(HaveOccurred()) - Expect(result.Status).To(Equal(uint64(1))) - - // Confirm gas usage is correct. - Expect(ctx.GasMeter().GasConsumed()).To(Equal((result2.GasUsed))) - // After the tx is fully processed. - ctx.BlockGasMeter().ConsumeGas(result2.GasUsed, "consume gas") - Expect(ctx.BlockGasMeter().GasConsumed()).To(Equal((result.GasUsed + result2.GasUsed))) - - // call the contract view function - legacyTxData.Data = crypto.Keccak256Hash([]byte("totalSupply()")).Bytes()[:4] - legacyTxData.Nonce++ - tx = coretypes.MustSignNewTx(key, signer, legacyTxData) - var result3 *coretypes.Receipt - result3, err = k.ProcessTransaction(ctx, tx) - Expect(err).ToNot(HaveOccurred()) - Expect(result.Status).To(Equal(uint64(1))) - // Confirm gas usage is correct. - Expect(ctx.GasMeter().GasConsumed()).To(Equal((result3.GasUsed))) - // After the tx is fully processed. - ctx.BlockGasMeter().ConsumeGas(result3.GasUsed, "consume gas") - Expect(ctx.BlockGasMeter().GasConsumed()). - To(Equal((result.GasUsed + result2.GasUsed + result3.GasUsed))) - }) - }) -}) diff --git a/cosmos/x/evm/module.go b/cosmos/x/evm/module.go index 18d2d8e188..c3b1cc6e3d 100644 --- a/cosmos/x/evm/module.go +++ b/cosmos/x/evm/module.go @@ -21,8 +21,6 @@ package evm import ( - "context" - gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" "google.golang.org/grpc" @@ -43,11 +41,9 @@ import ( const ConsensusVersion = 1 var ( - _ appmodule.HasServices = AppModule{} - _ appmodule.HasBeginBlocker = AppModule{} - _ appmodule.HasEndBlocker = AppModule{} - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ appmodule.HasServices = AppModule{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} ) // ============================================================================== @@ -125,13 +121,3 @@ func (am AppModule) RegisterServices(registrar grpc.ServiceRegistrar) error { // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion } - -// BeginBlock returns the begin blocker for the evm module. -func (am AppModule) BeginBlock(ctx context.Context) error { - return am.keeper.BeginBlocker(ctx) -} - -// EndBlock returns the end blocker for the evm module. -func (am AppModule) EndBlock(ctx context.Context) error { - return am.keeper.EndBlock(ctx) -} diff --git a/cosmos/x/evm/plugins/block/header.go b/cosmos/x/evm/plugins/block/header.go index 7c3a08746a..06a0f37b2e 100644 --- a/cosmos/x/evm/plugins/block/header.go +++ b/cosmos/x/evm/plugins/block/header.go @@ -52,7 +52,7 @@ func (p *plugin) SetQueryContextFn(fn func() func(height int64, prove bool) (sdk func (p *plugin) GetHeaderByNumber(number uint64) (*coretypes.Header, error) { bz, err := p.readHeaderBytes(number) if err != nil { - return nil, err + return nil, errorslib.Wrap(err, "GetHeaderByNumber: failed to readHeaderBytes") } if bz == nil { return nil, core.ErrHeaderNotFound @@ -60,7 +60,7 @@ func (p *plugin) GetHeaderByNumber(number uint64) (*coretypes.Header, error) { header, err := coretypes.UnmarshalHeader(bz) if err != nil { - return nil, errorslib.Wrap(err, "GetHeader: failed to unmarshal") + return nil, errorslib.Wrap(err, "GetHeaderByNumber: failed to unmarshal") } if header.Number.Uint64() > number { diff --git a/cosmos/x/evm/plugins/gas/gas_test.go b/cosmos/x/evm/plugins/gas/gas_test.go deleted file mode 100644 index 7b4a547f2d..0000000000 --- a/cosmos/x/evm/plugins/gas/gas_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package gas_test - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestGas(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/gas") -} diff --git a/cosmos/x/evm/plugins/gas/plugin.go b/cosmos/x/evm/plugins/gas/plugin.go deleted file mode 100644 index 018a0b11d0..0000000000 --- a/cosmos/x/evm/plugins/gas/plugin.go +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package gas - -import ( - "context" - "math" - - storetypes "cosmossdk.io/store/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/vm" -) - -// gasMeterDescriptor is the descriptor for the gas meter used in the plugin. -const gasMeterDescriptor = `polaris-gas-plugin` - -// Plugin is the interface that must be implemented by the plugin. -type Plugin interface { - core.GasPlugin -} - -// plugin wraps a Cosmos context and utilize's the underlying `GasMeter` and `BlockGasMeter` -// to implement the core.GasPlugin interface. -type plugin struct { - gasMeter storetypes.GasMeter - blockGasMeter storetypes.GasMeter - consensusMaxGas uint64 -} - -// NewPlugin creates a new instance of the gas plugin from a given context. -func NewPlugin() Plugin { - return &plugin{} -} - -// Prepare implements the core.GasPlugin interface. -func (p *plugin) Prepare(ctx context.Context) { - p.resetMeters(sdk.UnwrapSDKContext(ctx)) -} - -// Reset implements the core.GasPlugin interface. -func (p *plugin) Reset(ctx context.Context) { - p.resetMeters(sdk.UnwrapSDKContext(ctx)) -} - -// GasRemaining implements the core.GasPlugin interface. -func (p *plugin) TxGasRemaining() uint64 { - return p.gasMeter.GasRemaining() -} - -// BlockGasLimit implements the core.GasPlugin interface. -func (p *plugin) BlockGasLimit() uint64 { - if blockGasLimit := p.blockGasMeter.Limit(); blockGasLimit != 0 { - return blockGasLimit - } - return p.consensusMaxGas -} - -// ConsumeTxGas implements the core.GasPlugin interface. -func (p *plugin) ConsumeTxGas(amount uint64) error { - // We don't want to panic if we overflow so we do some safety checks. - // TODO: probably faster / cleaner to just wrap .ConsumeGas in a panic handler, or write our - // own custom gas meter that doesn't panic on overflow. - if newConsumed, overflow := addUint64Overflow(p.gasMeter.GasConsumed(), amount); overflow { - return core.ErrGasUintOverflow - } else if newConsumed > p.gasMeter.Limit() { - return vm.ErrOutOfGas - } else if p.blockGasMeter.GasConsumed()+newConsumed > p.blockGasMeter.Limit() { - // TODO: revisit when the miner is fully ready. - return core.ErrBlockOutOfGas - } - - p.gasMeter.ConsumeGas(amount, gasMeterDescriptor) - return nil -} - -// BlockGasConsumed returns the cumulative gas used during the current block. If the cumulative -// gas used is greater than the block gas limit, we expect for Polaris to handle it. -// -// BlockGasConsumed implements the core.GasPlugin interface. -func (p *plugin) BlockGasConsumed() uint64 { - return p.blockGasMeter.GasConsumed() -} - -// addUint64Overflow performs the addition operation on two uint64 integers and returns a boolean -// on whether or not the result overflows. -func addUint64Overflow(a, b uint64) (uint64, bool) { - if math.MaxUint64-a < b { - return 0, true - } - - return a + b, false -} - -// if either of the gas meters on the sdk context are nil, this function will panic. -func (p *plugin) resetMeters(ctx sdk.Context) { - if p.gasMeter = ctx.GasMeter(); p.gasMeter == nil { - panic("gas meter is nil") - } - if p.blockGasMeter = ctx.BlockGasMeter(); p.blockGasMeter == nil { - panic("block gas meter is nil") - } - if block := ctx.ConsensusParams().Block; block != nil { - p.consensusMaxGas = uint64(block.MaxGas) - } -} diff --git a/cosmos/x/evm/plugins/gas/plugin_test.go b/cosmos/x/evm/plugins/gas/plugin_test.go deleted file mode 100644 index d45b267a8a..0000000000 --- a/cosmos/x/evm/plugins/gas/plugin_test.go +++ /dev/null @@ -1,127 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package gas - -import ( - "math" - - "cosmossdk.io/log" - storetypes "cosmossdk.io/store/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - - testutil "pkg.berachain.dev/polaris/cosmos/testutil" - "pkg.berachain.dev/polaris/lib/utils" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("plugin", func() { - var ctx sdk.Context - var p *plugin - var blockGasMeter storetypes.GasMeter - var blockGasLimit = uint64(1500) - - BeforeEach(func() { - // new block - blockGasMeter = storetypes.NewGasMeter(blockGasLimit) - ctx = testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter) - p = utils.MustGetAs[*plugin](NewPlugin()) - p.Reset(ctx) - p.Prepare(ctx) - }) - - It("correctly consume, refund, and report cumulative in the same block", func() { - p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) - - // tx 1 - p.gasMeter = storetypes.NewGasMeter(1000) - err := p.ConsumeTxGas(500) - Expect(err).ToNot(HaveOccurred()) - Expect(p.gasMeter.GasConsumed()).To(Equal(uint64(500))) - Expect(p.gasMeter.GasRemaining()).To(Equal(uint64(500))) - - p.gasMeter.RefundGas(250, "test") - Expect(p.gasMeter.GasConsumed()).To(Equal(uint64(250))) - Expect(p.BlockGasConsumed()).To(Equal(uint64(0))) // shouldn't have consumed block gas, - // as block gas is handled by the baseapp. - blockGasMeter.ConsumeGas(250, "") // finalize tx 1 - - p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) - - // tx 2 - p.gasMeter = storetypes.NewGasMeter(1000) - Expect(p.BlockGasConsumed()).To(Equal(uint64(250))) - err = p.ConsumeTxGas(1000) - Expect(err).ToNot(HaveOccurred()) - Expect(p.gasMeter.GasConsumed()).To(Equal(uint64(1000))) - Expect(p.gasMeter.GasRemaining()).To(Equal(uint64(0))) - Expect(p.BlockGasConsumed()).To(Equal(uint64(250))) // shouldn't use any xtra gas yet. - blockGasMeter.ConsumeGas(1000, "") // finalize tx 2 - Expect(p.BlockGasConsumed()).To(Equal(uint64(1250))) - p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) - - // tx 3 - p.gasMeter = storetypes.NewGasMeter(1000) - Expect(p.BlockGasConsumed()).To(Equal(uint64(1250))) - err = p.ConsumeTxGas(250) - Expect(err).ToNot(HaveOccurred()) - Expect(p.gasMeter.GasConsumed()).To(Equal(uint64(250))) - Expect(p.gasMeter.GasRemaining()).To(Equal(uint64(750))) - blockGasMeter.ConsumeGas(250, "") // finalize tx 3 - Expect(p.BlockGasConsumed()).To(Equal(blockGasLimit)) - }) - - It("should error on overconsumption in tx", func() { - p.gasMeter = storetypes.NewGasMeter(1000) - p.blockGasMeter = storetypes.NewGasMeter(p.gasMeter.GasRemaining() * 2) - err := p.ConsumeTxGas(p.gasMeter.GasRemaining()) - Expect(err).ToNot(HaveOccurred()) - err = p.ConsumeTxGas(1) - Expect(err.Error()).To(Equal("out of gas")) - }) - - It("should error on uint64 overflow", func() { - p.blockGasMeter = storetypes.NewInfiniteGasMeter() - err := p.ConsumeTxGas(math.MaxUint64) - Expect(err).ToNot(HaveOccurred()) - err = p.ConsumeTxGas(1) - Expect(err.Error()).To(Equal("gas uint64 overflow")) - }) - - It("should error on block gas overconsumption", func() { - Expect(p.BlockGasLimit()).To(Equal(blockGasLimit)) - - p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) - - // tx 1 - err := p.ConsumeTxGas(1000) - Expect(err).ToNot(HaveOccurred()) - blockGasMeter.ConsumeGas(1000, "") // finalize tx 1 - - p.Reset(testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockGasMeter(blockGasMeter)) - - // tx 2 - err = p.ConsumeTxGas(1000) - Expect(err.Error()).To(Equal("block is out of gas")) - }) -}) diff --git a/cosmos/x/evm/types/codec.go b/cosmos/x/evm/types/codec.go index 36f11ad5dc..fdfd58cc8b 100644 --- a/cosmos/x/evm/types/codec.go +++ b/cosmos/x/evm/types/codec.go @@ -31,6 +31,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { registry.RegisterImplementations( (*sdk.Msg)(nil), &WrappedEthereumTransaction{}, + &WrappedPayloadEnvelope{}, ) msgservice.RegisterMsgServiceDesc(registry, &_MsgService_serviceDesc) diff --git a/cosmos/x/evm/types/tx.go b/cosmos/x/evm/types/tx.go index 1691dfef73..25ea25500f 100644 --- a/cosmos/x/evm/types/tx.go +++ b/cosmos/x/evm/types/tx.go @@ -25,6 +25,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/beacon/engine" + coretypes "pkg.berachain.dev/polaris/eth/core/types" ) @@ -51,3 +53,24 @@ func (etr *WrappedEthereumTransaction) Unwrap() *coretypes.Transaction { } return tx } + +// WrapPayload sets the payload data from an `engine.ExecutionPayloadEnvelope`. +func WrapPayload(envelope *engine.ExecutionPayloadEnvelope) (*WrappedPayloadEnvelope, error) { + bz, err := envelope.MarshalJSON() + if err != nil { + return nil, fmt.Errorf("failed to wrap payload: %w", err) + } + + return &WrappedPayloadEnvelope{ + Data: bz, + }, nil +} + +// AsPayload extracts the payload as an `engine.ExecutionPayloadEnvelope`. +func (wpe *WrappedPayloadEnvelope) UnwrapPayload() *engine.ExecutionPayloadEnvelope { + payload := new(engine.ExecutionPayloadEnvelope) + if err := payload.UnmarshalJSON(wpe.Data); err != nil { + return nil + } + return payload +} diff --git a/cosmos/x/evm/types/tx.pb.go b/cosmos/x/evm/types/tx.pb.go index 008ad571aa..f5cb70da24 100644 --- a/cosmos/x/evm/types/tx.pb.go +++ b/cosmos/x/evm/types/tx.pb.go @@ -107,6 +107,89 @@ func (m *WrappedEthereumTransaction) GetData() []byte { return nil } +// WrappedPayloadEnvelope encapsulates an Ethereum transaction as an SDK message. +type WrappedPayloadEnvelope struct { + // data is inner transaction data of the Ethereum transaction. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *WrappedPayloadEnvelope) Reset() { *m = WrappedPayloadEnvelope{} } +func (m *WrappedPayloadEnvelope) String() string { return proto.CompactTextString(m) } +func (*WrappedPayloadEnvelope) ProtoMessage() {} +func (*WrappedPayloadEnvelope) Descriptor() ([]byte, []int) { + return fileDescriptor_d8b33d2a2c64400f, []int{1} +} +func (m *WrappedPayloadEnvelope) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WrappedPayloadEnvelope) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WrappedPayloadEnvelope.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *WrappedPayloadEnvelope) XXX_Merge(src proto.Message) { + xxx_messageInfo_WrappedPayloadEnvelope.Merge(m, src) +} +func (m *WrappedPayloadEnvelope) XXX_Size() int { + return m.Size() +} +func (m *WrappedPayloadEnvelope) XXX_DiscardUnknown() { + xxx_messageInfo_WrappedPayloadEnvelope.DiscardUnknown(m) +} + +var xxx_messageInfo_WrappedPayloadEnvelope proto.InternalMessageInfo + +func (m *WrappedPayloadEnvelope) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// WrappedPayloadEnvelopeResponse defines the block response. +type WrappedPayloadEnvelopeResponse struct { +} + +func (m *WrappedPayloadEnvelopeResponse) Reset() { *m = WrappedPayloadEnvelopeResponse{} } +func (m *WrappedPayloadEnvelopeResponse) String() string { return proto.CompactTextString(m) } +func (*WrappedPayloadEnvelopeResponse) ProtoMessage() {} +func (*WrappedPayloadEnvelopeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d8b33d2a2c64400f, []int{2} +} +func (m *WrappedPayloadEnvelopeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WrappedPayloadEnvelopeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WrappedPayloadEnvelopeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *WrappedPayloadEnvelopeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_WrappedPayloadEnvelopeResponse.Merge(m, src) +} +func (m *WrappedPayloadEnvelopeResponse) XXX_Size() int { + return m.Size() +} +func (m *WrappedPayloadEnvelopeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_WrappedPayloadEnvelopeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_WrappedPayloadEnvelopeResponse proto.InternalMessageInfo + // WrappedEthereumTransactionResult defines the Msg/EthereumTx response type. type WrappedEthereumTransactionResult struct { // `status` represents a transaction's status @@ -117,7 +200,7 @@ func (m *WrappedEthereumTransactionResult) Reset() { *m = WrappedEthereu func (m *WrappedEthereumTransactionResult) String() string { return proto.CompactTextString(m) } func (*WrappedEthereumTransactionResult) ProtoMessage() {} func (*WrappedEthereumTransactionResult) Descriptor() ([]byte, []int) { - return fileDescriptor_d8b33d2a2c64400f, []int{1} + return fileDescriptor_d8b33d2a2c64400f, []int{3} } func (m *WrappedEthereumTransactionResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -156,35 +239,41 @@ func (m *WrappedEthereumTransactionResult) GetStatus() Status { func init() { proto.RegisterEnum("polaris.evm.v1alpha1.Status", Status_name, Status_value) proto.RegisterType((*WrappedEthereumTransaction)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransaction") + proto.RegisterType((*WrappedPayloadEnvelope)(nil), "polaris.evm.v1alpha1.WrappedPayloadEnvelope") + proto.RegisterType((*WrappedPayloadEnvelopeResponse)(nil), "polaris.evm.v1alpha1.WrappedPayloadEnvelopeResponse") proto.RegisterType((*WrappedEthereumTransactionResult)(nil), "polaris.evm.v1alpha1.WrappedEthereumTransactionResult") } func init() { proto.RegisterFile("polaris/evm/v1alpha1/tx.proto", fileDescriptor_d8b33d2a2c64400f) } var fileDescriptor_d8b33d2a2c64400f = []byte{ - // 351 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0xc8, 0xcf, 0x49, - 0x2c, 0xca, 0x2c, 0xd6, 0x4f, 0x2d, 0xcb, 0xd5, 0x2f, 0x33, 0x4c, 0xcc, 0x29, 0xc8, 0x48, 0x34, - 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0x4a, 0xeb, 0xa5, 0x96, - 0xe5, 0xea, 0xc1, 0xa4, 0xa5, 0xc4, 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, - 0xf5, 0xcb, 0x0c, 0x41, 0x14, 0x44, 0xb9, 0x92, 0x01, 0x97, 0x54, 0x78, 0x51, 0x62, 0x41, 0x41, - 0x6a, 0x8a, 0x6b, 0x49, 0x46, 0x6a, 0x51, 0x6a, 0x69, 0x6e, 0x48, 0x51, 0x62, 0x5e, 0x71, 0x62, - 0x72, 0x49, 0x66, 0x7e, 0x9e, 0x90, 0x10, 0x17, 0x4b, 0x4a, 0x62, 0x49, 0xa2, 0x04, 0xa3, 0x02, - 0xa3, 0x06, 0x4f, 0x10, 0x98, 0xad, 0x14, 0xc1, 0xa5, 0x80, 0x5b, 0x47, 0x50, 0x6a, 0x71, 0x69, - 0x4e, 0x89, 0x90, 0x09, 0x17, 0x5b, 0x71, 0x49, 0x62, 0x49, 0x69, 0x31, 0x58, 0x27, 0x9f, 0x91, - 0x8c, 0x1e, 0x36, 0x57, 0xe9, 0x05, 0x83, 0xd5, 0x04, 0x41, 0xd5, 0x6a, 0x85, 0x70, 0xb1, 0x41, - 0x44, 0x84, 0x64, 0xb9, 0x24, 0x83, 0x43, 0x1c, 0x43, 0x42, 0x83, 0xe3, 0x83, 0x5c, 0xc3, 0x5c, - 0x83, 0x42, 0xe2, 0x43, 0xfd, 0x82, 0x03, 0x5c, 0x9d, 0x3d, 0xdd, 0x3c, 0x5d, 0x5d, 0x04, 0x18, - 0x84, 0x84, 0xb8, 0xf8, 0xa0, 0xd2, 0xc1, 0xa1, 0xce, 0xce, 0xae, 0xc1, 0xc1, 0x02, 0x8c, 0x42, - 0xe2, 0x5c, 0xc2, 0x50, 0x31, 0x3f, 0xff, 0x90, 0x78, 0x4f, 0x3f, 0x67, 0x9f, 0x50, 0x17, 0x57, - 0x17, 0x01, 0x26, 0xa3, 0x7e, 0x46, 0x2e, 0x2e, 0xdf, 0xe2, 0xf4, 0xe0, 0xd4, 0xa2, 0xb2, 0xcc, - 0xe4, 0x54, 0xa1, 0x2a, 0x2e, 0x3e, 0xd7, 0x92, 0x0c, 0x64, 0x4f, 0x1a, 0x60, 0x77, 0x1c, 0x6e, - 0x4f, 0x4a, 0x99, 0x91, 0xaa, 0x03, 0x12, 0x2c, 0x52, 0xac, 0x0d, 0xcf, 0x37, 0x68, 0x31, 0x3a, - 0xb9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, - 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x4e, 0x41, 0x76, 0xba, - 0x5e, 0x52, 0x6a, 0x51, 0x62, 0x72, 0x46, 0x62, 0x66, 0x9e, 0x5e, 0x4a, 0x6a, 0x99, 0x3e, 0x2c, - 0xb6, 0xa1, 0x11, 0x58, 0x01, 0x8e, 0xf6, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0x70, 0x14, - 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x62, 0x15, 0x3f, 0x12, 0x12, 0x02, 0x00, 0x00, + // 407 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x8b, 0xd3, 0x40, + 0x18, 0xc6, 0x93, 0x45, 0x7b, 0x18, 0xa4, 0x94, 0x51, 0x76, 0x35, 0xb8, 0xa1, 0xf4, 0x24, 0x4b, + 0x49, 0xb6, 0xeb, 0xe2, 0x5d, 0xd3, 0x59, 0x28, 0x68, 0x2d, 0x99, 0x44, 0xc5, 0x4b, 0x99, 0x4d, + 0x5e, 0x9a, 0x60, 0x92, 0x19, 0x66, 0xa6, 0xa1, 0x15, 0x0f, 0x7e, 0x01, 0xc1, 0x8f, 0xe2, 0xc7, + 0xf0, 0xd8, 0xa3, 0x47, 0x69, 0x0f, 0x7e, 0x0d, 0x31, 0x4d, 0x41, 0x4a, 0xba, 0xd0, 0xd3, 0x0c, + 0xef, 0xf3, 0x7b, 0x5f, 0xde, 0x3f, 0x0f, 0x3a, 0x17, 0x3c, 0x63, 0x32, 0x55, 0x2e, 0x94, 0xb9, + 0x5b, 0x0e, 0x58, 0x26, 0x12, 0x36, 0x70, 0xf5, 0xc2, 0x11, 0x92, 0x6b, 0x8e, 0x1f, 0xd5, 0xb2, + 0x03, 0x65, 0xee, 0xec, 0x64, 0xeb, 0x2c, 0xe2, 0x2a, 0xe7, 0xca, 0xcd, 0xd5, 0xcc, 0x2d, 0x07, + 0xff, 0x9e, 0x2d, 0xde, 0xbb, 0x44, 0xd6, 0x7b, 0xc9, 0x84, 0x80, 0x98, 0xe8, 0x04, 0x24, 0xcc, + 0xf3, 0x40, 0xb2, 0x42, 0xb1, 0x48, 0xa7, 0xbc, 0xc0, 0x18, 0xdd, 0x8b, 0x99, 0x66, 0x8f, 0xcd, + 0xae, 0xf9, 0xec, 0x81, 0x5f, 0xfd, 0x7b, 0x7d, 0x74, 0x5a, 0x67, 0x4c, 0xd8, 0x32, 0xe3, 0x2c, + 0x26, 0x45, 0x09, 0x19, 0x17, 0xd0, 0x48, 0x77, 0x91, 0xdd, 0x4c, 0xfb, 0xa0, 0x04, 0x2f, 0x14, + 0xf4, 0x3e, 0xa0, 0xee, 0xe1, 0x0e, 0x7c, 0x50, 0xf3, 0x4c, 0xe3, 0x6b, 0xd4, 0x52, 0x9a, 0xe9, + 0xb9, 0xaa, 0x6a, 0xb7, 0xaf, 0x9e, 0x3a, 0x4d, 0x53, 0x3a, 0xb4, 0x62, 0xfc, 0x9a, 0xbd, 0x08, + 0x50, 0x6b, 0x1b, 0xc1, 0xe7, 0xe8, 0x09, 0x0d, 0x5e, 0x06, 0x21, 0x9d, 0xfa, 0xe4, 0x1d, 0xf1, + 0x83, 0x69, 0x38, 0xa6, 0x13, 0xe2, 0x8d, 0x6e, 0x46, 0x64, 0xd8, 0x31, 0x30, 0x46, 0xed, 0x5a, + 0xa6, 0xa1, 0xe7, 0x11, 0x4a, 0x3b, 0x26, 0x3e, 0x43, 0x0f, 0xeb, 0xd8, 0xf8, 0x6d, 0x30, 0x1d, + 0x8d, 0xbd, 0xd7, 0xe1, 0x90, 0x0c, 0x3b, 0x27, 0x57, 0xdf, 0x4e, 0x10, 0x7a, 0xa3, 0x66, 0x14, + 0x64, 0x99, 0x46, 0x80, 0x3f, 0xa3, 0x36, 0xd1, 0xc9, 0xff, 0x4b, 0xbb, 0x6c, 0x6e, 0xee, 0xf0, + 0x90, 0xd6, 0x8b, 0x63, 0x33, 0xea, 0xb5, 0x7c, 0x41, 0xa7, 0x13, 0xc9, 0x23, 0x50, 0x6a, 0xff, + 0x14, 0xfd, 0x3b, 0x2b, 0xee, 0xd1, 0xd6, 0xf5, 0x31, 0xf4, 0xee, 0x70, 0xd6, 0xfd, 0xaf, 0x7f, + 0x7e, 0x5c, 0x98, 0xaf, 0x6e, 0x7e, 0xae, 0x6d, 0x73, 0xb5, 0xb6, 0xcd, 0xdf, 0x6b, 0xdb, 0xfc, + 0xbe, 0xb1, 0x8d, 0xd5, 0xc6, 0x36, 0x7e, 0x6d, 0x6c, 0xe3, 0x63, 0x5f, 0x7c, 0x9a, 0x39, 0xb7, + 0x20, 0x59, 0x94, 0xb0, 0xb4, 0x70, 0x62, 0x28, 0xdd, 0x9d, 0x77, 0x6b, 0x3b, 0x2e, 0x2a, 0x13, + 0xeb, 0xa5, 0x00, 0x75, 0xdb, 0xaa, 0x0c, 0xf9, 0xfc, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, + 0x1a, 0xf4, 0xc3, 0xe0, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -201,6 +290,8 @@ const _ = grpc.SupportPackageIsVersion4 type MsgServiceClient interface { // EthTransaction defines a method submitting Ethereum transactions. EthTransaction(ctx context.Context, in *WrappedEthereumTransaction, opts ...grpc.CallOption) (*WrappedEthereumTransactionResult, error) + // ProcessPayloadEnvelope defines a method to process CL paylods. + ProcessPayloadEnvelope(ctx context.Context, in *WrappedPayloadEnvelope, opts ...grpc.CallOption) (*WrappedPayloadEnvelopeResponse, error) } type msgServiceClient struct { @@ -220,10 +311,21 @@ func (c *msgServiceClient) EthTransaction(ctx context.Context, in *WrappedEthere return out, nil } +func (c *msgServiceClient) ProcessPayloadEnvelope(ctx context.Context, in *WrappedPayloadEnvelope, opts ...grpc.CallOption) (*WrappedPayloadEnvelopeResponse, error) { + out := new(WrappedPayloadEnvelopeResponse) + err := c.cc.Invoke(ctx, "/polaris.evm.v1alpha1.MsgService/ProcessPayloadEnvelope", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServiceServer is the server API for MsgService service. type MsgServiceServer interface { // EthTransaction defines a method submitting Ethereum transactions. EthTransaction(context.Context, *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) + // ProcessPayloadEnvelope defines a method to process CL paylods. + ProcessPayloadEnvelope(context.Context, *WrappedPayloadEnvelope) (*WrappedPayloadEnvelopeResponse, error) } // UnimplementedMsgServiceServer can be embedded to have forward compatible implementations. @@ -233,6 +335,9 @@ type UnimplementedMsgServiceServer struct { func (*UnimplementedMsgServiceServer) EthTransaction(ctx context.Context, req *WrappedEthereumTransaction) (*WrappedEthereumTransactionResult, error) { return nil, status.Errorf(codes.Unimplemented, "method EthTransaction not implemented") } +func (*UnimplementedMsgServiceServer) ProcessPayloadEnvelope(ctx context.Context, req *WrappedPayloadEnvelope) (*WrappedPayloadEnvelopeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProcessPayloadEnvelope not implemented") +} func RegisterMsgServiceServer(s grpc1.Server, srv MsgServiceServer) { s.RegisterService(&_MsgService_serviceDesc, srv) @@ -256,6 +361,24 @@ func _MsgService_EthTransaction_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _MsgService_ProcessPayloadEnvelope_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WrappedPayloadEnvelope) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServiceServer).ProcessPayloadEnvelope(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/polaris.evm.v1alpha1.MsgService/ProcessPayloadEnvelope", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServiceServer).ProcessPayloadEnvelope(ctx, req.(*WrappedPayloadEnvelope)) + } + return interceptor(ctx, in, info, handler) +} + var _MsgService_serviceDesc = grpc.ServiceDesc{ ServiceName: "polaris.evm.v1alpha1.MsgService", HandlerType: (*MsgServiceServer)(nil), @@ -264,6 +387,10 @@ var _MsgService_serviceDesc = grpc.ServiceDesc{ MethodName: "EthTransaction", Handler: _MsgService_EthTransaction_Handler, }, + { + MethodName: "ProcessPayloadEnvelope", + Handler: _MsgService_ProcessPayloadEnvelope_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "polaris/evm/v1alpha1/tx.proto", @@ -299,6 +426,59 @@ func (m *WrappedEthereumTransaction) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *WrappedPayloadEnvelope) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WrappedPayloadEnvelope) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WrappedPayloadEnvelope) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WrappedPayloadEnvelopeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WrappedPayloadEnvelopeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WrappedPayloadEnvelopeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *WrappedEthereumTransactionResult) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -351,6 +531,28 @@ func (m *WrappedEthereumTransaction) Size() (n int) { return n } +func (m *WrappedPayloadEnvelope) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *WrappedPayloadEnvelopeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *WrappedEthereumTransactionResult) Size() (n int) { if m == nil { return 0 @@ -453,6 +655,140 @@ func (m *WrappedEthereumTransaction) Unmarshal(dAtA []byte) error { } return nil } +func (m *WrappedPayloadEnvelope) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WrappedPayloadEnvelope: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WrappedPayloadEnvelope: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WrappedPayloadEnvelopeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WrappedPayloadEnvelopeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WrappedPayloadEnvelopeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *WrappedEthereumTransactionResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index d9af6139c2..2d7fdb239a 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/docker/docker v24.0.5+incompatible github.com/ethereum/go-ethereum v1.13.1 - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 4d5386876b..a079982b88 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -165,8 +165,8 @@ github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7P github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= 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/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 0ef9ce6df4..2376001ded 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -8,7 +8,7 @@ replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.2021 require ( github.com/cosmos/cosmos-sdk v0.50.0-rc.1 github.com/cosmos/gogoproto v1.4.11 - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 9c7aa381a6..287ae1ce10 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -705,8 +705,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index eb9c94e6d3..914c278512 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -42,6 +42,7 @@ import ( "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -64,7 +65,6 @@ import ( "pkg.berachain.dev/polaris/cosmos/txpool" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" - coretypes "pkg.berachain.dev/polaris/eth/core/types" ) // DefaultNodeHome default home directories for the application daemon. @@ -136,7 +136,7 @@ func NewPolarisApp( MakeAppConfig(bech32Prefix), depinject.Provide( signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], - ), + signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope]), depinject.Supply( // supply the application options appOpts, @@ -214,9 +214,7 @@ func NewPolarisApp( app.SetPrepareProposal(app.mm.PrepareProposal) // Setup Custom Ante Handler - app.SetAnteHandler( - antelib.NewMinimalHandler(), - ) + app.SetAnteHandler(antelib.NewMinimalHandler()) // ----- END EVM SETUP ------------------------------------------------- @@ -235,6 +233,15 @@ func NewPolarisApp( panic(err) } + cmsCtx := sdk.Context{}. + WithMultiStore(app.CommitMultiStore()). + WithGasMeter(storetypes.NewInfiniteGasMeter()). + WithBlockGasMeter(storetypes.NewInfiniteGasMeter()).WithEventManager(sdk.NewEventManager()) + if err := app.EVMKeeper.Polaris().Blockchain(). + LoadLastState(cmsCtx, uint64(app.LastBlockHeight())); err != nil { + panic(err) + } + return app } @@ -276,13 +283,13 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon panic(err) } - // Create a TxSerializer. - serializer := libtx.NewSerializer[*coretypes.Transaction]( - apiSvr.ClientCtx.TxConfig, evmtypes.WrapTx) + // Create the Serializers. + txSerializer := libtx.NewSerializer(apiSvr.ClientCtx.TxConfig, evmtypes.WrapTx) + payloadSerializer := libtx.NewSerializer(apiSvr.ClientCtx.TxConfig, evmtypes.WrapPayload) // Initialize services. - app.mm.Init(serializer) - app.mp.Init(app.Logger(), apiSvr.ClientCtx, serializer) + app.mm.Init(payloadSerializer) + app.mp.Init(app.Logger(), apiSvr.ClientCtx, txSerializer) // Register services with Polaris. app.EVMKeeper.RegisterServices(apiSvr.ClientCtx, []node.Lifecycle{ diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index 611d480c7e..ca2eade790 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -133,14 +133,12 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { evidencetypes.ModuleName, stakingtypes.ModuleName, genutiltypes.ModuleName, - evmtypes.ModuleName, }, EndBlockers: []string{ crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName, genutiltypes.ModuleName, - evmtypes.ModuleName, }, OverrideStoreKeys: []*runtimev1alpha1.StoreKeyConfig{ { diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index 7828daf835..f447a7eba1 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -48,7 +48,8 @@ set -e # Reinstall daemon make build -# # User prompt if an existing local node configuration is found. +overwrite="N" +# fi if [ -d "$HOMEDIR" ]; then printf "\nAn existing folder at '%s' was found. You can choose to delete this folder and start a new local node with new keys from genesis. When declined, the existing local node is started. \n" "$HOMEDIR" echo "Overwrite the existing configuration and start a new local node? [y/n]" diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 48c122d0fd..2a3d2d1d9a 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 @@ -41,7 +41,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/huandu/skiplist v1.2.0 // indirect - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index efad7c0c58..3cefdffd7a 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -275,8 +275,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= +github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -945,8 +945,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 34344700d4..fa1f9a002f 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -91,7 +91,7 @@ func NewRootCmd() *cobra.Command { ), depinject.Provide( signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], - ), + signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope]), ), &interfaceRegistry, &appCodec, diff --git a/eth/core/chain.go b/eth/core/chain.go index aa013ef0ab..5f7092858b 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -21,14 +21,18 @@ package core import ( + "context" + "errors" "math/big" "sync/atomic" lru "github.com/ethereum/go-ethereum/common/lru" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/trie" "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/consensus" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/core/vm" @@ -43,6 +47,7 @@ const defaultCacheSize = 1024 var _ Blockchain = (*blockchain)(nil) type Blockchain interface { + PreparePlugins(ctx context.Context) Config() *params.ChainConfig ChainReader ChainWriter @@ -60,6 +65,9 @@ type blockchain struct { pp PrecompilePlugin sp StatePlugin + engine consensus.Engine + processor core.Processor + // statedb is the state database that is used to mange state during transactions. statedb state.StateDB // vmConfig is the configuration used to create the EVM. @@ -103,7 +111,9 @@ type blockchain struct { // ========================================================================= // NewChain creates and returns a `api.Chain` with the given EVM chain configuration and host. -func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used as `api.Chain`. +func NewChain( + host PolarisHostChain, engine consensus.Engine, +) *blockchain { //nolint:revive // only used as `api.Chain`. bc := &blockchain{ bp: host.GetBlockPlugin(), cp: host.GetConfigurationPlugin(), @@ -118,18 +128,51 @@ func NewChain(host PolarisHostChain) *blockchain { //nolint:revive // only used chainHeadFeed: event.Feed{}, scope: event.SubscriptionScope{}, logger: log.Root(), + engine: engine, } bc.statedb = state.NewStateDB(bc.sp, bc.pp) + bc.processor = core.NewStateProcessor(bc.cp.ChainConfig(), bc, bc.engine) // TODO: hmm... bc.currentBlock.Store( - types.NewBlock(&types.Header{Number: big.NewInt(0), + types.NewBlock(&types.Header{Time: 0, Number: big.NewInt(0), BaseFee: big.NewInt(0)}, nil, nil, nil, trie.NewStackTrie(nil))) bc.finalizedBlock.Store(nil) - return bc } +func (bc *blockchain) LoadLastState(ctx context.Context, number uint64) error { + // ctx here is the one created from app.CommitMultistore(). + bc.PreparePlugins(ctx) + + return bc.loadLastState(number) +} + +func (bc *blockchain) PreparePlugins(ctx context.Context) { + bc.sp.Prepare(ctx) + bc.sp.Reset(ctx) + bc.bp.Prepare(ctx) + bc.cp.Prepare(ctx) + if bc.hp != nil { + bc.hp.Prepare(ctx) + } +} + // ChainConfig returns the Ethereum chain config of the chain. func (bc *blockchain) Config() *params.ChainConfig { return bc.cp.ChainConfig() } + +// loadLastState loads the last known chain state from the database. This method +// assumes that the chain manager mutex is held. +func (bc *blockchain) loadLastState(number uint64) error { + bc.logger.Info("loading last state") + b := bc.GetBlockByNumber(number) + if number == 0 { + return nil + } + if b == nil { + return errors.New("block is nil at load last state") + } + bc.currentBlock.Store(b) + return nil +} diff --git a/eth/core/chain_context.go b/eth/core/chain_context.go index e8a6975d17..5bc7648b10 100644 --- a/eth/core/chain_context.go +++ b/eth/core/chain_context.go @@ -38,5 +38,5 @@ func (bc *blockchain) GetHeader(hash common.Hash, number uint64) *types.Header { // Engine returns the consensus engine. For our use case, this never gets called. func (bc *blockchain) Engine() consensus.Engine { - return nil + return bc.engine } diff --git a/eth/core/chain_reader.go b/eth/core/chain_reader.go index 439f0e2ae2..cccaba8d88 100644 --- a/eth/core/chain_reader.go +++ b/eth/core/chain_reader.go @@ -261,6 +261,7 @@ func (bc *blockchain) GetHeaderByHash(hash common.Hash) *types.Header { } header = block.Header() } + return header } diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 7ef90576c6..7c3ace4a49 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -21,6 +21,9 @@ package core import ( + "context" + "time" + "github.com/ethereum/go-ethereum/core" "pkg.berachain.dev/polaris/eth/core/state" @@ -29,7 +32,9 @@ import ( // ChainWriter defines methods that are used to perform state and block transitions. type ChainWriter interface { + LoadLastState(context.Context, uint64) error InsertBlock(block *types.Block, receipts types.Receipts, logs []*types.Log) error + InsertBlockWithoutSetHead(block *types.Block) error WriteBlockAndSetHead(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state state.StateDB, emitHeadEvent bool) (status core.WriteStatus, err error) } @@ -41,6 +46,24 @@ func (*blockchain) WriteBlockAndSetHead( return core.NonStatTy, nil } +func (bc *blockchain) InsertBlockWithoutSetHead(block *types.Block) error { + // Retrieve the parent block and it's state to execute on top + // parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1) + // if parent == nil { + // return fmt.Errorf("parent block not found") + // } + + // Process block using the parent state as reference point + pstart := time.Now() + receipts, logs, _, err := bc.processor.Process(block, bc.statedb, *bc.vmConfig) + if err != nil { + return err + } + ptime := time.Since(pstart) + bc.logger.Info("processed block in", "time", ptime) + return bc.InsertBlock(block, receipts, logs) +} + // InsertBlock inserts a block into the canonical chain and updates the state of the blockchain. func (bc *blockchain) InsertBlock( block *types.Block, diff --git a/eth/core/host.go b/eth/core/host.go index 2e90ea7545..e17e432c1d 100644 --- a/eth/core/host.go +++ b/eth/core/host.go @@ -42,8 +42,6 @@ type PolarisHostChain interface { GetConfigurationPlugin() ConfigurationPlugin // GetEnginePlugin() returns the `EnginePlugin` of the Polaris host chain. GetEnginePlugin() EnginePlugin - // GetGasPlugin returns the `GasPlugin` of the Polaris host chain. - GetGasPlugin() GasPlugin // GetHistoricalPlugin returns the OPTIONAL `HistoricalPlugin` of the Polaris host chain. GetHistoricalPlugin() HistoricalPlugin // GetPrecompilePlugin returns the OPTIONAL `PrecompilePlugin` of the Polaris host chain. @@ -99,29 +97,6 @@ type ( PeerCount(ctx context.Context) (uint64, error) } - // GasPlugin is an interface that allows the Polaris EVM to consume gas on the host chain. - GasPlugin interface { - // GasPlugin implements `libtypes.Preparable`. Calling `Prepare` should reset the - // GasPlugin to a default state. - libtypes.Preparable - // GasPlugin implements `libtypes.Resettable`. Calling `Reset` should reset the - // GasPlugin to a default state - libtypes.Resettable - // ConsumeTxGas consumes the supplied amount of gas. It should not panic due to a - // GasOverflow and should return `core.ErrOutOfGas` if the amount of gas remaining is - // less than the amount requested. If the requested amount is greater than the amount of - // gas remaining in the block, it should return core.ErrBlockOutOfGas. - ConsumeTxGas(uint64) error - // TxGasRemaining returns the amount of gas remaining for the current transaction. - TxGasRemaining() uint64 - // BlockGasConsumed returns the amount of gas used during the current block. The value - // returned should NOT include any gas consumed during this transaction. - // It should not panic. - BlockGasConsumed() uint64 - // BlockGasLimit returns the gas limit of the current block. It should not panic. - BlockGasLimit() uint64 - } - // StatePlugin defines the methods that the chain running Polaris EVM should implement. StatePlugin interface { state.Plugin diff --git a/eth/core/mock/gas.go b/eth/core/mock/gas.go deleted file mode 100644 index 3d44d36407..0000000000 --- a/eth/core/mock/gas.go +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mock - -import ( - "context" - "errors" - - "pkg.berachain.dev/polaris/eth/core" -) - -type GasPluginMock struct { - txGasUsed uint64 - blockGasUsed uint64 - txGasLimit uint64 - blockGasLimit uint64 -} - -func NewGasPluginMock() *GasPluginMock { - return &GasPluginMock{} -} - -func (w *GasPluginMock) Prepare(context.Context) { - w.blockGasUsed = 0 -} - -func (w *GasPluginMock) Reset(context.Context) { - w.txGasUsed = 0 -} - -func (w *GasPluginMock) ConsumeTxGas(amount uint64) error { - if w.txGasUsed+amount > w.txGasLimit { - return errors.New("gas limit exceeded") - } - if w.blockGasUsed+amount > w.blockGasLimit { - return core.ErrBlockOutOfGas - } - - w.txGasUsed += amount - return nil -} - -func (w *GasPluginMock) TxGasConsumed() uint64 { - return w.txGasUsed -} - -func (w *GasPluginMock) BlockGasConsumed() uint64 { - return w.blockGasUsed -} - -func (w *GasPluginMock) TxGasRemaining() uint64 { - return w.txGasLimit - w.txGasUsed -} - -func (w *GasPluginMock) TxGasUsed() uint64 { - return w.txGasUsed -} - -func (w *GasPluginMock) TxRefundGas(amount uint64) { - if w.txGasUsed < amount { - w.txGasUsed = 0 - } else { - w.txGasUsed -= amount - } -} - -func (w *GasPluginMock) SetTxGasLimit(amount uint64) error { - w.txGasLimit = amount - if w.txGasLimit < w.txGasUsed { - return errors.New("gas limit is below currently consumed") - } - return nil -} - -func (w *GasPluginMock) SetBlockGasLimit(amount uint64) { - w.blockGasLimit = amount -} - -func (w *GasPluginMock) BlockGasLimit() uint64 { - return w.blockGasLimit -} - -func (w *GasPluginMock) ConsumeGasToBlockLimit() error { - delta := w.blockGasLimit - w.blockGasUsed - if w.txGasUsed+delta > w.txGasLimit { - return errors.New("tx gas limit exceeded") - } - - w.txGasUsed += delta - w.blockGasUsed += delta - return nil -} diff --git a/eth/core/mock/host.go b/eth/core/mock/host.go index b6f5690f3f..bd22be85f5 100644 --- a/eth/core/mock/host.go +++ b/eth/core/mock/host.go @@ -25,12 +25,11 @@ import "pkg.berachain.dev/polaris/eth/core" //go:generate moq -out ./host.mock.go -pkg mock ../ PolarisHostChain func NewMockHostAndPlugins() ( - *PolarisHostChainMock, *BlockPluginMock, *ConfigurationPluginMock, *GasPluginMock, + *PolarisHostChainMock, *BlockPluginMock, *ConfigurationPluginMock, *HistoricalPluginMock, *PrecompilePluginMock, *StatePluginMock, ) { bp := NewBlockPluginMock() cp := NewConfigurationPluginMock() - gp := NewGasPluginMock() hp := NewHistoricalPluginMock() pp := NewPrecompilePluginMock() sp := NewStatePluginMock() @@ -41,9 +40,6 @@ func NewMockHostAndPlugins() ( GetConfigurationPluginFunc: func() core.ConfigurationPlugin { return cp }, - GetGasPluginFunc: func() core.GasPlugin { - return gp - }, GetHistoricalPluginFunc: func() core.HistoricalPlugin { return hp }, @@ -54,5 +50,5 @@ func NewMockHostAndPlugins() ( return sp }, } - return mockedPolarisHostChain, bp, cp, gp, hp, pp, sp + return mockedPolarisHostChain, bp, cp, hp, pp, sp } diff --git a/eth/core/mock/host.mock.go b/eth/core/mock/host.mock.go index e0067fcdbf..da08fdf97d 100644 --- a/eth/core/mock/host.mock.go +++ b/eth/core/mock/host.mock.go @@ -28,9 +28,6 @@ var _ core.PolarisHostChain = &PolarisHostChainMock{} // GetEnginePluginFunc: func() core.EnginePlugin { // panic("mock out the GetEnginePlugin method") // }, -// GetGasPluginFunc: func() core.GasPlugin { -// panic("mock out the GetGasPlugin method") -// }, // GetHistoricalPluginFunc: func() core.HistoricalPlugin { // panic("mock out the GetHistoricalPlugin method") // }, @@ -56,9 +53,6 @@ type PolarisHostChainMock struct { // GetEnginePluginFunc mocks the GetEnginePlugin method. GetEnginePluginFunc func() core.EnginePlugin - // GetGasPluginFunc mocks the GetGasPlugin method. - GetGasPluginFunc func() core.GasPlugin - // GetHistoricalPluginFunc mocks the GetHistoricalPlugin method. GetHistoricalPluginFunc func() core.HistoricalPlugin @@ -79,9 +73,6 @@ type PolarisHostChainMock struct { // GetEnginePlugin holds details about calls to the GetEnginePlugin method. GetEnginePlugin []struct { } - // GetGasPlugin holds details about calls to the GetGasPlugin method. - GetGasPlugin []struct { - } // GetHistoricalPlugin holds details about calls to the GetHistoricalPlugin method. GetHistoricalPlugin []struct { } @@ -95,7 +86,6 @@ type PolarisHostChainMock struct { lockGetBlockPlugin sync.RWMutex lockGetConfigurationPlugin sync.RWMutex lockGetEnginePlugin sync.RWMutex - lockGetGasPlugin sync.RWMutex lockGetHistoricalPlugin sync.RWMutex lockGetPrecompilePlugin sync.RWMutex lockGetStatePlugin sync.RWMutex @@ -182,33 +172,6 @@ func (mock *PolarisHostChainMock) GetEnginePluginCalls() []struct { return calls } -// GetGasPlugin calls GetGasPluginFunc. -func (mock *PolarisHostChainMock) GetGasPlugin() core.GasPlugin { - if mock.GetGasPluginFunc == nil { - panic("PolarisHostChainMock.GetGasPluginFunc: method is nil but PolarisHostChain.GetGasPlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetGasPlugin.Lock() - mock.calls.GetGasPlugin = append(mock.calls.GetGasPlugin, callInfo) - mock.lockGetGasPlugin.Unlock() - return mock.GetGasPluginFunc() -} - -// GetGasPluginCalls gets all the calls that were made to GetGasPlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetGasPluginCalls()) -func (mock *PolarisHostChainMock) GetGasPluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetGasPlugin.RLock() - calls = mock.calls.GetGasPlugin - mock.lockGetGasPlugin.RUnlock() - return calls -} - // GetHistoricalPlugin calls GetHistoricalPluginFunc. func (mock *PolarisHostChainMock) GetHistoricalPlugin() core.HistoricalPlugin { if mock.GetHistoricalPluginFunc == nil { diff --git a/eth/core/processor.go b/eth/core/processor.go deleted file mode 100644 index d6130a5501..0000000000 --- a/eth/core/processor.go +++ /dev/null @@ -1,162 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package core - -import ( - "context" - "sync" - - "github.com/ethereum/go-ethereum/trie" - - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core/state" - "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/core/vm" - errorslib "pkg.berachain.dev/polaris/lib/errors" -) - -// initialTxsCapacity is the initial capacity of the transactions and receipts slice. -const initialTxsCapacity = 256 - -// StateProcessor is responsible for processing blocks, transactions, and updating the state. -type StateProcessor struct { - // mtx is used to make sure we don't try to prepare a new block before finalizing the - // current block. - mtx sync.Mutex - - // cp provides configuration functions from the underlying chain the EVM is running on. - cp ConfigurationPlugin - // pp is responsible for keeping track of the stateful precompile containers that are - // available to the EVM and executing them. - pp PrecompilePlugin - - // signer is the signer used to verify transaction signatures. We need this in order to to - // extract the underlying message from a transaction object in `ProcessTransaction`. - signer types.Signer - - // statedb is the state database that is used to mange state during transactions. - statedb state.StateDB - // vmConfig is the configuration for the EVM. - vmConfig *vm.Config - - // We store information about the current block being processed so that we can access it - // during the processing of transactions. This allows us to utilize this information to - // build the `block` and return the canonical receipts in `Finalize`. - header *types.Header - sealhash common.Hash // hash of the block prior to being sealed (prior to Finalize called) - txs types.Transactions - receipts types.Receipts -} - -// NewStateProcessor creates a new state processor with the given host, statedb, vmConfig, and -// commit flag. -func NewStateProcessor( - cp ConfigurationPlugin, - pp PrecompilePlugin, - statedb state.StateDB, - vmConfig *vm.Config, -) *StateProcessor { - sp := &StateProcessor{ - mtx: sync.Mutex{}, - cp: cp, - pp: pp, - vmConfig: vmConfig, - statedb: statedb, - } - - return sp -} - -// ============================================================================== -// Block, Tx Lifecycle -// ============================================================================== - -// Prepare prepares the state processor for processing a block. -func (sp *StateProcessor) Prepare(header *types.Header) { - // We lock the state processor as a safety measure to ensure that Prepare is not called again - // before finalize. - sp.mtx.Lock() - - // Build a header object so we can track that status of the block as we process it. - sp.header = header - sp.sealhash = header.Hash() - sp.txs = make(types.Transactions, 0, initialTxsCapacity) - sp.receipts = make(types.Receipts, 0, initialTxsCapacity) - - // We must re-create the signer since we are processing a new block and the block number has - // increased. - chainConfig := sp.cp.ChainConfig() - sp.signer = types.MakeSigner(chainConfig, sp.header.Number, sp.header.Time) -} - -// ProcessTransaction applies a transaction to the current state of the blockchain. -func (sp *StateProcessor) ProcessTransaction( - _ context.Context, chainContext ChainContext, gasPool *GasPool, tx *types.Transaction, -) (*types.Receipt, error) { - // Set the transaction context in the state database. - // This clears the logs and sets the transaction info. - sp.statedb.SetTxContext(tx.Hash(), len(sp.txs)) - - // Inshallah we will be able to apply the transaction. - receipt, err := ApplyTransaction( - sp.cp.ChainConfig(), chainContext, &sp.header.Coinbase, gasPool, sp.statedb, - sp.header, tx, &sp.header.GasUsed, *sp.vmConfig) - if err != nil { - return nil, errorslib.Wrapf(err, "could not apply transaction [%s]", tx.Hash().Hex()) - } - - // Update the block information. - sp.txs = append(sp.txs, tx) - sp.receipts = append(sp.receipts, receipt) - - // Return the execution result to the caller. - return receipt, nil -} - -// Finalize finalizes the block in the state processor and returns the receipts and bloom filter to -// be "sealed". -func (sp *StateProcessor) Finalize( - _ context.Context, -) (*types.Block, types.Receipts, []*types.Log, error) { - // We unlock the state processor to ensure that the state is consistent. - defer sp.mtx.Unlock() - - var ( - // "FinalizeAndAssemble" the block with the txs and receipts (sets the TxHash, ReceiptHash, - // and Bloom). - block = types.NewBlock(sp.header, sp.txs, nil, sp.receipts, trie.NewStackTrie(nil)) - hash = block.Hash() - logs []*types.Log - ) - - // Update the block hash in all logs since it is now available and not when the receipt/log of - // individual transactions were created. - for _, receipt := range sp.receipts { - receipt.BlockHash = hash - for _, log := range receipt.Logs { - log.BlockHash = hash - } - logs = append(logs, receipt.Logs...) - } - - // We return a new block with the updated header and the receipts to the `blockchain`. - return block, sp.receipts, logs, nil -} diff --git a/eth/core/processor_test.go b/eth/core/processor_test.go deleted file mode 100644 index 5c50cda0af..0000000000 --- a/eth/core/processor_test.go +++ /dev/null @@ -1,188 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package core_test - -import ( - "context" - "math/big" - - "github.com/ethereum/go-ethereum/consensus" - - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/mock" - "pkg.berachain.dev/polaris/eth/core/state" - statemock "pkg.berachain.dev/polaris/eth/core/state/mock" - "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/core/vm" - "pkg.berachain.dev/polaris/eth/crypto" - "pkg.berachain.dev/polaris/eth/params" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var ( - dummyContract = common.HexToAddress("0x9fd0aA3B78277a1E717de9D3de434D4b812e5499") - key, _ = crypto.GenerateEthKey() - signer = types.LatestSignerForChainID(params.DefaultChainConfig.ChainID) - _ = key - _ = signer - blockGasLimit = 10000000 - dummyHeader = &types.Header{ - Number: big.NewInt(1), - BaseFee: big.NewInt(1), - GasLimit: uint64(blockGasLimit), - Difficulty: big.NewInt(0), - } - legacyTxData = &types.LegacyTx{ - Nonce: 0, - To: &dummyContract, - Gas: 1000000, - GasPrice: big.NewInt(1), - Data: []byte("abcdef"), - } -) - -var _ = Describe("StateProcessor", func() { - var ( - sdb state.StateDB - bp *mock.BlockPluginMock - cp *mock.ConfigurationPluginMock - pp *mock.PrecompilePluginMock - spm *statemock.PluginMock - sp *core.StateProcessor - ) - - BeforeEach(func() { - spm = statemock.NewEmptyStatePlugin() - spm.RegistryKeyFunc = func() string { - return "sp" - } - sdb = state.NewStateDB(spm, nil) - _, bp, cp, _, _, pp, _ = mock.NewMockHostAndPlugins() - bp.GetNewBlockMetadataFunc = func(n uint64) (common.Address, uint64) { - return common.BytesToAddress([]byte{2}), uint64(3) - } - pp.GetActiveFunc = func(params.Rules) []common.Address { - return []common.Address{} - } - pp.GetFunc = func(common.Address, *params.Rules) (vm.PrecompiledContract, bool) { - return nil, false - } - sp = core.NewStateProcessor(cp, pp, sdb, &vm.Config{}) - Expect(sp).ToNot(BeNil()) - sp.Prepare(dummyHeader) - }) - - Context("Empty block", func() { - It("should build a an empty block", func() { - block, receipts, logs, err := sp.Finalize(context.Background()) - Expect(err).ToNot(HaveOccurred()) - Expect(block).ToNot(BeNil()) - Expect(receipts).To(BeEmpty()) - Expect(logs).To(BeEmpty()) - }) - }) - - Context("Block with transactions", func() { - BeforeEach(func() { - _, _, _, err := sp.Finalize(context.Background()) - Expect(err).ToNot(HaveOccurred()) - sp.Prepare(dummyHeader) - }) - - It("should error on an unsigned transaction", func() { - gasPool := new(core.GasPool).AddGas(1000002) - tx := types.NewTx(legacyTxData) - receipt, err := sp.ProcessTransaction( - context.Background(), &mockChainContext{}, gasPool, tx) - Expect(err).To(HaveOccurred()) - Expect(receipt).To(BeNil()) - block, receipts, logs, err := sp.Finalize(context.Background()) - Expect(err).ToNot(HaveOccurred()) - Expect(block).ToNot(BeNil()) - Expect(receipts).To(BeEmpty()) - Expect(logs).To(BeEmpty()) - }) - - It("should not error on a signed transaction", func() { - signedTx := types.MustSignNewTx(key, signer, legacyTxData) - gasPool := new(core.GasPool).AddGas(1000002) - sender, _ := signer.Sender(signedTx) - val, _ := new(big.Int).SetString("10000000000000000000", 10) - sdb.AddBalance(sender, val) - result, err := sp.ProcessTransaction( - context.Background(), &mockChainContext{}, gasPool, signedTx) - Expect(err).ToNot(HaveOccurred()) - Expect(result).ToNot(BeNil()) - Expect(result.Status).To(Equal(uint64(1))) - Expect(result.GasUsed).ToNot(BeZero()) - block, receipts, logs, err := sp.Finalize(context.Background()) - Expect(err).ToNot(HaveOccurred()) - Expect(block).ToNot(BeNil()) - Expect(receipts).To(HaveLen(1)) - Expect(logs).To(BeEmpty()) - }) - - It("should handle", func() { - legacyTxData.To = nil - legacyTxData.Value = new(big.Int) - signedTx := types.MustSignNewTx(key, signer, legacyTxData) - sender, _ := signer.Sender(signedTx) - val, _ := new(big.Int).SetString("10000000000000000000", 10) - sdb.AddBalance(sender, val) - gasPool := new(core.GasPool).AddGas(1000002) - result, err := sp.ProcessTransaction( - context.Background(), &mockChainContext{}, gasPool, signedTx) - Expect(err).ToNot(HaveOccurred()) - Expect(result).ToNot(BeNil()) - Expect(result.Status).To(Equal(uint64(1))) - - // Now try calling the contract - legacyTxData.To = &dummyContract - signedTx = types.MustSignNewTx(key, signer, legacyTxData) - gasPool = new(core.GasPool).AddGas(1000002) - result, err = sp.ProcessTransaction( - context.Background(), &mockChainContext{}, gasPool, signedTx) - Expect(err).ToNot(HaveOccurred()) - Expect(result).ToNot(BeNil()) - Expect(result.Status).To(Equal(uint64(1))) - block, receipts, logs, err := sp.Finalize(context.Background()) - Expect(err).ToNot(HaveOccurred()) - Expect(block).ToNot(BeNil()) - Expect(receipts).To(HaveLen(2)) - Expect(logs).To(BeEmpty()) - }) - }) -}) - -type mockChainContext struct{} - -// Engine retrieves the chain's consensus engine. -func (mockChainContext) Engine() consensus.Engine { - return nil -} - -// GetHeader returns the header corresponding to the hash/number argument pair. -func (mockChainContext) GetHeader(common.Hash, uint64) *types.Header { - return nil -} diff --git a/eth/crypto/imported.go b/eth/crypto/imported.go index 703c7498a6..fb327ca948 100644 --- a/eth/crypto/imported.go +++ b/eth/crypto/imported.go @@ -22,7 +22,6 @@ package crypto import ( "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" ) var ( @@ -34,7 +33,6 @@ var ( DecompressPubkey = crypto.DecompressPubkey DigestLength = crypto.DigestLength EthSign = crypto.Sign - EthSecp256k1Sign = secp256k1.Sign LoadECDSA = crypto.LoadECDSA FromECDSA = crypto.FromECDSA GenerateEthKey = crypto.GenerateKey diff --git a/eth/go.mod b/eth/go.mod index ece59b39bc..07c60e0bf5 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,12 +3,12 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c require ( github.com/ethereum/go-ethereum v1.13.1 github.com/holiman/uint256 v1.2.3 - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/stretchr/testify v1.8.4 golang.org/x/text v0.13.0 diff --git a/eth/go.sum b/eth/go.sum index 13a55540e9..c0a4b38c2b 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -12,8 +12,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10 h1:LY4GputrzZf7U2yoDLgt7oQdJc5URRTzQooDnb6igjM= -github.com/berachain/polaris-geth v0.0.0-20231008031417-f6e231f3bf10/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= +github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= @@ -236,8 +236,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= diff --git a/eth/log/imported.go b/eth/log/imported.go index 2ab2b84a71..1a567bbfbc 100644 --- a/eth/log/imported.go +++ b/eth/log/imported.go @@ -58,4 +58,7 @@ var ( // FuncHandler is the function handler for overriding the logging method within // the go-ethereum codebase. FuncHandler = log.FuncHandler + + // Warn is the warning log level. + Warn = log.Warn ) diff --git a/eth/miner/miner.go b/eth/miner/miner.go deleted file mode 100644 index c55287a128..0000000000 --- a/eth/miner/miner.go +++ /dev/null @@ -1,261 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package miner - -import ( - "context" - "math/big" - - "github.com/ethereum/go-ethereum/consensus/misc/eip1559" - "github.com/ethereum/go-ethereum/consensus/misc/eip4844" - "github.com/ethereum/go-ethereum/core/txpool" - - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/precompile" - "pkg.berachain.dev/polaris/eth/core/state" - "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/core/vm" - "pkg.berachain.dev/polaris/eth/log" - errorslib "pkg.berachain.dev/polaris/lib/errors" -) - -// Backend wraps all methods required for mining. Only full node is capable -// to offer all the functions here. -type Backend interface { - // Blockchain returns the blockchain instance. - Blockchain() core.Blockchain - TxPool() *txpool.TxPool - Host() core.PolarisHostChain -} - -// Miner defines the interface for a Polaris miner. -type Miner interface { - // Prepare prepares the miner for a new block. This method is called before the first tx in - // the block. - Prepare(context.Context, uint64) *types.Header - - // ProcessTransaction processes the given transaction and returns the receipt after applying - // the state transition. This method is called for each tx in the block. - ProcessTransaction(context.Context, *types.Transaction) (*types.Receipt, error) - - // Finalize is called after the last tx in the block. - Finalize(context.Context) error - - // TODO: deprecate - NextBaseFee() *big.Int -} - -// miner implements the Miner interface. -// TODO: RENAME TO STATE PROCESSOR OR DEPRECATE. -type miner struct { - backend Backend - chain core.Blockchain - processor *core.StateProcessor - txPool *txpool.TxPool - bp core.BlockPlugin - cp core.ConfigurationPlugin - gp core.GasPlugin - pp core.PrecompilePlugin - sp core.StatePlugin - logger log.Logger - vmConfig vm.Config - statedb state.PolarStateDB - - // TODO: historical plugin has no purpose here in the miner. - // Should be handled async via channel - hp core.HistoricalPlugin - - // workspace - pendingHeader *types.Header - gasPool *core.GasPool -} - -// NewMiner creates a new Miner instance. -func New(backend Backend) Miner { - chain := backend.Blockchain() - host := backend.Host() - - m := &miner{ - bp: host.GetBlockPlugin(), - cp: host.GetConfigurationPlugin(), - hp: host.GetHistoricalPlugin(), - gp: host.GetGasPlugin(), - sp: host.GetStatePlugin(), - txPool: backend.TxPool(), - chain: chain, - backend: backend, - logger: log.Root(), // todo: fix. - } - - m.pp = host.GetPrecompilePlugin() - if m.pp == nil { - m.pp = precompile.NewDefaultPlugin() - } - - return m -} - -// TODO: deprecate and properly recalculate in prepare proposal, this is fine for now though. -func (m *miner) NextBaseFee() *big.Int { - if m.pendingHeader == nil { - return big.NewInt(0) - } - return eip1559.CalcBaseFee(m.cp.ChainConfig(), m.pendingHeader) -} - -// Prepare prepares the blockchain for processing a new block at the given height. -func (m *miner) Prepare(ctx context.Context, number uint64) *types.Header { - // Prepare the State, Block, Configuration, Gas, and Historical plugins for the block. - m.sp.Prepare(ctx) - m.bp.Prepare(ctx) - m.cp.Prepare(ctx) - m.gp.Prepare(ctx) - - // TODO: this shouldnt be in the miner. - if m.hp != nil { - m.hp.Prepare(ctx) - } - - coinbase, timestamp := m.bp.GetNewBlockMetadata(number) - chainConfig := m.cp.ChainConfig() - - // Build the new block m.pendingHeader. - parent := m.chain.CurrentFinalBlock() - if number >= 1 && parent == nil { - parent = m.chain.GetHeaderByNumber(number - 1) - } - - // Polaris does not set Ethereum state root (Root), mix hash (MixDigest), extra data (Extra), - // and block nonce (Nonce) on the new m.pendingHeader. - m.pendingHeader = &types.Header{ - // Used in Polaris. - ParentHash: parent.Hash(), - Coinbase: coinbase, - Number: new(big.Int).SetUint64(number), - GasLimit: m.gp.BlockGasLimit(), - Time: timestamp, - Difficulty: new(big.Int), - } - - // TODO: Settable in PrepareProposal. - // Set the extra field. - if /*len(w.extra) != 0*/ true { - m.pendingHeader.Extra = nil - } - - // Set the randomness field from the beacon chain if it's available. - // TODO: Settable in PrepareProposal. - if /*genParams.random != (common.Hash{})*/ true { - // m.pendingHeader.MixDigest = genParams.random - m.pendingHeader.MixDigest = common.Hash{} - } - - // Apply EIP-1559. - // TODO: Move to PrepareProposal. - if chainConfig.IsLondon(m.pendingHeader.Number) { - m.pendingHeader.BaseFee = eip1559.CalcBaseFee(chainConfig, parent) - // On switchover. - // TODO: implement. - // if !chainConfig.IsLondon(parent.Number) { - // parentGasLimit := parent.GasLimit * chainConfig.ElasticityMultiplier() - // m.pendingHeader.GasLimit = core.CalcGasLimit(parentGasLimit, bc.gp.BlockGasLimit()) - // } - } - - // Apply EIP-4844, EIP-4788. - // TODO: Move to PrepareProposal. - if chainConfig.IsCancun(m.pendingHeader.Number, m.pendingHeader.Time) { - var excessBlobGas uint64 - if chainConfig.IsCancun(parent.Number, parent.Time) { - excessBlobGas = eip4844.CalcExcessBlobGas(*parent.ExcessBlobGas, *parent.BlobGasUsed) - } else { - // For the first post-fork block, both parent.data_gas_used and - // parent.excess_data_gas are evaluated as 0 - excessBlobGas = eip4844.CalcExcessBlobGas(0, 0) - } - m.pendingHeader.BlobGasUsed = new(uint64) - m.pendingHeader.ExcessBlobGas = &excessBlobGas - m.pendingHeader.ParentBeaconRoot = &common.Hash{} - } - - m.logger.Info("preparing evm block", "seal_hash", m.pendingHeader.Hash()) - - // Create new statedb and processor every block to clear out journals and stuff. - // DEPRECATED VIA 1 Block 1 Txn anyways, but works for now. - m.statedb = state.NewStateDB(m.sp, m.pp) - m.processor = core.NewStateProcessor( - m.cp, m.pp, m.statedb, &m.vmConfig, - ) - - m.processor.Prepare( - m.pendingHeader, - ) - return m.pendingHeader -} - -// ProcessTransaction processes the given transaction and returns the receipt after -// applying the state transition. This method is called for each tx in the block. -func (m *miner) ProcessTransaction( - ctx context.Context, tx *types.Transaction, -) (*types.Receipt, error) { - m.logger.Debug("processing evm transaction", "tx_hash", tx.Hash()) - - // Reset the Gas and State plugins for the tx. - m.gp.Reset(ctx) // TODO: may not need this. - m.sp.Reset(ctx) - - // We set the gasPool = gasLimit - gasUsed. - m.gasPool = new(core.GasPool).AddGas(m.pendingHeader.GasLimit - m.gp.BlockGasConsumed()) - - // Header is out of sync with block plugin. - // TODO: the miner will handle this systemically when properly done is PrepareProposal. - if m.gp.BlockGasConsumed() != m.pendingHeader.GasUsed { - panic("gas consumed mismatch") - } - - receipt, err := m.processor.ProcessTransaction(ctx, m.chain, m.gasPool, tx) - if err != nil { - return nil, errorslib.Wrapf( - err, "could not process transaction [%s]", tx.Hash().Hex(), - ) - } - - // Consume the gas used by the state transition. In both the out of block gas as well as out of - // gas on the plugin cases, the line below will consume the remaining gas for the block and - // transaction respectively. - if err = m.gp.ConsumeTxGas(receipt.GasUsed); err != nil { - return nil, errorslib.Wrapf( - err, "could not consume gas used [%s] %d", tx.Hash().Hex(), receipt.GasUsed, - ) - } - return receipt, nil -} - -// Finalize is called after the last tx in the block. -func (m *miner) Finalize(ctx context.Context) error { - block, receipts, logs, err := m.processor.Finalize(ctx) - if err != nil { - return err - } - - return m.chain.InsertBlock(block, receipts, logs) -} diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go new file mode 100644 index 0000000000..3bc43c5279 --- /dev/null +++ b/eth/polar/api_backend.go @@ -0,0 +1,602 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package polar + +import ( + "context" + "errors" + "math/big" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/rpc" + + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/common/hexutil" + "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/core/state" + "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/core/vm" + "pkg.berachain.dev/polaris/eth/log" + "pkg.berachain.dev/polaris/eth/params" + polarapi "pkg.berachain.dev/polaris/eth/polar/api" + "pkg.berachain.dev/polaris/eth/version" +) + +// Backend represents the backend object for a Polaris chain. It extends the standard +// go-ethereum backend object. +type Backend interface { + polarapi.EthBackend + polarapi.NetBackend + polarapi.Web3Backend +} + +// backend represents the backend for the JSON-RPC service. +type backend struct { + polar *Polaris + cfg *Config + gpo *gasprice.Oracle + logger log.Logger +} + +// ============================================================================== +// Constructor +// ============================================================================== + +// NewBackend returns a new `Backend` object. +func NewBackend( + polar *Polaris, + cfg *Config, +) Backend { + b := &backend{ + + polar: polar, + cfg: cfg, + logger: log.Root(), + } + + if cfg.GPO.Default == nil { + panic("cfg.GPO.Default is nil") + } + b.gpo = gasprice.NewOracle(b, cfg.GPO) + return b +} + +// ============================================================================== +// General Ethereum API +// ============================================================================== + +// ChainConfig returns the chain configuration. +func (b *backend) ChainConfig() *params.ChainConfig { + b.logger.Debug("called eth.rpc.backend.ChainConfig") + return b.polar.blockchain.Config() +} + +// CurrentHeader returns the current header from the local chains. +func (b *backend) CurrentHeader() *types.Header { + return b.polar.blockchain.CurrentHeader() +} + +// CurrentBlock returns the current block from the local chain. +func (b *backend) CurrentBlock() *types.Header { + return b.polar.blockchain.CurrentHeader() +} + +// SuggestGasTipCap returns the recommended gas tip cap for a new transaction. +func (b *backend) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + defer b.logger.Debug("called eth.rpc.backend.SuggestGasTipCap", "suggested_tip_cap") + return b.gpo.SuggestTipCap(ctx) +} + +// FeeHistory returns the base fee and gas used history of the last N blocks. +func (b *backend) FeeHistory( + ctx context.Context, + blockCount uint64, + lastBlock rpc.BlockNumber, + rewardPercentiles []float64, +) (*big.Int, [][]*big.Int, []*big.Int, []float64, error) { + return b.gpo.FeeHistory(ctx, blockCount, lastBlock, rewardPercentiles) +} + +// ChainDb is unused in Polaris. +func (b *backend) ChainDb() ethdb.Database { //nolint:stylecheck // conforms to interface. + return ethdb.Database(nil) +} + +// AccountManager is unused in Polaris. +func (b *backend) AccountManager() *accounts.Manager { + return &accounts.Manager{} +} + +// ExtRPCEnabled returns whether the RPC endpoints are exposed over external +// interfaces. +func (b *backend) ExtRPCEnabled() bool { + return b.polar.stack.ExtRPCEnabled() +} + +// RPCGasCap returns the global gas cap for eth_call over rpc: this is +// if the user doesn't specify a cap. +func (b *backend) RPCGasCap() uint64 { + return b.cfg.RPCGasCap +} + +// RPCEVMTimeout returns the global timeout for eth_call over rpc. +func (b *backend) RPCEVMTimeout() time.Duration { + return b.cfg.RPCEVMTimeout +} + +// RPCTxFeeCap returns the global gas price cap for transactions over rpc. +func (b *backend) RPCTxFeeCap() float64 { + return b.cfg.RPCTxFeeCap +} + +// UnprotectedAllowed returns whether unprotected transactions are alloweds. +// We will consider implementing these later, But our opinion is that +// there is no reason in 2023 not to use these. +func (b *backend) UnprotectedAllowed() bool { + return false +} + +// ============================================================================== +// Blockchain API +// ============================================================================== + +// SetHead is used for state sync on ethereum, we leave state sync up to the host +// chain and thus it is not implemented in Polaris. +func (b *backend) SetHead(_ uint64) { + panic("not implemented") +} + +func (b *backend) HeaderByNumber( + _ context.Context, + number rpc.BlockNumber, +) (*types.Header, error) { + switch number { + case rpc.PendingBlockNumber: + // TODO: handle "miner" stuff, Pending block is only known by the miner + // block := b.eth.miner.PendingBlock() + // TODO: this may be hiding a larger issue with the timing of the NewHead channel stuff. + // Investigate and hopefully remove this GTE. + header := b.polar.blockchain.CurrentHeader() + return header, nil + case rpc.LatestBlockNumber: + return b.polar.blockchain.CurrentHeader(), nil + case rpc.FinalizedBlockNumber: + block := b.polar.blockchain.CurrentFinalBlock() + if block != nil { + return block, nil + } + return nil, errors.New("finalized block not found") + case rpc.SafeBlockNumber: + block := b.polar.blockchain.CurrentSafeBlock() + if block != nil { + return block, nil + } + return nil, errors.New("safe block not found") + case rpc.EarliestBlockNumber: + return b.polar.blockchain.GetHeaderByNumber(0), nil + default: + return b.polar.blockchain.GetHeaderByNumber(uint64(number)), nil + } +} + +// HeaderByNumberOrHash returns the header identified by `number` or `hash`. +func (b *backend) HeaderByNumberOrHash(ctx context.Context, + blockNrOrHash rpc.BlockNumberOrHash, +) (*types.Header, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.HeaderByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + return b.HeaderByHash(ctx, hash) + } + return nil, errors.New("invalid arguments; neither block nor hash specified") +} + +// HeaderByHash returns the block header with the given hash. +func (b *backend) HeaderByHash(_ context.Context, hash common.Hash) (*types.Header, error) { + return b.polar.blockchain.GetHeaderByHash(hash), nil +} + +// BlockByNumber returns the block with the given `number`. +func (b *backend) BlockByNumber(_ context.Context, number rpc.BlockNumber) (*types.Block, error) { + // Pending block is only known by the miner + switch number { + case rpc.PendingBlockNumber: + block := b.polar.miner.PendingBlock() + return block, nil + // Otherwise resolve and return the block + case rpc.LatestBlockNumber: + header := b.polar.blockchain.CurrentBlock() + return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil + + case rpc.FinalizedBlockNumber: + header := b.polar.blockchain.CurrentFinalBlock() + return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil + + case rpc.SafeBlockNumber: + header := b.polar.blockchain.CurrentSafeBlock() + return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil + + case rpc.EarliestBlockNumber: + return b.polar.blockchain.GetBlockByNumber(0), nil + } + // safe to assume number > 0 + return b.polar.blockchain.GetBlockByNumber(uint64(number)), nil +} + +// BlockByHash returns the block with the given `hash`. +func (b *backend) BlockByHash(_ context.Context, hash common.Hash) (*types.Block, error) { + block := b.polar.blockchain.GetBlockByHash(hash) + b.logger.Debug("BlockByHash", "hash", hash, "block", block) + if block == nil { + b.logger.Error("eth.rpc.backend.BlockByHash", "hash", hash, "nil", true) + return nil, nil //nolint:nilnil // to match geth. + } + b.logger.Debug("called eth.rpc.backend.BlockByHash", "header", block.Header(), + "num_txs", len(block.Transactions())) + return block, nil +} + +func (b *backend) BlockByNumberOrHash( + ctx context.Context, + blockNrOrHash rpc.BlockNumberOrHash, +) (*types.Block, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.BlockByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + block := b.polar.blockchain.GetBlockByHash(hash) + if block == nil { + return nil, core.ErrBlockNotFound + } + // if blockNrOrHash.RequireCanonical && + // b.polar.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + // return nil, errors.New("hash is not currently canonical") + // } + // block := b.polar.blockchain.GetBlock(hash, header.Number.Uint64()) + // if block == nil { + // return nil, errors.New("header found, but block body is missing") + // } + return block, nil + } + return nil, errors.New("invalid arguments; neither block nor hash specified") +} + +func (b *backend) StateAndHeaderByNumber( + ctx context.Context, + number rpc.BlockNumber, +) (state.StateDB, *types.Header, error) { + // Pending state is only known by the miner + if number == rpc.PendingBlockNumber { + block, state := b.polar.miner.Pending() + return state, block.Header(), nil + } + // Otherwise resolve the block number and return its state + header, err := b.HeaderByNumber(ctx, number) + if err != nil { + return nil, nil, err + } + if header == nil { + // to match Geth + return nil, nil, core.ErrBlockNotFound + } + b.logger.Debug("called eth.rpc.backend.StateAndHeaderByNumber", "header", header) + + // StateAtBlockNumber returns nil if the number is not found + state, err := b.polar.blockchain.StateAtBlockNumber(header.Number.Uint64()) + if err != nil { + b.logger.Error("eth.rpc.backend.StateAndHeaderByNumber", "number", number, "err", err) + return nil, nil, err + } + + return state, header, nil +} + +func (b *backend) StateAndHeaderByNumberOrHash( + ctx context.Context, + blockNrOrHash rpc.BlockNumberOrHash, +) (state.StateDB, *types.Header, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.StateAndHeaderByNumber(ctx, blockNr) + } + + if hash, ok := blockNrOrHash.Hash(); ok { + header, err := b.HeaderByHash(ctx, hash) + if err != nil { + return nil, nil, err + } + if header == nil { + // to match Geth + return nil, nil, core.ErrBlockNotFound + } + // if blockNrOrHash.RequireCanonical && + // b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + // return nil, nil, errors.New("hash is not currently canonical") + // } + return b.StateAndHeaderByNumber(ctx, rpc.BlockNumber(header.Number.Int64())) + } + return nil, nil, errors.New("invalid arguments; neither block nor hash specified") +} + +// GetTransaction returns the transaction identified by `txHash`, along with +// information about the transaction. +func (b *backend) GetTransaction( + _ context.Context, + txHash common.Hash, +) (*types.Transaction, common.Hash, uint64, uint64, error) { + b.logger.Debug("called eth.rpc.backend.GetTransaction", "tx_hash", txHash) + txLookup := b.polar.blockchain.GetTransactionLookup(txHash) + if txLookup == nil { + return nil, common.Hash{}, 0, 0, nil + } + return txLookup.Tx, txLookup.BlockHash, txLookup.BlockNum, txLookup.TxIndex, nil +} + +// PendingBlockAndReceipts returns the pending block (equivalent to current block in Polaris) +// and associated receipts. +func (b *backend) PendingBlockAndReceipts() (*types.Block, types.Receipts) { + block, receipts := b.polar.miner.PendingBlockAndReceipts() + // If the block is non-existent, return nil. + // This is to maintain parity with the behavior of the geth backend. + if block == nil { + b.logger.Debug("called eth.rpc.backend.PendingBlockAndReceipts is nil", "block", block) + return nil, nil + } + b.logger.Debug("called eth.rpc.backend.PendingBlockAndReceipts", "block", block, + "num_receipts", len(receipts)) + return block, receipts +} + +// GetReceipts returns the receipts for the given block hash. +func (b *backend) GetReceipts(_ context.Context, hash common.Hash) (types.Receipts, error) { + return b.polar.blockchain.GetReceiptsByHash(hash), nil +} + +// GetLogs returns the logs for the given block hash or number. +func (b *backend) GetLogs( + _ context.Context, blockHash common.Hash, number uint64, +) ([][]*types.Log, error) { + receipts := b.polar.blockchain.GetReceiptsByHash(blockHash) + logs := make([][]*types.Log, len(receipts)) + for i, receipt := range receipts { + logs[i] = receipt.Logs + } + b.logger.Debug("called eth.rpc.backend.GetBody", "block_hash", blockHash, "number", number) + return logs, nil +} + +// GetTd returns the total difficulty of a block in the canonical chain. +// This is hardcoded to 69, as it is only applicable in a PoW chain. +func (b *backend) GetTd(_ context.Context, hash common.Hash) *big.Int { + if header := b.polar.blockchain.GetHeaderByHash(hash); header != nil { + return b.polar.blockchain.GetTd(hash, header.Number.Uint64()) + } + return nil +} + +// GetEVM returns a new EVM to be used for simulating a transaction, estimating gas etc. +func (b *backend) GetEVM(_ context.Context, msg *core.Message, state state.StateDB, + header *types.Header, vmConfig *vm.Config, blockCtx *vm.BlockContext, +) (*vm.EVM, func() error) { + if vmConfig == nil { + vmConfig = b.polar.blockchain.GetVMConfig() + } + txContext := core.NewEVMTxContext(msg) + var context vm.BlockContext + if blockCtx != nil { + context = *blockCtx + } else { + // TODO: we are hardcoding author to coinbase, this may be incorrect. + // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. + context = core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) + } + return vm.NewEVM(context, txContext, state, b.polar.blockchain.Config(), + *vmConfig), state.Error +} + +// GetBlockContext returns a new block context to be used by a EVM. +func (b *backend) GetBlockContext( + _ context.Context, header *types.Header, +) *vm.BlockContext { + // TODO: we are hardcoding author to coinbase, this may be incorrect. + // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. + blockContext := core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) + return &blockContext +} + +func (b *backend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + b.logger.Debug("called eth.rpc.backend.SubscribeChainEvent", "ch", ch) + return b.polar.blockchain.SubscribeChainEvent(ch) +} + +func (b *backend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + b.logger.Debug("called eth.rpc.backend.SubscribeChainHeadEvent", "ch", ch) + return b.polar.blockchain.SubscribeChainHeadEvent(ch) +} + +func (b *backend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { + b.logger.Debug("called eth.rpc.backend.SubscribeChainSideEvent", "ch", ch) + return b.polar.blockchain.SubscribeChainSideEvent(ch) +} + +// ============================================================================== +// Transaction Pool API +// ============================================================================== + +func (b *backend) SendTx(_ context.Context, signedTx *types.Transaction) error { + return b.polar.txPool.Add([]*types.Transaction{signedTx}, true, false)[0] +} + +func (b *backend) GetPoolTransactions() (types.Transactions, error) { + b.logger.Debug("called eth.rpc.backend.GetPoolTransactions") + pending := b.polar.txPool.Pending(false) + var txs types.Transactions + for _, batch := range pending { + for _, lazy := range batch { + if tx := lazy.Resolve(); tx != nil { + txs = append(txs, tx) + } + } + } + return txs, nil +} + +func (b *backend) GetPoolTransaction(hash common.Hash) *types.Transaction { + b.logger.Debug("called eth.rpc.backend.GetPoolTransaction", "tx_hash", hash) + return b.polar.txPool.Get(hash) +} + +func (b *backend) GetPoolNonce(_ context.Context, addr common.Address) (uint64, error) { + nonce := b.polar.txPool.Nonce(addr) + b.logger.Debug("called eth.rpc.backend.GetPoolNonce", "addr", addr, "nonce", nonce) + return nonce, nil +} + +func (b *backend) Stats() (int, int) { + pending, queued := b.polar.txPool.Stats() + b.logger.Debug("called eth.rpc.backend.Stats", "pending", pending, "queued", queued) + return pending, queued +} + +func (b *backend) TxPoolContent() ( + map[common.Address][]*types.Transaction, + map[common.Address][]*types.Transaction, +) { + pending, queued := b.polar.txPool.Content() + b.logger.Debug( + "called eth.rpc.backend.TxPoolContent", "pending", len(pending), "queued", len(queued)) + return pending, queued +} + +func (b *backend) TxPoolContentFrom(addr common.Address) ( + []*types.Transaction, + []*types.Transaction, +) { + pending, queued := b.polar.txPool.ContentFrom(addr) + b.logger.Debug("called eth.rpc.backend.TxPoolContentFrom", + "addr", addr, "pending", len(pending), "queued", len(queued)) + return pending, queued +} + +func (b *backend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { + return b.polar.txPool.SubscribeNewTxsEvent(ch) +} + +func (b *backend) Engine() consensus.Engine { + return b.polar.blockchain.Engine() +} + +// GetBody retrieves the block body corresponding to block by has or number.. +func (b *backend) GetBody( + ctx context.Context, + hash common.Hash, + number rpc.BlockNumber, +) (*types.Body, error) { + if number < 0 || hash == (common.Hash{}) { + b.logger.Error("eth.rpc.backend.GetBody", "number", number, "hash", hash) + return nil, errors.New("invalid arguments; expect hash and no special block numbers") + } + block, err := b.BlockByNumberOrHash( + ctx, rpc.BlockNumberOrHash{BlockNumber: &number, BlockHash: &hash}) + if block == nil || err != nil { + b.logger.Error("eth.rpc.backend.GetBody", "number", number, "hash", hash, "err", err) + return nil, nil //nolint:nilnil // to match geth. + } + b.logger.Debug("called eth.rpc.backend.GetBody", "hash", hash, "number", number) + return block.Body(), nil +} + +func (b *backend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + b.logger.Debug("called eth.rpc.backend.SubscribeRemovedLogsEvent", "ch", ch) + return b.polar.blockchain.SubscribeRemovedLogsEvent(ch) +} + +func (b *backend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + b.logger.Debug("called eth.rpc.backend.SubscribeLogsEvent", "ch", ch) + return b.polar.blockchain.SubscribeLogsEvent(ch) +} + +func (b *backend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { + return b.polar.miner.SubscribePendingLogs(ch) +} + +func (b *backend) BloomStatus() (uint64, uint64) { + // TODO: Implement your code here + return 0, 0 +} + +func (b *backend) ServiceFilter(_ context.Context, _ *bloombits.MatcherSession) { + // TODO: Implement your code here +} + +// Version returns the current chain protocol version. +// For education: +// https://medium.com/@pedrouid/chainid-vs-networkid-how-do-they-differ-on-ethereum-eec2ed41635b +func (b *backend) Version() string { + chainID := b.ChainConfig().ChainID + if chainID == nil { + b.logger.Error("eth.rpc.backend.Version", "ChainID is nil") + return "-1" + } + return chainID.String() +} + +// SyncProgress returns the current progress of the sync algorithm. +func (b *backend) SyncProgress() ethereum.SyncProgress { + sp, err := b.polar.enginePlugin.SyncProgress(context.Background()) + if err != nil { + b.logger.Error("eth.rpc.backend.SyncProgress", "err", err) + return ethereum.SyncProgress{} + } + return sp +} + +// Listening returns whether the node is listening for connections. +func (b *backend) Listening() bool { + listening, err := b.polar.enginePlugin.Listening(context.Background()) + if err != nil { + b.logger.Error("eth.rpc.backend.Listening", "err", err) + return false + } + return listening +} + +// PeerCount returns the number of connected peers. +func (b *backend) PeerCount() hexutil.Uint { + peerCount, err := b.polar.enginePlugin.PeerCount(context.Background()) + if err != nil { + b.logger.Error("eth.rpc.backend.PeerCount", "err", err) + return hexutil.Uint(0) + } + return hexutil.Uint(peerCount) +} + +// ClientVersion returns the current client version. +func (b *backend) ClientVersion() string { + return version.ClientName("polaris-geth") +} diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 07f6476cb4..fc18724ad8 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -21,584 +21,241 @@ package polar import ( - "context" - "errors" "math/big" + "net/http" "time" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/consensus" - "github.com/ethereum/go-ethereum/core/bloombits" - "github.com/ethereum/go-ethereum/eth/gasprice" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/consensus/beacon" + "github.com/ethereum/go-ethereum/core/txpool" + "github.com/ethereum/go-ethereum/core/txpool/legacypool" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/node" - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/eth/common/hexutil" + "pkg.berachain.dev/polaris/eth/consensus" "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/core/vm" "pkg.berachain.dev/polaris/eth/log" - "pkg.berachain.dev/polaris/eth/params" polarapi "pkg.berachain.dev/polaris/eth/polar/api" - "pkg.berachain.dev/polaris/eth/version" + "pkg.berachain.dev/polaris/eth/rpc" ) -// Backend represents the backend object for a Polaris chain. It extends the standard -// go-ethereum backend object. -type Backend interface { - polarapi.EthBackend - polarapi.NetBackend - polarapi.Web3Backend -} - -// backend represents the backend for the JSON-RPC service. -type backend struct { - extRPCEnabled bool - polar *Polaris - cfg *Config - gpo *gasprice.Oracle - logger log.Logger -} - -// ============================================================================== -// Constructor -// ============================================================================== - -// NewBackend returns a new `Backend` object. -func NewBackend( - polar *Polaris, - extRPCEnabled bool, - cfg *Config, -) Backend { - b := &backend{ - extRPCEnabled: extRPCEnabled, - polar: polar, - cfg: cfg, - logger: log.Root(), +// TODO: break out the node into a separate package and then fully use the +// abstracted away networking stack, by extension we will need to improve the registration +// architecture. + +var defaultEthConfig = ethconfig.Config{ + SyncMode: 0, + FilterLogCacheSize: 0, +} + +// NetworkingStack defines methods that allow a Polaris chain to build and expose JSON-RPC API. +type NetworkingStack interface { + // IsExtRPCEnabled returns true if the networking stack is configured to expose JSON-RPC API. + ExtRPCEnabled() bool + + // RegisterHandler manually registers a new handler into the networking stack. + RegisterHandler(string, string, http.Handler) + + // RegisterAPIs registers JSON-RPC handlers for the networking stack. + RegisterAPIs([]rpc.API) + + // RegisterLifecycles registers objects to have their lifecycle manged by the stack. + RegisterLifecycle(node.Lifecycle) + + // Start starts the networking stack. + Start() error + + // Close stops the networking stack + Close() error +} + +// Polaris is the only object that an implementing chain should use. +type Polaris struct { + config *Config + // NetworkingStack represents the networking stack responsible for exposes the JSON-RPC + // APIs. Although possible, it does not handle p2p networking like its sibling in geth + // would. + stack NetworkingStack + + // core pieces of the polaris stack + host core.PolarisHostChain + blockchain core.Blockchain + txPool *txpool.TxPool + miner *miner.Miner + + // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs + // and the core pieces. + backend Backend + + // engine represents the consensus engine for the backend. + enginePlugin core.EnginePlugin + engine consensus.Engine + + // filterSystem is the filter system that is used by the filter API. + // TODO: relocate + filterSystem *filters.FilterSystem +} + +func NewWithNetworkingStack( + config *Config, + host core.PolarisHostChain, + stack NetworkingStack, + logHandler log.Handler, +) *Polaris { + engine := beacon.New(&consensus.DummyEthOne{}) + pl := &Polaris{ + config: config, + blockchain: core.NewChain(host, engine), + stack: stack, + host: host, + enginePlugin: host.GetEnginePlugin(), + engine: engine, } - - if cfg.GPO.Default == nil { - panic("cfg.GPO.Default is nil") + // When creating a Polaris EVM, we allow the implementing chain + // to specify their own log handler. If logHandler is nil then we + // we use the default geth log handler. + // When creating a Polaris EVM, we allow the implementing chain + // to specify their own log handler. If logHandler is nil then we + // we use the default geth log handler. + if logHandler != nil { + // Root is a global in geth that is used by the evm to emit logs. + log.Root().SetHandler(logHandler) } - b.gpo = gasprice.NewOracle(b, cfg.GPO) - return b -} - -// ============================================================================== -// General Ethereum API -// ============================================================================== - -// ChainConfig returns the chain configuration. -func (b *backend) ChainConfig() *params.ChainConfig { - b.logger.Debug("called eth.rpc.backend.ChainConfig") - return b.polar.blockchain.Config() -} - -// CurrentHeader returns the current header from the local chains. -func (b *backend) CurrentHeader() *types.Header { - return b.polar.blockchain.CurrentHeader() -} - -// CurrentBlock returns the current block from the local chain. -func (b *backend) CurrentBlock() *types.Header { - return b.polar.blockchain.CurrentHeader() -} - -// SuggestGasTipCap returns the recommended gas tip cap for a new transaction. -func (b *backend) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - defer b.logger.Debug("called eth.rpc.backend.SuggestGasTipCap", "suggested_tip_cap") - return b.gpo.SuggestTipCap(ctx) -} -// FeeHistory returns the base fee and gas used history of the last N blocks. -func (b *backend) FeeHistory( - ctx context.Context, - blockCount uint64, - lastBlock rpc.BlockNumber, - rewardPercentiles []float64, -) (*big.Int, [][]*big.Int, []*big.Int, []float64, error) { - return b.gpo.FeeHistory(ctx, blockCount, lastBlock, rewardPercentiles) -} - -// ChainDb is unused in Polaris. -func (b *backend) ChainDb() ethdb.Database { //nolint:stylecheck // conforms to interface. - return ethdb.Database(nil) -} - -// AccountManager is unused in Polaris. -func (b *backend) AccountManager() *accounts.Manager { - return &accounts.Manager{} -} - -// ExtRPCEnabled returns whether the RPC endpoints are exposed over external -// interfaces. -func (b *backend) ExtRPCEnabled() bool { - return b.extRPCEnabled -} + pl.backend = NewBackend(pl, pl.config) -// RPCGasCap returns the global gas cap for eth_call over rpc: this is -// if the user doesn't specify a cap. -func (b *backend) RPCGasCap() uint64 { - return b.cfg.RPCGasCap + return pl } -// RPCEVMTimeout returns the global timeout for eth_call over rpc. -func (b *backend) RPCEVMTimeout() time.Duration { - return b.cfg.RPCEVMTimeout -} - -// RPCTxFeeCap returns the global gas price cap for transactions over rpc. -func (b *backend) RPCTxFeeCap() float64 { - return b.cfg.RPCTxFeeCap -} - -// UnprotectedAllowed returns whether unprotected transactions are alloweds. -// We will consider implementing these later, But our opinion is that -// there is no reason in 2023 not to use these. -func (b *backend) UnprotectedAllowed() bool { - return false -} - -// ============================================================================== -// Blockchain API -// ============================================================================== - -// SetHead is used for state sync on ethereum, we leave state sync up to the host -// chain and thus it is not implemented in Polaris. -func (b *backend) SetHead(_ uint64) { - panic("not implemented") -} +// Init initializes the Polaris struct. +func (pl *Polaris) Init() error { + var err error + // For now, we only have a legacy pool, we will implement blob pool later. + legacyPool := legacypool.New( + pl.config.LegacyTxPool, pl.Blockchain(), + ) -func (b *backend) HeaderByNumber( - _ context.Context, - number rpc.BlockNumber, -) (*types.Header, error) { - switch number { - case rpc.PendingBlockNumber: - // TODO: handle "miner" stuff, Pending block is only known by the miner - // block := b.eth.miner.PendingBlock() - // TODO: this may be hiding a larger issue with the timing of the NewHead channel stuff. - // Investigate and hopefully remove this GTE. - header := b.polar.blockchain.CurrentHeader() - return header, nil - case rpc.LatestBlockNumber: - return b.polar.blockchain.CurrentHeader(), nil - case rpc.FinalizedBlockNumber: - block := b.polar.blockchain.CurrentFinalBlock() - if block != nil { - return block, nil - } - return nil, errors.New("finalized block not found") - case rpc.SafeBlockNumber: - block := b.polar.blockchain.CurrentSafeBlock() - if block != nil { - return block, nil - } - return nil, errors.New("safe block not found") - case rpc.EarliestBlockNumber: - return b.polar.blockchain.GetHeaderByNumber(0), nil - default: - return b.polar.blockchain.GetHeaderByNumber(uint64(number)), nil + // Setup the transaction pool and attach the legacyPool. + if pl.txPool, err = txpool.New( + new(big.Int).SetUint64(pl.config.LegacyTxPool.PriceLimit), + pl.blockchain, + []txpool.SubPool{legacyPool}, + ); err != nil { + return err } -} -// HeaderByNumberOrHash returns the header identified by `number` or `hash`. -func (b *backend) HeaderByNumberOrHash(ctx context.Context, - blockNrOrHash rpc.BlockNumberOrHash, -) (*types.Header, error) { - if blockNr, ok := blockNrOrHash.Number(); ok { - return b.HeaderByNumber(ctx, blockNr) - } - if hash, ok := blockNrOrHash.Hash(); ok { - return b.HeaderByHash(ctx, hash) - } - return nil, errors.New("invalid arguments; neither block nor hash specified") -} + mux := new(event.TypeMux) //nolint:staticcheck // deprecated but still in geth. + // TODO: miner config to app.toml + pl.miner = miner.New(pl, &pl.config.Miner, + pl.host.GetConfigurationPlugin().ChainConfig(), mux, pl.engine, pl.isLocalBlock) + // extra data must be nil until 1 block 1 transaction. + // eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) + // Build and set the RPC Backend and other services. -// HeaderByHash returns the block header with the given hash. -func (b *backend) HeaderByHash(_ context.Context, hash common.Hash) (*types.Header, error) { - return b.polar.blockchain.GetHeaderByHash(hash), nil -} + // if pl.APIBackend.allowUnprotectedTxs { + // log.Info("Unprotected transactions allowed") + // } -// BlockByNumber returns the block with the given `number`. -func (b *backend) BlockByNumber(_ context.Context, number rpc.BlockNumber) (*types.Block, error) { - // Pending block is only known by the miner - switch number { - case rpc.PendingBlockNumber: - block := b.polar.miner.PendingBlock() - return block, nil - // Otherwise resolve and return the block - case rpc.LatestBlockNumber: - header := b.polar.blockchain.CurrentBlock() - return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - - case rpc.FinalizedBlockNumber: - header := b.polar.blockchain.CurrentFinalBlock() - return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - - case rpc.SafeBlockNumber: - header := b.polar.blockchain.CurrentSafeBlock() - return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - - case rpc.EarliestBlockNumber: - return b.polar.blockchain.GetBlockByNumber(0), nil - } - // safe to assume number > 0 - return b.polar.blockchain.GetBlockByNumber(uint64(number)), nil + return nil } -// BlockByHash returns the block with the given `hash`. -func (b *backend) BlockByHash(_ context.Context, hash common.Hash) (*types.Block, error) { - block := b.polar.blockchain.GetBlockByHash(hash) - b.logger.Debug("BlockByHash", "hash", hash, "block", block) - if block == nil { - b.logger.Error("eth.rpc.backend.BlockByHash", "hash", hash, "nil", true) - return nil, nil //nolint:nilnil // to match geth. - } - b.logger.Debug("called eth.rpc.backend.BlockByHash", "header", block.Header(), - "num_txs", len(block.Transactions())) - return block, nil -} +// APIs return the collection of RPC services the polar package offers. +// NOTE, some of these services probably need to be moved to somewhere else. +func (pl *Polaris) APIs() []rpc.API { + // Grab a bunch of the apis from go-Polaris (thx bae) + apis := polarapi.GethAPIs(pl.backend, pl.blockchain) -func (b *backend) BlockByNumberOrHash( - ctx context.Context, - blockNrOrHash rpc.BlockNumberOrHash, -) (*types.Block, error) { - if blockNr, ok := blockNrOrHash.Number(); ok { - return b.BlockByNumber(ctx, blockNr) - } - if hash, ok := blockNrOrHash.Hash(); ok { - block := b.polar.blockchain.GetBlockByHash(hash) - if block == nil { - return nil, core.ErrBlockNotFound - } - // if blockNrOrHash.RequireCanonical && - // b.polar.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { - // return nil, errors.New("hash is not currently canonical") - // } - // block := b.polar.blockchain.GetBlock(hash, header.Number.Uint64()) - // if block == nil { - // return nil, errors.New("header found, but block body is missing") - // } - return block, nil - } - return nil, errors.New("invalid arguments; neither block nor hash specified") + // Append all the local APIs and return + return append(apis, []rpc.API{ + { + Namespace: "net", + Service: polarapi.NewNetAPI(pl.backend), + }, + { + Namespace: "web3", + Service: polarapi.NewWeb3API(pl.backend), + }, + }...) } -func (b *backend) StateAndHeaderByNumber( - ctx context.Context, - number rpc.BlockNumber, -) (state.StateDB, *types.Header, error) { - // Pending state is only known by the miner - if number == rpc.PendingBlockNumber { - block, state := b.polar.miner.Pending() - return state, block.Header(), nil - } - // Otherwise resolve the block number and return its state - header, err := b.HeaderByNumber(ctx, number) +// isLocalBlock checks whether the specified block is mined +// by local miner accounts. +// +// We regard two types of accounts as local miner account: etherbase +// and accounts specified via `txpool.locals` flag. +func (pl *Polaris) isLocalBlock(header *types.Header) bool { + author, err := pl.engine.Author(header) if err != nil { - return nil, nil, err - } - if header == nil { - // to match Geth - return nil, nil, core.ErrBlockNotFound + log.Warn( + "Failed to retrieve block author", "number", + header.Number.Uint64(), "hash", header.Hash(), "err", err, + ) + return false } - b.logger.Debug("called eth.rpc.backend.StateAndHeaderByNumber", "header", header) - - // StateAtBlockNumber returns nil if the number is not found - state, err := b.polar.blockchain.StateAtBlockNumber(header.Number.Uint64()) - if err != nil { - b.logger.Error("eth.rpc.backend.StateAndHeaderByNumber", "number", number, "err", err) - return nil, nil, err + // Check whether the given address is etherbase. + if author == pl.miner.Etherbase() { + return true } - - return state, header, nil -} - -func (b *backend) StateAndHeaderByNumberOrHash( - ctx context.Context, - blockNrOrHash rpc.BlockNumberOrHash, -) (state.StateDB, *types.Header, error) { - if blockNr, ok := blockNrOrHash.Number(); ok { - return b.StateAndHeaderByNumber(ctx, blockNr) - } - - if hash, ok := blockNrOrHash.Hash(); ok { - header, err := b.HeaderByHash(ctx, hash) - if err != nil { - return nil, nil, err - } - if header == nil { - // to match Geth - return nil, nil, core.ErrBlockNotFound + // Check whether the given address is specified by `txpool.local` + // CLI flag. + for _, account := range pl.config.LegacyTxPool.Locals { + if account == author { + return true } - // if blockNrOrHash.RequireCanonical && - // b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { - // return nil, nil, errors.New("hash is not currently canonical") - // } - return b.StateAndHeaderByNumber(ctx, rpc.BlockNumber(header.Number.Int64())) - } - return nil, nil, errors.New("invalid arguments; neither block nor hash specified") -} - -// GetTransaction returns the transaction identified by `txHash`, along with -// information about the transaction. -func (b *backend) GetTransaction( - _ context.Context, - txHash common.Hash, -) (*types.Transaction, common.Hash, uint64, uint64, error) { - b.logger.Debug("called eth.rpc.backend.GetTransaction", "tx_hash", txHash) - txLookup := b.polar.blockchain.GetTransactionLookup(txHash) - if txLookup == nil { - return nil, common.Hash{}, 0, 0, nil } - return txLookup.Tx, txLookup.BlockHash, txLookup.BlockNum, txLookup.TxIndex, nil -} - -// PendingBlockAndReceipts returns the pending block (equivalent to current block in Polaris) -// and associated receipts. -func (b *backend) PendingBlockAndReceipts() (*types.Block, types.Receipts) { - block, receipts := b.polar.miner.PendingBlockAndReceipts() - // If the block is non-existent, return nil. - // This is to maintain parity with the behavior of the geth backend. - if block == nil { - b.logger.Debug("called eth.rpc.backend.PendingBlockAndReceipts is nil", "block", block) - return nil, nil - } - b.logger.Debug("called eth.rpc.backend.PendingBlockAndReceipts", "block", block, - "num_receipts", len(receipts)) - return block, receipts -} - -// GetReceipts returns the receipts for the given block hash. -func (b *backend) GetReceipts(_ context.Context, hash common.Hash) (types.Receipts, error) { - return b.polar.blockchain.GetReceiptsByHash(hash), nil -} - -// GetLogs returns the logs for the given block hash or number. -func (b *backend) GetLogs( - _ context.Context, blockHash common.Hash, number uint64, -) ([][]*types.Log, error) { - receipts := b.polar.blockchain.GetReceiptsByHash(blockHash) - logs := make([][]*types.Log, len(receipts)) - for i, receipt := range receipts { - logs[i] = receipt.Logs - } - b.logger.Debug("called eth.rpc.backend.GetBody", "block_hash", blockHash, "number", number) - return logs, nil -} - -// GetTd returns the total difficulty of a block in the canonical chain. -// This is hardcoded to 69, as it is only applicable in a PoW chain. -func (b *backend) GetTd(_ context.Context, hash common.Hash) *big.Int { - if header := b.polar.blockchain.GetHeaderByHash(hash); header != nil { - return b.polar.blockchain.GetTd(hash, header.Number.Uint64()) - } - return nil -} - -// GetEVM returns a new EVM to be used for simulating a transaction, estimating gas etc. -func (b *backend) GetEVM(_ context.Context, msg *core.Message, state state.StateDB, - header *types.Header, vmConfig *vm.Config, blockCtx *vm.BlockContext, -) (*vm.EVM, func() error) { - if vmConfig == nil { - vmConfig = b.polar.blockchain.GetVMConfig() - } - txContext := core.NewEVMTxContext(msg) - var context vm.BlockContext - if blockCtx != nil { - context = *blockCtx - } else { - // TODO: we are hardcoding author to coinbase, this may be incorrect. - // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. - context = core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) - } - return vm.NewEVM(context, txContext, state, b.polar.blockchain.Config(), - *vmConfig), state.Error -} - -// GetBlockContext returns a new block context to be used by a EVM. -func (b *backend) GetBlockContext( - _ context.Context, header *types.Header, -) *vm.BlockContext { - // TODO: we are hardcoding author to coinbase, this may be incorrect. - // TODO: Suggestion -> implement Engine.Author() and allow host chain to decide. - blockContext := core.NewEVMBlockContext(header, b.polar.Blockchain(), &header.Coinbase) - return &blockContext -} - -func (b *backend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { - b.logger.Debug("called eth.rpc.backend.SubscribeChainEvent", "ch", ch) - return b.polar.blockchain.SubscribeChainEvent(ch) -} - -func (b *backend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { - b.logger.Debug("called eth.rpc.backend.SubscribeChainHeadEvent", "ch", ch) - return b.polar.blockchain.SubscribeChainHeadEvent(ch) -} - -func (b *backend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { - b.logger.Debug("called eth.rpc.backend.SubscribeChainSideEvent", "ch", ch) - return b.polar.blockchain.SubscribeChainSideEvent(ch) + return false } -// ============================================================================== -// Transaction Pool API -// ============================================================================== +// StartServices notifies the NetworkStack to spin up (i.e json-rpc). +func (pl *Polaris) StartServices() error { + // Register the JSON-RPCs with the networking stack. + pl.stack.RegisterAPIs(pl.APIs()) -func (b *backend) SendTx(_ context.Context, signedTx *types.Transaction) error { - return b.polar.txPool.Add([]*types.Transaction{signedTx}, true, false)[0] -} + // Register the filter API separately in order to get access to the filterSystem + pl.filterSystem = utils.RegisterFilterAPI(pl.stack, pl.backend, &defaultEthConfig) -func (b *backend) GetPoolTransactions() (types.Transactions, error) { - b.logger.Debug("called eth.rpc.backend.GetPoolTransactions") - pending := b.polar.txPool.Pending(false) - var txs types.Transactions - for _, batch := range pending { - for _, lazy := range batch { - if tx := lazy.Resolve(); tx != nil { - txs = append(txs, tx) - } + go func() { + // TODO: these values are sensitive due to a race condition in the json-rpc ports opening. + // If the JSON-RPC opens before the first block is committed, hive tests will start failing. + // This needs to be fixed before mainnet as its ghetto af. If the block time is too long + // and this sleep is too short, it will cause hive tests to error out. + time.Sleep(5 * time.Second) //nolint:gomnd // as explained above. + if err := pl.stack.Start(); err != nil { + panic(err) } - } - return txs, nil -} - -func (b *backend) GetPoolTransaction(hash common.Hash) *types.Transaction { - b.logger.Debug("called eth.rpc.backend.GetPoolTransaction", "tx_hash", hash) - return b.polar.txPool.Get(hash) -} - -func (b *backend) GetPoolNonce(_ context.Context, addr common.Address) (uint64, error) { - nonce := b.polar.txPool.Nonce(addr) - b.logger.Debug("called eth.rpc.backend.GetPoolNonce", "addr", addr, "nonce", nonce) - return nonce, nil -} - -func (b *backend) Stats() (int, int) { - pending, queued := b.polar.txPool.Stats() - b.logger.Debug("called eth.rpc.backend.Stats", "pending", pending, "queued", queued) - return pending, queued -} - -func (b *backend) TxPoolContent() ( - map[common.Address][]*types.Transaction, - map[common.Address][]*types.Transaction, -) { - pending, queued := b.polar.txPool.Content() - b.logger.Debug( - "called eth.rpc.backend.TxPoolContent", "pending", len(pending), "queued", len(queued)) - return pending, queued -} - -func (b *backend) TxPoolContentFrom(addr common.Address) ( - []*types.Transaction, - []*types.Transaction, -) { - pending, queued := b.polar.txPool.ContentFrom(addr) - b.logger.Debug("called eth.rpc.backend.TxPoolContentFrom", - "addr", addr, "pending", len(pending), "queued", len(queued)) - return pending, queued -} - -func (b *backend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { - return b.polar.txPool.SubscribeNewTxsEvent(ch) -} - -func (b *backend) Engine() consensus.Engine { + }() return nil } -// GetBody retrieves the block body corresponding to block by has or number.. -func (b *backend) GetBody( - ctx context.Context, - hash common.Hash, - number rpc.BlockNumber, -) (*types.Body, error) { - if number < 0 || hash == (common.Hash{}) { - b.logger.Error("eth.rpc.backend.GetBody", "number", number, "hash", hash) - return nil, errors.New("invalid arguments; expect hash and no special block numbers") - } - block, err := b.BlockByNumberOrHash( - ctx, rpc.BlockNumberOrHash{BlockNumber: &number, BlockHash: &hash}) - if block == nil || err != nil { - b.logger.Error("eth.rpc.backend.GetBody", "number", number, "hash", hash, "err", err) - return nil, nil //nolint:nilnil // to match geth. - } - b.logger.Debug("called eth.rpc.backend.GetBody", "hash", hash, "number", number) - return block.Body(), nil -} - -func (b *backend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { - b.logger.Debug("called eth.rpc.backend.SubscribeRemovedLogsEvent", "ch", ch) - return b.polar.blockchain.SubscribeRemovedLogsEvent(ch) +// RegisterService adds a service to the networking stack. +func (pl *Polaris) RegisterService(lc node.Lifecycle) { + pl.stack.RegisterLifecycle(lc) } -func (b *backend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { - b.logger.Debug("called eth.rpc.backend.SubscribeLogsEvent", "ch", ch) - return b.polar.blockchain.SubscribeLogsEvent(ch) +func (pl *Polaris) Close() error { + return pl.stack.Close() } -func (b *backend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { - return b.polar.miner.SubscribePendingLogs(ch) +func (pl *Polaris) Host() core.PolarisHostChain { + return pl.host } -func (b *backend) BloomStatus() (uint64, uint64) { - // TODO: Implement your code here - return 0, 0 +func (pl *Polaris) Miner() *miner.Miner { + return pl.miner } -func (b *backend) ServiceFilter(_ context.Context, _ *bloombits.MatcherSession) { - // TODO: Implement your code here +func (pl *Polaris) TxPool() *txpool.TxPool { + return pl.txPool } -// Version returns the current chain protocol version. -// For education: -// https://medium.com/@pedrouid/chainid-vs-networkid-how-do-they-differ-on-ethereum-eec2ed41635b -func (b *backend) Version() string { - chainID := b.ChainConfig().ChainID - if chainID == nil { - b.logger.Error("eth.rpc.backend.Version", "ChainID is nil") - return "-1" - } - return chainID.String() -} - -// SyncProgress returns the current progress of the sync algorithm. -func (b *backend) SyncProgress() ethereum.SyncProgress { - sp, err := b.polar.engine.SyncProgress(context.Background()) - if err != nil { - b.logger.Error("eth.rpc.backend.SyncProgress", "err", err) - return ethereum.SyncProgress{} - } - return sp -} - -// Listening returns whether the node is listening for connections. -func (b *backend) Listening() bool { - listening, err := b.polar.engine.Listening(context.Background()) - if err != nil { - b.logger.Error("eth.rpc.backend.Listening", "err", err) - return false - } - return listening -} - -// PeerCount returns the number of connected peers. -func (b *backend) PeerCount() hexutil.Uint { - peerCount, err := b.polar.engine.PeerCount(context.Background()) - if err != nil { - b.logger.Error("eth.rpc.backend.PeerCount", "err", err) - return hexutil.Uint(0) - } - return hexutil.Uint(peerCount) +func (pl *Polaris) MinerChain() miner.BlockChain { + return pl.blockchain } -// ClientVersion returns the current client version. -func (b *backend) ClientVersion() string { - return version.ClientName("polaris-geth") +func (pl *Polaris) Blockchain() core.Blockchain { + return pl.blockchain } diff --git a/eth/polar/config.go b/eth/polar/config.go index e1b943f535..6a3d5b4182 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/miner" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/params" ) @@ -44,9 +45,12 @@ const ( func DefaultConfig() *Config { gpoConfig := ethconfig.FullNodeGPO gpoConfig.Default = big.NewInt(gpoDefault) + minerCfg := miner.DefaultConfig + // TODO: setup proper command line flags + minerCfg.Etherbase = common.Address{1} return &Config{ Chain: *params.DefaultChainConfig, - Miner: miner.DefaultConfig, + Miner: minerCfg, GPO: gpoConfig, LegacyTxPool: legacypool.DefaultConfig, RPCGasCap: ethconfig.Defaults.RPCGasCap, diff --git a/eth/polar/mining.go b/eth/polar/mining.go deleted file mode 100644 index 228700b82b..0000000000 --- a/eth/polar/mining.go +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package polar - -import ( - "context" - - "pkg.berachain.dev/polaris/eth/core/types" -) - -// TODO: replace this file with a proper mining object and use message passing -// Prepare prepares the Polaris chain for processing a new block at the given height. -func (pl *Polaris) Prepare(ctx context.Context, number uint64) { - header := pl.spminer.Prepare(ctx, number) - if header == nil { - panic("blockchain produced nil header") - } -} - -// ProcessTransaction processes the given transaction and returns the receipt. -func (pl *Polaris) ProcessTransaction( - ctx context.Context, - tx *types.Transaction, -) (*types.Receipt, error) { - return pl.spminer.ProcessTransaction(ctx, tx) -} - -// Finalize finalizes the current block. -func (pl *Polaris) Finalize(ctx context.Context) error { - return pl.spminer.Finalize(ctx) -} diff --git a/eth/polar/node.go b/eth/polar/node.go index 0b5bf148e2..4374365663 100644 --- a/eth/polar/node.go +++ b/eth/polar/node.go @@ -51,12 +51,6 @@ func (n *Node) ExtRPCEnabled() bool { return n.Node.Config().ExtRPCEnabled() } -// Start starts the networking stack. -func (n *Node) Start() error { - // We then start the underlying node. - return n.Node.Start() -} - // DefaultConfig returns the default configuration for the provider. func DefaultGethNodeConfig() *node.Config { nodeCfg := node.DefaultConfig diff --git a/eth/polar/polaris.go b/eth/polar/polaris.go deleted file mode 100644 index a588b10d72..0000000000 --- a/eth/polar/polaris.go +++ /dev/null @@ -1,244 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package polar - -import ( - "math/big" - "net/http" - "time" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/core/txpool" - "github.com/ethereum/go-ethereum/core/txpool/legacypool" - "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/eth/filters" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/miner" - "github.com/ethereum/go-ethereum/node" - - "pkg.berachain.dev/polaris/eth/consensus" - "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/log" - oldminer "pkg.berachain.dev/polaris/eth/miner" - polarapi "pkg.berachain.dev/polaris/eth/polar/api" - "pkg.berachain.dev/polaris/eth/rpc" -) - -// TODO: break out the node into a separate package and then fully use the -// abstracted away networking stack, by extension we will need to improve the registration -// architecture. - -var defaultEthConfig = ethconfig.Config{ - SyncMode: 0, - FilterLogCacheSize: 0, -} - -// NetworkingStack defines methods that allow a Polaris chain to build and expose JSON-RPC API. -type NetworkingStack interface { - // IsExtRPCEnabled returns true if the networking stack is configured to expose JSON-RPC API. - ExtRPCEnabled() bool - - // RegisterHandler manually registers a new handler into the networking stack. - RegisterHandler(string, string, http.Handler) - - // RegisterAPIs registers JSON-RPC handlers for the networking stack. - RegisterAPIs([]rpc.API) - - // RegisterLifecycles registers objects to have their lifecycle manged by the stack. - RegisterLifecycle(node.Lifecycle) - - // Start starts the networking stack. - Start() error - - // Close stops the networking stack - Close() error -} - -// Polaris is the only object that an implementing chain should use. -type Polaris struct { - cfg *Config - // NetworkingStack represents the networking stack responsible for exposes the JSON-RPC - // APIs. Although possible, it does not handle p2p networking like its sibling in geth - // would. - stack NetworkingStack - - // core pieces of the polaris stack - host core.PolarisHostChain - blockchain core.Blockchain - txPool *txpool.TxPool - spminer oldminer.Miner - miner *miner.Miner - - // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs - // and the core pieces. - backend Backend - - // engine represents the consensus engine for the backend. - engine core.EnginePlugin - beacon consensus.Engine - - // filterSystem is the filter system that is used by the filter API. - // TODO: relocate - filterSystem *filters.FilterSystem -} - -func NewWithNetworkingStack( - cfg *Config, - host core.PolarisHostChain, - stack NetworkingStack, - logHandler log.Handler, -) *Polaris { - pl := &Polaris{ - cfg: cfg, - blockchain: core.NewChain(host), - stack: stack, - host: host, - engine: host.GetEnginePlugin(), - beacon: &consensus.DummyEthOne{}, - } - // When creating a Polaris EVM, we allow the implementing chain - // to specify their own log handler. If logHandler is nil then we - // we use the default geth log handler. - // When creating a Polaris EVM, we allow the implementing chain - // to specify their own log handler. If logHandler is nil then we - // we use the default geth log handler. - if logHandler != nil { - // Root is a global in geth that is used by the evm to emit logs. - log.Root().SetHandler(logHandler) - } - - pl.backend = NewBackend(pl, pl.stack.ExtRPCEnabled(), pl.cfg) - - return pl -} - -// Init initializes the Polaris struct. -func (pl *Polaris) Init() error { - var err error - pl.spminer = oldminer.New(pl) - - // For now, we only have a legacy pool, we will implement blob pool later. - legacyPool := legacypool.New( - pl.cfg.LegacyTxPool, pl.Blockchain(), - ) - - // Setup the transaction pool and attach the legacyPool. - if pl.txPool, err = txpool.New( - new(big.Int).SetUint64(pl.cfg.LegacyTxPool.PriceLimit), - pl.blockchain, - []txpool.SubPool{legacyPool}, - ); err != nil { - return err - } - - mux := new(event.TypeMux) //nolint:staticcheck // deprecated but still in geth. - // TODO: miner config to app.toml - pl.miner = miner.New(pl, &pl.cfg.Miner, - pl.host.GetConfigurationPlugin().ChainConfig(), mux, pl.beacon, pl.IsLocalBlock) - // extra data must be nil until 1 block 1 transaction. - // eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) - // Build and set the RPC Backend and other services. - - // if eth.APIBackend.allowUnprotectedTxs { - // log.Info("Unprotected transactions allowed") - // } - - return nil -} - -// APIs return the collection of RPC services the polar package offers. -// NOTE, some of these services probably need to be moved to somewhere else. -func (pl *Polaris) APIs() []rpc.API { - // Grab a bunch of the apis from go-ethereum (thx bae) - apis := polarapi.GethAPIs(pl.backend, pl.blockchain) - - // Append all the local APIs and return - return append(apis, []rpc.API{ - { - Namespace: "net", - Service: polarapi.NewNetAPI(pl.backend), - }, - { - Namespace: "web3", - Service: polarapi.NewWeb3API(pl.backend), - }, - }...) -} - -// StartServices notifies the NetworkStack to spin up (i.e json-rpc). -func (pl *Polaris) StartServices() error { - // Register the JSON-RPCs with the networking stack. - pl.stack.RegisterAPIs(pl.APIs()) - - // Register the filter API separately in order to get access to the filterSystem - pl.filterSystem = utils.RegisterFilterAPI(pl.stack, pl.backend, &defaultEthConfig) - - go func() { - // TODO: these values are sensitive due to a race condition in the json-rpc ports opening. - // If the JSON-RPC opens before the first block is committed, hive tests will start failing. - // This needs to be fixed before mainnet as its ghetto af. If the block time is too long - // and this sleep is too short, it will cause hive tests to error out. - time.Sleep(5 * time.Second) //nolint:gomnd // as explained above. - if err := pl.stack.Start(); err != nil { - panic(err) - } - }() - return nil -} - -// RegisterService adds a service to the networking stack. -func (pl *Polaris) RegisterService(lc node.Lifecycle) { - pl.stack.RegisterLifecycle(lc) -} - -func (pl *Polaris) Close() error { - return pl.stack.Close() -} - -func (pl *Polaris) Host() core.PolarisHostChain { - return pl.host -} - -func (pl *Polaris) Miner() *miner.Miner { - return pl.miner -} - -func (pl *Polaris) SPMiner() oldminer.Miner { - return pl.spminer -} - -func (pl *Polaris) TxPool() *txpool.TxPool { - return pl.txPool -} - -func (pl *Polaris) MinerChain() miner.BlockChain { - return pl.blockchain -} - -func (pl *Polaris) Blockchain() core.Blockchain { - return pl.blockchain -} - -func (pl *Polaris) IsLocalBlock(_ *types.Header) bool { - // Unused. - return true -} diff --git a/go.work.sum b/go.work.sum index 64707d71c6..157ad12c6f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,356 +1,234 @@ -cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n6vCmFJM= cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqmfddPA= cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0= cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= cloud.google.com/go/eventarc v1.13.0 h1:xIP3XZi0Xawx8DEfh++mE2lrIi5kQmCr/KcWhJ1q0J4= cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.6.0 h1:PKggmegChZulPW8yvtziF8P9UOuVFwbvylbEucTNups= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/tpu v1.6.1 h1:kQf1jgPY04UJBYYjNUO+3GrZtIb57MfGAW2bwgLbR3A= cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zXrU0= cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmXJ+EjTA= cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= @@ -358,20 +236,15 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSu github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= @@ -388,21 +261,16 @@ github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= -github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= @@ -438,13 +306,6 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= -github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= -github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= -github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= @@ -494,7 +355,6 @@ github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7Z github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= @@ -611,7 +471,6 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= @@ -622,7 +481,6 @@ github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= @@ -630,8 +488,6 @@ github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= @@ -648,7 +504,6 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= @@ -867,11 +722,8 @@ gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= -gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231004235344-d975586a7cdd/go.mod h1:ivNrIw2VxAZv0TeCHVR2XXe7UH/2ipQgK2rMXUHfvqo= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= diff --git a/lib/go.mod b/lib/go.mod index dc2046c73a..310d51be23 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/lib go 1.21 require ( - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 ) diff --git a/lib/go.sum b/lib/go.sum index cb31ddaea7..51620f9515 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -21,8 +21,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/proto/polaris/evm/v1alpha1/tx.proto b/proto/polaris/evm/v1alpha1/tx.proto index 272ae913f5..d2fa4897f1 100644 --- a/proto/polaris/evm/v1alpha1/tx.proto +++ b/proto/polaris/evm/v1alpha1/tx.proto @@ -31,6 +31,9 @@ service MsgService { // EthTransaction defines a method submitting Ethereum transactions. rpc EthTransaction(WrappedEthereumTransaction) returns (WrappedEthereumTransactionResult); + + // ProcessPayloadEnvelope defines a method to process CL paylods. + rpc ProcessPayloadEnvelope(WrappedPayloadEnvelope) returns (WrappedPayloadEnvelopeResponse); } // WrappedEthereumTransaction encapsulates an Ethereum transaction as an SDK message. @@ -39,6 +42,15 @@ message WrappedEthereumTransaction { bytes data = 1; } +// WrappedPayloadEnvelope encapsulates an Ethereum transaction as an SDK message. +message WrappedPayloadEnvelope { + // data is inner transaction data of the Ethereum transaction. + bytes data = 1; +} + +// WrappedPayloadEnvelopeResponse defines the block response. +message WrappedPayloadEnvelopeResponse {} + // Status represents the status of a transaction. enum Status { // STATUS_REVERT_UNSPECIFIED indicates that the transaction reverted. diff --git a/tools/go.mod b/tools/go.mod index 0ce10df962..94e125f955 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -9,7 +9,7 @@ require ( github.com/golangci/golangci-lint v1.54.2 github.com/google/addlicense v1.1.1 github.com/matryer/moq v0.3.2 - github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/ginkgo/v2 v2.13.0 github.com/securego/gosec/v2 v2.17.0 github.com/vektra/mockery/v2 v2.34.1 ) diff --git a/tools/go.sum b/tools/go.sum index 5a8c0ace26..7d59237c49 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -643,8 +643,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= -github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= From a5ed99983be4ba72e6d0ea4a722946a6b4fd290c Mon Sep 17 00:00:00 2001 From: BrickBera <128406734+BrickBera@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:16:45 -0400 Subject: [PATCH 083/122] fix(script): fix scripts in docker (#1213) ### Summary by CodeRabbit - Refactor: Updated the initialization script in `e2e/testapp/docker/seed/scripts/seed0-init-step2.sh` to directly use `/.polard` as the home directory path, enhancing the script's simplicity and readability. - Chore: Added a license header to `e2e/testapp/docker/seed/scripts/set-moniker.sh` for legal compliance. - Bug Fix: Modified the `sed` command in `set-moniker.sh` to correctly replace the `moniker` value in the configuration file, improving the script's functionality and reliability. --- .../docker/seed/scripts/seed0-init-step2.sh | 2 -- .../docker/seed/scripts/set-moniker.sh | 27 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 e2e/testapp/docker/seed/scripts/set-moniker.sh diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh index 9dc9be441f..164d4f5ca1 100644 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh @@ -28,8 +28,6 @@ if [ -z "$KEYALGO" ]; then KEYALGO="secp256k1" fi -HOMEDIR="/.polard" - polard genesis collect-gentxs --home "$HOMEDIR" polard genesis validate-genesis --home "$HOMEDIR" diff --git a/e2e/testapp/docker/seed/scripts/set-moniker.sh b/e2e/testapp/docker/seed/scripts/set-moniker.sh new file mode 100644 index 0000000000..b6914761f2 --- /dev/null +++ b/e2e/testapp/docker/seed/scripts/set-moniker.sh @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: BUSL-1.1 +# +# Copyright (C) 2023, Berachain Foundation. All rights reserved. +# Use of this software is govered by the Business Source License included +# in the LICENSE file of this repository and at www.mariadb.com/bsl11. +# +# ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +# TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +# VERSIONS OF THE LICENSED WORK. +# +# THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +# LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +# LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +# +# TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +# AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +# EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +# TITLE. + +if [ -z "$HOMEDIR" ]; then + HOMEDIR="/.polard" +fi +CONFIG_TOML=$HOMEDIR/config/config.toml + +MONIKER=$1 +sed -i "s/^moniker = .*/moniker = \"$MONIKER\"/" "$CONFIG_TOML" From 63d98bc34da2c5c858f94e8a7a3e63fb2be98c3b Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 10 Oct 2023 20:33:41 -0400 Subject: [PATCH 084/122] refactor(ante): Remove ante handler as it is not needed (#1214) --- cosmos/lib/ante/minimal.go | 32 -------------------------------- e2e/testapp/app.go | 5 ++--- 2 files changed, 2 insertions(+), 35 deletions(-) delete mode 100644 cosmos/lib/ante/minimal.go diff --git a/cosmos/lib/ante/minimal.go b/cosmos/lib/ante/minimal.go deleted file mode 100644 index 02b4f27f35..0000000000 --- a/cosmos/lib/ante/minimal.go +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package antelib - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/ante" -) - -// NewMinimalHandler produces the absolute minimum handler that can produce valid -// blocks. -func NewMinimalHandler() sdk.AnteHandler { - return sdk.ChainAnteDecorators(ante.NewSetUpContextDecorator()) -} diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 914c278512..b05236adcd 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -58,7 +58,6 @@ import ( evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" - antelib "pkg.berachain.dev/polaris/cosmos/lib/ante" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" @@ -213,8 +212,8 @@ func NewPolarisApp( app.mm = miner.New(app.EVMKeeper.Polaris().Miner()) app.SetPrepareProposal(app.mm.PrepareProposal) - // Setup Custom Ante Handler - app.SetAnteHandler(antelib.NewMinimalHandler()) + // Set the ante handler to nil, since it is not needed. + app.SetAnteHandler(nil) // ----- END EVM SETUP ------------------------------------------------- From 05b91e4e5c9008f8f6e7288e3447cefb53f9842d Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 12 Oct 2023 11:06:06 -0400 Subject: [PATCH 085/122] chore(deps): bump `golang.org/x/net` --- contracts/go.mod | 4 ++-- contracts/go.sum | 6 ++---- cosmos/go.mod | 8 ++++---- cosmos/go.sum | 16 ++++++++-------- e2e/localnet/go.mod | 6 +++--- e2e/localnet/go.sum | 12 ++++++------ e2e/precompile/go.mod | 8 ++++---- e2e/precompile/go.sum | 16 ++++++++-------- e2e/testapp/go.mod | 8 ++++---- e2e/testapp/go.sum | 16 ++++++++-------- eth/go.mod | 6 +++--- eth/go.sum | 12 ++++++------ go.work.sum | 4 ++++ lib/go.mod | 4 ++-- lib/go.sum | 8 ++++---- tools/go.mod | 8 ++++---- tools/go.sum | 16 ++++++++-------- 17 files changed, 80 insertions(+), 78 deletions(-) diff --git a/contracts/go.mod b/contracts/go.mod index 6949199de4..26c30ff5ac 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -42,11 +42,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/contracts/go.sum b/contracts/go.sum index 6d1e629b6c..a5ccbfa4c0 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -173,8 +173,7 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -215,8 +214,7 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/cosmos/go.mod b/cosmos/go.mod index 947cdb0405..5b4a28e03d 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -227,12 +227,12 @@ require ( github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index d67e7291e6..ab3222d8fb 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -1007,8 +1007,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 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= @@ -1094,8 +1094,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1205,12 +1205,12 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 2d7fdb239a..b921c09ea1 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -55,12 +55,12 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index a079982b88..b29bcd1816 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -242,8 +242,8 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -255,8 +255,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -280,8 +280,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 2376001ded..28d9b4b9a0 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -178,13 +178,13 @@ require ( github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 287ae1ce10..5147bf6826 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -964,8 +964,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 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= @@ -1051,8 +1051,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1159,12 +1159,12 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 2a3d2d1d9a..e1d320e347 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -248,14 +248,14 @@ require ( go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 3cefdffd7a..f7a13444d4 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -1217,8 +1217,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 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= @@ -1321,8 +1321,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1470,13 +1470,13 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= diff --git a/eth/go.mod b/eth/go.mod index 07c60e0bf5..e0709d6026 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -121,12 +121,12 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect diff --git a/eth/go.sum b/eth/go.sum index c0a4b38c2b..02c5b4746f 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -329,8 +329,8 @@ golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -346,8 +346,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -384,8 +384,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/go.work.sum b/go.work.sum index 157ad12c6f..f0e2fcc211 100644 --- a/go.work.sum +++ b/go.work.sum @@ -704,11 +704,15 @@ go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzc go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= diff --git a/lib/go.mod b/lib/go.mod index 310d51be23..9ffa11a06a 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -15,8 +15,8 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/stretchr/testify v1.8.4 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect google.golang.org/protobuf v1.31.0 // indirect diff --git a/lib/go.sum b/lib/go.sum index 51620f9515..29c5edbac2 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -37,10 +37,10 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= diff --git a/tools/go.mod b/tools/go.mod index 94e125f955..a68fca383d 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -297,14 +297,14 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect diff --git a/tools/go.sum b/tools/go.sum index 7d59237c49..e7a112e9c6 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -922,8 +922,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 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= @@ -1019,8 +1019,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1123,16 +1123,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= From c1edabdcf30ef372be3a4b31f0f132cbf3a52a88 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 12 Oct 2023 12:21:31 -0400 Subject: [PATCH 086/122] feat(runtime): Polaris Runtime Module (#1215) ### Summary by CodeRabbit - New Feature: Introduced a new Go package `runtime` that provides a function `ProvidePolarisRuntime` for creating a new Polaris runtime. - Refactor: Updated the `Keeper` struct in the `cosmos/x/evm/keeper` package to include a `chain` field of type `Blockchain` and removed several methods. - New Feature: Added `Precommit` and `PrepareCheckState` functions to the `Keeper` struct in the `cosmos/x/evm/keeper` package. - Refactor: Updated the `AppModule` struct in the `cosmos/x/evm` package to include `PrepareCheckState` and `Precommit` methods. - New Feature: Added a new contract `DeployAndConsumeGas` in the `contracts/scripts` directory that consumes gas in a loop. - Refactor: Updated the `MakeAppConfig` function in the `e2e/testapp` package to include `evmtypes.ModuleName` in the `PrepareCheckStaters` and `Precommiters` lists. - New Feature: Added a safety check on the JSON-RPC config in the `eth/polar/config.go` file. --------- Co-authored-by: Cal Bera --- contracts/go.sum | 2 + contracts/scripts/DeployAndCallERC20.sol | 22 +- contracts/scripts/DeployAndConsumeGas.sol | 46 + cosmos/go.mod | 7 +- cosmos/go.sum | 14 +- cosmos/runtime/depinject.go | 83 ++ cosmos/runtime/runtime.go | 117 ++ cosmos/x/evm/genesis_test.go | 14 +- cosmos/x/evm/keeper/abci.go | 54 + cosmos/x/evm/keeper/genesis.go | 10 +- cosmos/x/evm/keeper/host.go | 33 +- cosmos/x/evm/keeper/keeper.go | 80 +- cosmos/x/evm/keeper/processor.go | 30 +- cosmos/x/evm/module.go | 18 +- cosmos/x/evm/plugins/state/plugin.go | 24 +- e2e/localnet/go.mod | 4 +- e2e/localnet/go.sum | 8 +- e2e/precompile/go.mod | 20 +- e2e/precompile/go.sum | 35 +- e2e/testapp/app.go | 76 +- e2e/testapp/app_config.go | 6 + e2e/testapp/go.mod | 2 +- e2e/testapp/go.sum | 1567 --------------------- e2e/testapp/polard/cmd/root.go | 2 + eth/core/chain_resources.go | 1 + eth/go.mod | 4 +- eth/go.sum | 8 +- eth/log/imported.go | 2 + eth/polar/backend.go | 5 + eth/polar/config.go | 18 +- go.work.sum | 394 +++++- 31 files changed, 880 insertions(+), 1826 deletions(-) create mode 100644 contracts/scripts/DeployAndConsumeGas.sol create mode 100644 cosmos/runtime/depinject.go create mode 100644 cosmos/runtime/runtime.go create mode 100644 cosmos/x/evm/keeper/abci.go diff --git a/contracts/go.sum b/contracts/go.sum index a5ccbfa4c0..6d1c978faf 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -174,6 +174,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -215,6 +216,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/contracts/scripts/DeployAndCallERC20.sol b/contracts/scripts/DeployAndCallERC20.sol index 8ebc5109da..c648692a56 100644 --- a/contracts/scripts/DeployAndCallERC20.sol +++ b/contracts/scripts/DeployAndCallERC20.sol @@ -29,18 +29,18 @@ import "../lib/forge-std/src/Script.sol"; import "../src/testing/SolmateERC20.sol"; contract DeployAndCallERC20 is Script { - function run() public { - address dropAddress = address(12); - uint256 quantity = 50000; + function run() public { + address dropAddress = address(12); + uint256 quantity = 50000; - vm.startBroadcast(); - SolmateERC20 drop = new SolmateERC20(); + vm.startBroadcast(); + SolmateERC20 drop = new SolmateERC20(); - for (uint256 i = 0; i < 66; i++) { - quantity += 50000; - drop.mint(dropAddress, quantity); - } - - vm.stopBroadcast(); + for (uint256 i = 0; i < 66; i++) { + quantity += 50000; + drop.mint(dropAddress, quantity); } + + vm.stopBroadcast(); + } } diff --git a/contracts/scripts/DeployAndConsumeGas.sol b/contracts/scripts/DeployAndConsumeGas.sol new file mode 100644 index 0000000000..960df8951a --- /dev/null +++ b/contracts/scripts/DeployAndConsumeGas.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2023 Berachain Foundation +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +pragma solidity ^0.8.17; + +import "../lib/forge-std/src/Script.sol"; +import "../src/testing/SolmateERC20.sol"; +import "../src/testing/ConsumeGas.sol"; + +contract DeployAndConsumeGas is Script { + function run() public { + address dropAddress = address(12); + uint256 quantity = 50000; + + vm.startBroadcast(); + ConsumeGas drop = new ConsumeGas(); + + for (uint256 i = 0; i < 1000; i++) { + drop.consumeGas(300000); + } + + vm.stopBroadcast(); + } +} diff --git a/cosmos/go.mod b/cosmos/go.mod index 5b4a28e03d..4b91ec627d 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -44,16 +44,15 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect google.golang.org/grpc v1.58.1 google.golang.org/protobuf v1.31.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 - pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 - pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 + pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 + pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4 ) require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index ab3222d8fb..97c6bfbbd1 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -63,8 +63,6 @@ github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwR github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= @@ -1461,12 +1459,12 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= +pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 h1:q9gSJk2kQQbz/3cPcXGCW+JdQvxAm+7ukcDqzZiUcmw= +pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= +pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 h1:gOqKP7ZCzIU1NZrwdISnxswAatut/6Xi7JjdSpHbZk8= +pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= +pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4 h1:3zGPs5JJpBtysLMNWa5wKEhwC+j3p5AAK0gZ1fWuEc8= +pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4/go.mod h1:OcMl9wH8872Q4++ikKXIm1FC4FbuGUWHxrjb6LCzvIY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/cosmos/runtime/depinject.go b/cosmos/runtime/depinject.go new file mode 100644 index 0000000000..d6ada38e17 --- /dev/null +++ b/cosmos/runtime/depinject.go @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package runtime + +import ( + "cosmossdk.io/depinject" + "cosmossdk.io/log" + + "pkg.berachain.dev/polaris/cosmos/config" + evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" + ethlog "pkg.berachain.dev/polaris/eth/log" + "pkg.berachain.dev/polaris/eth/polar" +) + +// DepInjectInput is the input for the dep inject framework. +type DepInjectInput struct { + depinject.In + + Logger log.Logger + EVMKeeper *evmkeeper.Keeper + Config func() *config.Config +} + +// DepInjectOutput is the output for the dep inject framework. +type DepInjectOutput struct { + depinject.Out + + Polaris *Polaris +} + +// ProvidePolarisRuntime creates a new Polaris runtime from the provided +// dependencies. +func ProvidePolarisRuntime(input DepInjectInput) DepInjectOutput { + cfg := input.Config() + node, err := polar.NewGethNetworkingStack(&cfg.Node) + if err != nil { + panic(err) + } + + polaris := polar.NewWithNetworkingStack( + &cfg.Polar, input.EVMKeeper.Host, node, ethlog.FuncHandler( + func(r *ethlog.Record) error { + polarisGethLogger := input.Logger.With("module", "polaris-geth") + switch r.Lvl { //nolint:nolintlint,exhaustive // linter is bugged. + case ethlog.LvlTrace: + case ethlog.LvlDebug: + polarisGethLogger.Debug(r.Msg, r.Ctx...) + case ethlog.LvlInfo: + polarisGethLogger.Info(r.Msg, r.Ctx...) + case ethlog.LvlWarn: + case ethlog.LvlCrit: + case ethlog.LvlError: + polarisGethLogger.Error(r.Msg, r.Ctx...) + } + return nil + }), + ) + + return DepInjectOutput{ + Polaris: &Polaris{ + Polaris: polaris, + EVMKeeper: input.EVMKeeper, + }, + } +} diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go new file mode 100644 index 0000000000..6e217e18e0 --- /dev/null +++ b/cosmos/runtime/runtime.go @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package runtime + +import ( + "cosmossdk.io/log" + storetypes "cosmossdk.io/store/types" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/node" + + libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" + "pkg.berachain.dev/polaris/cosmos/miner" + "pkg.berachain.dev/polaris/cosmos/txpool" + evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" + enginep "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" + evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/polar" +) + +type Polaris struct { + *polar.Polaris + + // polaris keepers + EVMKeeper *evmkeeper.Keeper + + // polaris componets + WrappedMiner *miner.Miner + WrappedTxPool *txpool.Mempool +} + +func (p *Polaris) Setup(bApp *baseapp.BaseApp) error { + // SetupPrecompiles is used to setup the precompile contracts post depinject. + if err := p.EVMKeeper.SetupPrecompiles(); err != nil { + return err + } + + // Init is used to setup the polaris struct. + if err := p.Polaris.Init(); err != nil { + return err + } + + // Setup TxPool Wrapper + p.WrappedTxPool = txpool.New(p.TxPool()) + bApp.SetMempool(p.WrappedTxPool) + + p.WrappedMiner = miner.New(p.Miner()) + bApp.SetPrepareProposal(p.WrappedMiner.PrepareProposal) + + // TODO: deprecate this + p.EVMKeeper.SetBlockchain(p.Blockchain()) + + return nil +} + +func (p *Polaris) Init(clientCtx client.Context, logger log.Logger) error { + // Initialize services. + p.WrappedMiner.Init(libtx.NewSerializer[*engine.ExecutionPayloadEnvelope]( + clientCtx.TxConfig, evmtypes.WrapPayload)) + + p.WrappedTxPool.Init(logger, clientCtx, libtx.NewSerializer[*coretypes.Transaction]( + clientCtx.TxConfig, evmtypes.WrapTx)) + + // Register services with Polaris. + p.RegisterServices(clientCtx, []node.Lifecycle{ + p.WrappedTxPool, + }) + return nil +} + +// Register Services allows for the application to register lifecycles with the evm +// networking stack. +func (p *Polaris) RegisterServices(clientContext client.Context, lcs []node.Lifecycle) { + // TODO: probably get rid of engine plugin or something and handle rpc methods better. + p.EVMKeeper.Host.GetEnginePlugin().(enginep.Plugin).Start(clientContext) + + // Register the services with polaris. + for _, lc := range lcs { + p.RegisterService(lc) + } + + // Start the services. + if err := p.StartServices(); err != nil { + panic(err) + } +} + +func (p *Polaris) LoadLastState(cms storetypes.CommitMultiStore, appHeight uint64) error { + cmsCtx := sdk.Context{}. + WithMultiStore(cms). + WithGasMeter(storetypes.NewInfiniteGasMeter()). + WithBlockGasMeter(storetypes.NewInfiniteGasMeter()).WithEventManager(sdk.NewEventManager()) + return p.Blockchain().LoadLastState(cmsCtx, appHeight) +} diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index e026d28adf..e0ce86b08f 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -33,6 +33,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/ethereum/go-ethereum/consensus/beacon" + "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/precompile/staking" testutil "pkg.berachain.dev/polaris/cosmos/testutil" @@ -90,6 +92,10 @@ var _ = Describe("", func() { log.NewTestLogger(GinkgoT()), cfg, ) + k.SetBlockchain( + core.NewChain(k.Host, beacon.NewFaker()), + ) + err = k.SetupPrecompiles() Expect(err).ToNot(HaveOccurred()) am = evm.NewAppModule(k, ak) @@ -112,12 +118,12 @@ var _ = Describe("", func() { Expect(err).ToNot(HaveOccurred()) }) It("should contain the same genesis header values", func() { - bp := k.Polaris().Host().GetBlockPlugin() + bp := k.Host.GetBlockPlugin() expectedHeader := ethGen.ToBlock().Header() Expect(bp.GetHeaderByNumber(0)).To(Equal(expectedHeader)) }) It("should have the correct balances", func() { - sp := k.Polaris().Host().GetStatePlugin() + sp := k.Host.GetStatePlugin() for addr, acc := range ethGen.Alloc { balance := sp.GetBalance(addr) cmp := balance.Cmp(acc.Balance) @@ -125,7 +131,7 @@ var _ = Describe("", func() { } }) It("should have the correct code", func() { - sp := k.Polaris().Host().GetStatePlugin() + sp := k.Host.GetStatePlugin() for addr, acc := range ethGen.Alloc { code := sp.GetCode(addr) cmp := bytes.Compare(code, acc.Code) @@ -133,7 +139,7 @@ var _ = Describe("", func() { } }) It("should have the correct hash", func() { - sp := k.Polaris().Host().GetStatePlugin() + sp := k.Host.GetStatePlugin() for addr, acc := range ethGen.Alloc { for key, expectedHash := range acc.Storage { actualHash := sp.GetState(addr, key) diff --git a/cosmos/x/evm/keeper/abci.go b/cosmos/x/evm/keeper/abci.go new file mode 100644 index 0000000000..811cc4ba56 --- /dev/null +++ b/cosmos/x/evm/keeper/abci.go @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package keeper + +import ( + "context" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Precommit runs on the Cosmo-SDK lifecycle Precommit(). +func (k *Keeper) Precommit(ctx context.Context) error { + // Verify that the EVM block was written. + // TODO: Set/GetHead to set and get the canonical head. + blockNum := uint64(sdk.UnwrapSDKContext(ctx).BlockHeight()) + block := k.chain.GetBlockByNumber(blockNum) + if block == nil { + panic( + fmt.Sprintf("EVM BLOCK FAILURE AT BLOCK %d", blockNum), + ) + } else if block.NumberU64() != blockNum { + panic( + fmt.Sprintf( + "EVM BLOCK [%d] DOES NOT MATCH COMET BLOCK [%d]", block.NumberU64(), blockNum, + ), + ) + } + return nil +} + +// PrepareCheckState runs on the Cosmos-SDK lifecycle PrepareCheckState(). +func (k *Keeper) PrepareCheckState(ctx context.Context) error { + k.sp.Prepare(ctx) + return nil +} diff --git a/cosmos/x/evm/keeper/genesis.go b/cosmos/x/evm/keeper/genesis.go index 3c3fc37d0c..cedf97f0a7 100644 --- a/cosmos/x/evm/keeper/genesis.go +++ b/cosmos/x/evm/keeper/genesis.go @@ -31,10 +31,10 @@ import ( // InitGenesis is called during the InitGenesis. func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { // TODO: Feels jank as fuck lol, but it works. - genState.Config = k.host.GetConfigurationPlugin().ChainConfig() + genState.Config = k.Host.GetConfigurationPlugin().ChainConfig() // Initialize all the plugins. - for _, plugin := range k.host.GetAllPlugins() { + for _, plugin := range k.Host.GetAllPlugins() { // checks whether plugin implements methods of HasGenesis and executes them if it does if plugin, ok := utils.GetAs[plugins.HasGenesis](plugin); ok { if err := plugin.InitGenesis(ctx, genState); err != nil { @@ -44,15 +44,15 @@ func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { } // Insert to chain. - k.polaris.Blockchain(). + k.chain. PreparePlugins(ctx.WithEventManager(sdk.NewEventManager())) - return k.polaris.Blockchain().InsertBlockWithoutSetHead(genState.ToBlock()) + return k.chain.InsertBlockWithoutSetHead(genState.ToBlock()) } // ExportGenesis returns the exported genesis state. func (k *Keeper) ExportGenesis(ctx sdk.Context) *core.Genesis { genesisState := new(core.Genesis) - for _, plugin := range k.host.GetAllPlugins() { + for _, plugin := range k.Host.GetAllPlugins() { if plugin, ok := utils.GetAs[plugins.HasGenesis](plugin); ok { plugin.ExportGenesis(ctx, genesisState) } diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index a4a1c66976..3437b469ca 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -39,17 +39,9 @@ import ( ) // Compile-time interface assertion. -var _ core.PolarisHostChain = (*host)(nil) - -// Host is the interface that must be implemented by the host. -// It includes core.PolarisHostChain and functions that are called in other packages. -type Host interface { - core.PolarisHostChain - GetAllPlugins() []any - SetupPrecompiles() error -} +var _ core.PolarisHostChain = (*Host)(nil) -type host struct { +type Host struct { // The various plugins that are are used to implement core.PolarisHostChain. bp block.Plugin cp configuration.Plugin @@ -74,9 +66,9 @@ func NewHost( precompiles func() *ethprecompile.Injector, qc func() func(height int64, prove bool) (sdk.Context, error), logger log.Logger, -) Host { +) *Host { // We setup the host with some Cosmos standard sauce. - h := &host{} + h := &Host{} // Build the Plugins h.bp = block.NewPlugin(storeKey, sk) @@ -89,7 +81,6 @@ func NewHost( h.logger = logger // Setup the state, precompile, historical, and txpool plugins - // TODO: re-enable historical plugin using ABCI listener. h.hp = historical.NewPlugin(h.cp, h.bp, nil, h.storeKey) h.pp = precompile.NewPlugin() h.sp = state.NewPlugin(h.ak, h.storeKey, nil) @@ -100,7 +91,7 @@ func NewHost( } // SetupPrecompiles intializes the precompile contracts. -func (h *host) SetupPrecompiles() error { +func (h *Host) SetupPrecompiles() error { // Set the query context function for the block and state plugins pcs := h.pcs().GetPrecompiles() @@ -113,34 +104,34 @@ func (h *host) SetupPrecompiles() error { } // GetBlockPlugin returns the header plugin. -func (h *host) GetBlockPlugin() core.BlockPlugin { +func (h *Host) GetBlockPlugin() core.BlockPlugin { return h.bp } // GetConfigurationPlugin returns the configuration plugin. -func (h *host) GetConfigurationPlugin() core.ConfigurationPlugin { +func (h *Host) GetConfigurationPlugin() core.ConfigurationPlugin { return h.cp } // GetEnginePlugin returns the engine plugin. -func (h *host) GetEnginePlugin() core.EnginePlugin { +func (h *Host) GetEnginePlugin() core.EnginePlugin { return h.ep } -func (h *host) GetHistoricalPlugin() core.HistoricalPlugin { +func (h *Host) GetHistoricalPlugin() core.HistoricalPlugin { return h.hp } // GetPrecompilePlugin returns the precompile plugin. -func (h *host) GetPrecompilePlugin() core.PrecompilePlugin { +func (h *Host) GetPrecompilePlugin() core.PrecompilePlugin { return h.pp } // GetStatePlugin returns the state plugin. -func (h *host) GetStatePlugin() core.StatePlugin { +func (h *Host) GetStatePlugin() core.StatePlugin { return h.sp } // GetAllPlugins returns all the plugins. -func (h *host) GetAllPlugins() []any { +func (h *Host) GetAllPlugins() []any { return []any{h.bp, h.cp, h.hp, h.pp, h.sp} } diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index aefc75ac75..8823510a3f 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -21,32 +21,33 @@ package keeper import ( + "context" + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" - "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/node" - "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/core" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" - ethlog "pkg.berachain.dev/polaris/eth/log" - "pkg.berachain.dev/polaris/eth/polar" ) -var _ Host = (*host)(nil) +type Blockchain interface { + PreparePlugins(context.Context) + core.ChainWriter + core.ChainReader +} type Keeper struct { - // provider is the struct that houses the Polaris EVM. - polaris *polar.Polaris - // host represents the host chain - host Host + *Host + + // provider is the struct that houses the Polaris EVM. + chain Blockchain // TODO: remove this, because it's hacky af. storeKey storetypes.StoreKey @@ -71,67 +72,18 @@ func NewKeeper( qc, logger, ) - - node, err := polar.NewGethNetworkingStack(&polarisCfg.Node) - if err != nil { - panic(err) - } - - polaris := polar.NewWithNetworkingStack(&polarisCfg.Polar, host, node, ethlog.FuncHandler( - func(r *ethlog.Record) error { - polarisGethLogger := logger.With("module", "polaris-geth") - switch r.Lvl { //nolint:nolintlint,exhaustive // linter is bugged. - case ethlog.LvlTrace, ethlog.LvlDebug: - polarisGethLogger.Debug(r.Msg, r.Ctx...) - case ethlog.LvlInfo, ethlog.LvlWarn: - polarisGethLogger.Info(r.Msg, r.Ctx...) - case ethlog.LvlError, ethlog.LvlCrit: - polarisGethLogger.Error(r.Msg, r.Ctx...) - } - return nil - }), - ) - return &Keeper{ - polaris: polaris, - host: host, + Host: host, storeKey: storeKey, } } -// SetupPrecompiles initializes precompiles and the polaris node. -func (k *Keeper) SetupPrecompiles() error { - return k.host.SetupPrecompiles() -} - -// Init calls Init on the underlying polaris struct. -func (k *Keeper) Init() error { - return k.polaris.Init() +// SetBlock sets the underlying ethereum blockchain on the keeper. +func (k *Keeper) SetBlockchain(chain Blockchain) { + k.chain = chain } // Logger returns a module-specific logger. func (k *Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With(types.ModuleName) } - -// GetPolaris returns the Polaris instance. -func (k *Keeper) Polaris() *polar.Polaris { - return k.polaris -} - -// Register Services allows for the application to register lifecycles with the evm -// networking stack. -func (k *Keeper) RegisterServices(clientContext client.Context, lcs []node.Lifecycle) { - // TODO: probably get rid of engine plugin or something and handle rpc methods better. - k.host.GetEnginePlugin().(engine.Plugin).Start(clientContext) - - // Register the services with polaris. - for _, lc := range lcs { - k.polaris.RegisterService(lc) - } - - // Start the services. - if err := k.polaris.StartServices(); err != nil { - panic(err) - } -} diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 7a103fb3c0..536454047c 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -29,37 +29,43 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/core/types" ) func (k *Keeper) ProcessPayloadEnvelope( ctx context.Context, msg *evmtypes.WrappedPayloadEnvelope, ) (*evmtypes.WrappedPayloadEnvelopeResponse, error) { + var err error + var block *types.Block + + // TODO: maybe we just consume the block gas limit and call it a day? + sCtx := sdk.UnwrapSDKContext(ctx) + gasMeter := sCtx.GasMeter() + blockGasMeter := sCtx.BlockGasMeter() + + // Reset GasMeter to 0. + gasMeter.RefundGas(gasMeter.GasConsumed(), "reset before evm block") + blockGasMeter.RefundGas(blockGasMeter.GasConsumed(), "reset before evm block") + defer gasMeter.ConsumeGas(gasMeter.GasConsumed(), "reset after evm") + envelope := engine.ExecutionPayloadEnvelope{} - err := envelope.UnmarshalJSON(msg.Data) + err = envelope.UnmarshalJSON(msg.Data) if err != nil { return nil, fmt.Errorf("failed to unmarshal payload envelope: %w", err) } - sCtx := sdk.UnwrapSDKContext(ctx) - gasMeter := sCtx.GasMeter() - - block, err := engine.ExecutableDataToBlock(*envelope.ExecutionPayload, nil, nil) + block, err = engine.ExecutableDataToBlock(*envelope.ExecutionPayload, nil, nil) if err != nil { k.Logger(sCtx).Error("failed to build evm block", "err", err) return nil, err } // Prepare should be moved to the blockchain? THIS IS VERY HOOD YES NEEDS TO BE MOVED. - k.polaris.Blockchain(). - PreparePlugins(ctx) - - if err = k.polaris.Blockchain().InsertBlockWithoutSetHead(block); err != nil { + k.chain.PreparePlugins(ctx) + if err = k.chain.InsertBlockWithoutSetHead(block); err != nil { return nil, err } - // Consume the gas used by the execution of the ethereum block. - gasMeter.ConsumeGas(block.GasUsed(), "block gas used") - return &evmtypes.WrappedPayloadEnvelopeResponse{}, nil } diff --git a/cosmos/x/evm/module.go b/cosmos/x/evm/module.go index c3b1cc6e3d..c6e9810b1d 100644 --- a/cosmos/x/evm/module.go +++ b/cosmos/x/evm/module.go @@ -21,6 +21,8 @@ package evm import ( + "context" + gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" "google.golang.org/grpc" @@ -41,9 +43,11 @@ import ( const ConsensusVersion = 1 var ( - _ appmodule.HasServices = AppModule{} - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} + _ appmodule.HasServices = AppModule{} + _ appmodule.HasPrepareCheckState = AppModule{} + _ appmodule.HasPrecommit = AppModule{} + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} ) // ============================================================================== @@ -121,3 +125,11 @@ func (am AppModule) RegisterServices(registrar grpc.ServiceRegistrar) error { // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion } + +func (am AppModule) PrepareCheckState(ctx context.Context) error { + return am.keeper.PrepareCheckState(ctx) +} + +func (am AppModule) Precommit(ctx context.Context) error { + return am.keeper.Precommit(ctx) +} diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 4289bb76f6..1ee99123f2 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -115,6 +115,8 @@ type plugin struct { dbErr error mu sync.Mutex + + latestState sdk.Context } // NewPlugin returns a plugin with the given context and keepers. @@ -136,14 +138,10 @@ func (p *plugin) SetPrecompileLogFactory(plf events.PrecompileLogFactory) { p.plf = plf } -// Prepare sets up the context on the state plugin for a new block. It sets the gas configs to be 0 -// so that query calls to the EVM (ones that do not invoke a new transaction) do not charge gas. -// +// Prepare sets up the context on the state plugin for use in JSON-RPC calls. // Prepare implements `core.StatePlugin`. func (p *plugin) Prepare(ctx context.Context) { - p.ctx = sdk.UnwrapSDKContext(ctx). - WithKVGasConfig(storetypes.GasConfig{}). - WithTransientKVGasConfig(storetypes.GasConfig{}) + p.latestState = sdk.UnwrapSDKContext(ctx) } // Reset sets up the state plugin for execution of a new transaction. It sets up the snapshottable @@ -198,6 +196,10 @@ func (p *plugin) Error() error { return p.dbErr } +func (p *plugin) Finalize() { + p.Controller.Finalize() +} + // =========================================================================== // Accounts // =========================================================================== @@ -539,12 +541,12 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { int64Number := int64(number) // TODO: the GTE may be hiding a larger issue with the timing of the NewHead channel stuff. // Investigate and hopefully remove this GTE. - if int64Number >= p.ctx.BlockHeight() { + if int64Number >= p.latestState.BlockHeight() { // TODO: Manager properly - if p.ctx.MultiStore() == nil { - ctx = p.ctx.WithEventManager(sdk.NewEventManager()) + if p.latestState.MultiStore() == nil { + ctx = p.latestState.WithEventManager(sdk.NewEventManager()) } else { - ctx, _ = p.ctx.CacheContext() + ctx, _ = p.latestState.CacheContext() } } else { // Get the query context at the given height. @@ -558,7 +560,7 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // Create a State Plugin with the requested chain height. sp := NewPlugin(p.ak, p.storeKey, p.plf) // TODO: Manager properly - if p.ctx.MultiStore() != nil { + if p.latestState.MultiStore() != nil { sp.Reset(ctx) } return sp, nil diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index b921c09ea1..4b0a8591a0 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -8,8 +8,8 @@ require ( github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible - pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 ) require ( diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index b29bcd1816..d9b8985359 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -318,9 +318,9 @@ gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= +pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 h1:f3q5VqypSV1a2UijGbRbzFyqYmz37lISmjWXPwD3wEE= +pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 28d9b4b9a0..0018981f29 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -10,9 +10,9 @@ require ( github.com/cosmos/gogoproto v1.4.11 github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 - pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 ) require ( @@ -32,7 +32,6 @@ require ( github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.8.0 // indirect @@ -88,16 +87,13 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.1.0 // indirect - github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -110,11 +106,11 @@ require ( github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.1 // indirect github.com/hashicorp/go-plugin v1.5.1 // indirect + github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/huandu/skiplist v1.2.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect @@ -124,22 +120,19 @@ require ( github.com/klauspost/compress v1.16.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/linxGnu/grocksdb v1.8.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce // indirect github.com/oklog/run v1.1.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/opencontainers/runc v1.1.5 // indirect @@ -153,7 +146,6 @@ require ( github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.9.0 // indirect github.com/rs/zerolog v1.30.0 // indirect @@ -198,8 +190,6 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a // indirect - pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 5147bf6826..b2f44a331e 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -80,17 +80,12 @@ github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bw github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -112,7 +107,6 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= @@ -160,8 +154,6 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= @@ -348,6 +340,7 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= @@ -634,7 +627,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -792,7 +784,6 @@ github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -918,7 +909,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= @@ -1002,7 +992,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1072,7 +1061,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1084,7 +1072,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1132,6 +1119,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1155,7 +1143,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1235,11 +1222,11 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1415,16 +1402,12 @@ nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a h1:QMJRzQpU3/i5WBakrL5V0TE5CcEshC60nw1Ek+bJpJg= -pkg.berachain.dev/polaris/cosmos v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:iOYy1eb3YLCOwnsoo7THyx7qny9Qt3zWpBRmtP6cNSU= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a h1:flqfT2k9hTMooU5d/bdaIpQrU9uvTsZ93cUAVXw4JQs= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:TZhwmadAUlnyf450t7suO5sN3AGRNE3qziXldP58rUs= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a h1:TAMeBYTswT2XHozvQXw8BTpP0hbaG4btnw8B03wuLz8= -pkg.berachain.dev/polaris/eth v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:joeZS5xk3XFpcKlvA1YrETzc6MX6lGkbXZEL+ifKsiM= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231011003341-63d98bc34da2 h1:cmJUWo6DqtLUEZ1vo0dfb/QNfertRLFPkTesY9KNhJI= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231011003341-63d98bc34da2/go.mod h1:6IhsZjEMihGyxVvTUiE7coWiCJq7DRBEdbTnMo7bOnc= +pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 h1:f3q5VqypSV1a2UijGbRbzFyqYmz37lISmjWXPwD3wEE= +pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index b05236adcd..9337c96a80 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -42,7 +42,6 @@ import ( "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -54,16 +53,10 @@ import ( slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/ethereum/go-ethereum/node" - evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" - libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" - "pkg.berachain.dev/polaris/cosmos/miner" - "pkg.berachain.dev/polaris/cosmos/txpool" - evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" - evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + polarruntime "pkg.berachain.dev/polaris/cosmos/runtime" ) // DefaultNodeHome default home directories for the application daemon. @@ -97,12 +90,9 @@ type SimApp struct { EvidenceKeeper evidencekeeper.Keeper ConsensusParamsKeeper consensuskeeper.Keeper - // polaris keepers - EVMKeeper *evmkeeper.Keeper - - // polaris componets - mm *miner.Miner - mp *txpool.Mempool + // polaris contains all the required components for the + // polaris evm. + polaris *polarruntime.Polaris } //nolint:gochecknoinits // from sdk. @@ -128,20 +118,22 @@ func NewPolarisApp( baseAppOptions ...func(*baseapp.BaseApp), ) *SimApp { var ( - app = &SimApp{} + app = &SimApp{polaris: &polarruntime.Polaris{}} appBuilder *runtime.AppBuilder // merge the AppConfig and other configuration in one config appConfig = depinject.Configs( MakeAppConfig(bech32Prefix), depinject.Provide( signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], - signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope]), + signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope], + polarruntime.ProvidePolarisRuntime, + ), depinject.Supply( // supply the application options appOpts, // supply the logger logger, - // ADVANCED CONFIGURATION + // ADVANCED CONFIGURATION\ PolarisConfigFn(evmconfig.MustReadConfigFromAppOpts(appOpts)), PrecompilesToInject(app), QueryContextFn(app), @@ -186,7 +178,8 @@ func NewPolarisApp( &app.UpgradeKeeper, &app.EvidenceKeeper, &app.ConsensusParamsKeeper, - &app.EVMKeeper, + &app.polaris, + &app.polaris.EVMKeeper, ); err != nil { panic(err) } @@ -194,29 +187,14 @@ func NewPolarisApp( // Build the app using the app builder. app.App = appBuilder.Build(db, traceStore, baseAppOptions...) - // SetupPrecompiles is used to setup the precompile contracts post depinject. - if err := app.EVMKeeper.SetupPrecompiles(); err != nil { + // Initialize Polaris Runtime. + if err := app.polaris.Setup(app.BaseApp); err != nil { panic(err) } - // Init is used to setup the polaris struct. - if err := app.EVMKeeper.Init(); err != nil { - panic(err) - } - - // Setup TxPool Wrapper - app.mp = txpool.New(app.EVMKeeper.Polaris().TxPool()) - app.SetMempool(app.mp) - - // Setup Miner Wrapper - app.mm = miner.New(app.EVMKeeper.Polaris().Miner()) - app.SetPrepareProposal(app.mm.PrepareProposal) - // Set the ante handler to nil, since it is not needed. app.SetAnteHandler(nil) - // ----- END EVM SETUP ------------------------------------------------- - // register streaming services if err := app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { panic(err) @@ -228,16 +206,15 @@ func NewPolarisApp( // RegisterUpgradeHandlers is used for registering any on-chain upgrades. app.RegisterUpgradeHandlers() + // Load the app. if err := app.Load(loadLatest); err != nil { panic(err) } - cmsCtx := sdk.Context{}. - WithMultiStore(app.CommitMultiStore()). - WithGasMeter(storetypes.NewInfiniteGasMeter()). - WithBlockGasMeter(storetypes.NewInfiniteGasMeter()).WithEventManager(sdk.NewEventManager()) - if err := app.EVMKeeper.Polaris().Blockchain(). - LoadLastState(cmsCtx, uint64(app.LastBlockHeight())); err != nil { + // Load the last state of the polaris evm. + if err := app.polaris.LoadLastState( + app.CommitMultiStore(), uint64(app.LastBlockHeight()), + ); err != nil { panic(err) } @@ -282,23 +259,14 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon panic(err) } - // Create the Serializers. - txSerializer := libtx.NewSerializer(apiSvr.ClientCtx.TxConfig, evmtypes.WrapTx) - payloadSerializer := libtx.NewSerializer(apiSvr.ClientCtx.TxConfig, evmtypes.WrapPayload) - - // Initialize services. - app.mm.Init(payloadSerializer) - app.mp.Init(app.Logger(), apiSvr.ClientCtx, txSerializer) - - // Register services with Polaris. - app.EVMKeeper.RegisterServices(apiSvr.ClientCtx, []node.Lifecycle{ - app.mp, - }) + if err := app.polaris.Init(apiSvr.ClientCtx, app.Logger()); err != nil { + panic(err) + } } // Close shuts down the application. func (app *SimApp) Close() error { - if pl := app.EVMKeeper.Polaris(); pl != nil { + if pl := app.polaris; pl != nil { return pl.Close() } return app.BaseApp.Close() diff --git a/e2e/testapp/app_config.go b/e2e/testapp/app_config.go index ca2eade790..0807972e0c 100644 --- a/e2e/testapp/app_config.go +++ b/e2e/testapp/app_config.go @@ -123,6 +123,9 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { // there is nothing left over in the validator fee pool, so as to keep the // CanWithdrawInvariant invariant. // NOTE: staking module is required if HistoricalEntries param > 0 + PrepareCheckStaters: []string{ + evmtypes.ModuleName, + }, PreBlockers: []string{ upgradetypes.ModuleName, }, @@ -140,6 +143,9 @@ func MakeAppConfig(bech32Prefix string) depinject.Config { stakingtypes.ModuleName, genutiltypes.ModuleName, }, + Precommiters: []string{ + evmtypes.ModuleName, + }, OverrideStoreKeys: []*runtimev1alpha1.StoreKeyConfig{ { ModuleName: authtypes.ModuleName, diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index e1d320e347..eebea332dd 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -35,7 +35,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.0-rc.1 github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect - github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index f7a13444d4..e3217d747d 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -1,1874 +1,307 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI= -cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= -cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= -cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= -cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= -cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= -cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= -cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= -cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= -cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= -cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 h1:axKhxRa3M9QW2GdKJUsSyzo44gxcwSOTGeomtkbQClM= -cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508/go.mod h1:qcJ1zwLIMefpDHZuYSa73yBe/k5HyQ5H1Jg9PWv30Ts= cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6IDE38o0Wp8xE/+BAxocb0oyX4I= -cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= -cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d h1:LH8NPa2+yoMFdCTxCFyQUX5zVDip4YDgtg7e0EecDqo= -cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d/go.mod h1:+5jCm6Lk/CrQhQvtJFy/tmuLfhQKNMn/U0vwrRz/dxQ= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= -filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= -github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= -github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.312 h1:llrElfzeqG/YOLFFKjg1xNpZCFJ2xraIi3PqSuP+95k= -github.com/aws/aws-sdk-go v1.44.312/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= -github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= -github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= -github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= -github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= -github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= -github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= -github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= -github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= -github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= -github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= -github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= -github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= -github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= -github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= -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/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= -github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= -github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= -github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= -github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= -github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= -github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -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= github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= -github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= -github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= -github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= -github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= -github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= -github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/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.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= -github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= -github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= -github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/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/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= -github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= -github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= -golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -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= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -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= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -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= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65 h1:pxqHh3Ifn4csuTfoc6pSieQLXMHBkFStSROwY3fElXA= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65/go.mod h1:pdtZOZgwQTMcs04WLEWVrsg/Y0SVAqCZftIQ6cWVkgo= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index fa1f9a002f..322878a9d2 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -64,6 +64,7 @@ import ( evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" + polarruntime "pkg.berachain.dev/polaris/cosmos/runtime" testapp "pkg.berachain.dev/polaris/e2e/testapp" ) @@ -90,6 +91,7 @@ func NewRootCmd() *cobra.Command { simtestutil.NewAppOptionsWithFlagHome(tempDir()), ), depinject.Provide( + polarruntime.ProvidePolarisRuntime, signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope]), ), diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 96f3b43b2a..9627211b6b 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -48,6 +48,7 @@ func (bc *blockchain) StateAtBlockNumber(number uint64) (state.StateDB, error) { if err != nil { return nil, err } + return state.NewStateDB(sp, bc.pp), nil } diff --git a/eth/go.mod b/eth/go.mod index e0709d6026..d09a505de0 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -12,8 +12,8 @@ require ( github.com/onsi/gomega v1.27.10 github.com/stretchr/testify v1.8.4 golang.org/x/text v0.13.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a - pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a + pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2 ) require ( diff --git a/eth/go.sum b/eth/go.sum index 02c5b4746f..9e956bdb12 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -436,10 +436,10 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a h1:D8XJK/YnpTseGGETCA9ArU369nFTrYTYGsmofgN49G0= -pkg.berachain.dev/polaris/contracts v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:pkgCryQfjPpCfmHJ7hEv6/0PoTwgG6uDc0cIQpMEBYg= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a h1:cfaVkMfNtPr8UCrlpbpmjHJYsv18w+CVPhKg91Ng7NY= -pkg.berachain.dev/polaris/lib v0.0.0-20230919154905-0c53dfe1360a/go.mod h1:Qe/PmVj+gplJrsJsmdcWFTHw+DyraM67wk9nqFMnHmk= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= +pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2 h1:XV+f50FxTAbJcQCIXPV6CzDiHsRj5YX+qlPjk+Hg1IA= +pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2/go.mod h1:OcMl9wH8872Q4++ikKXIm1FC4FbuGUWHxrjb6LCzvIY= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/eth/log/imported.go b/eth/log/imported.go index 1a567bbfbc..3759c7c57c 100644 --- a/eth/log/imported.go +++ b/eth/log/imported.go @@ -61,4 +61,6 @@ var ( // Warn is the warning log level. Warn = log.Warn + + Error = log.Error ) diff --git a/eth/polar/backend.go b/eth/polar/backend.go index fc18724ad8..cf9f3ff057 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -134,6 +134,11 @@ func NewWithNetworkingStack( // Init initializes the Polaris struct. func (pl *Polaris) Init() error { var err error + + // Run safety message for feedback to the user if they are running + // with development configs. + pl.config.SafetyMessage() + // For now, we only have a legacy pool, we will implement blob pool later. legacyPool := legacypool.New( pl.config.LegacyTxPool, pl.Blockchain(), diff --git a/eth/polar/config.go b/eth/polar/config.go index 6a3d5b4182..aa47c46b05 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/miner" "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/log" "pkg.berachain.dev/polaris/eth/params" ) @@ -39,6 +40,11 @@ const ( // gpoDefault is the default gpo starting point. gpoDefault = 1000000000 + + // developmentCoinbase is the address used for development. + // DO NOT USE IN PRODUCTION. + // 0xf8637fa70e8e329ecb8463b788d96914f8cfe191d15ae36f161227629e3f5693. + developmentCoinbase = "0xAf15f95bed0D3913a29092Fd7837451Ce4de64D3" ) // DefaultConfig returns the default JSON-RPC config. @@ -46,8 +52,8 @@ func DefaultConfig() *Config { gpoConfig := ethconfig.FullNodeGPO gpoConfig.Default = big.NewInt(gpoDefault) minerCfg := miner.DefaultConfig + minerCfg.Etherbase = common.HexToAddress(developmentCoinbase) // TODO: setup proper command line flags - minerCfg.Etherbase = common.Address{1} return &Config{ Chain: *params.DefaultChainConfig, Miner: minerCfg, @@ -59,6 +65,16 @@ func DefaultConfig() *Config { } } +// SafetyMessage is a safety check for the JSON-RPC config. +func (c *Config) SafetyMessage() { + if c.Miner.Etherbase == common.HexToAddress(developmentCoinbase) { + log.Error( + "development etherbase in use - please verify this is intentional", "address", + c.Miner.Etherbase, + ) + } +} + // Config represents the configurable parameters for Polaris. type Config struct { // The chain configuration to use. diff --git a/go.work.sum b/go.work.sum index f0e2fcc211..c81314c5e2 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,9 +1,29 @@ +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= @@ -14,14 +34,26 @@ cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuv cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= @@ -30,10 +62,15 @@ cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= @@ -44,44 +81,79 @@ cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqm cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= @@ -94,20 +166,32 @@ cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2 cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0 h1:PKggmegChZulPW8yvtziF8P9UOuVFwbvylbEucTNups= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= @@ -116,8 +200,12 @@ cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= @@ -128,20 +216,32 @@ cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+ cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= @@ -150,14 +250,22 @@ cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7 cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= @@ -165,40 +273,71 @@ cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpF cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/storage v1.14.0 h1:6RRlFMv1omScs6iq2hfE3IvgE+l6RfJPampq8UZc5TU= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= @@ -211,9 +350,14 @@ cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zX cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= @@ -222,12 +366,20 @@ cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmX cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= +cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508/go.mod h1:qcJ1zwLIMefpDHZuYSa73yBe/k5HyQ5H1Jg9PWv30Ts= +cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= +cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d/go.mod h1:+5jCm6Lk/CrQhQvtJFy/tmuLfhQKNMn/U0vwrRz/dxQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= @@ -282,6 +434,10 @@ github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= +github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.312/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= @@ -304,14 +460,15 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= @@ -331,6 +488,7 @@ github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= @@ -350,8 +508,10 @@ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= +github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= @@ -368,6 +528,8 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaI github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= @@ -424,11 +586,43 @@ github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= @@ -440,10 +634,13 @@ github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtX github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= @@ -475,6 +672,8 @@ github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= @@ -504,6 +703,7 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= @@ -532,6 +732,7 @@ github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqA github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= @@ -659,6 +860,8 @@ github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzH github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= @@ -700,34 +903,211 @@ go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= +google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= +pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65/go.mod h1:pdtZOZgwQTMcs04WLEWVrsg/Y0SVAqCZftIQ6cWVkgo= +pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= +pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= From 24fa5d10ba87d478967dc521b007fe68e31b95f7 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 12 Oct 2023 13:48:18 -0400 Subject: [PATCH 087/122] fix(rpc): fix estimate gas --- cosmos/go.mod | 2 +- cosmos/go.sum | 4 +- e2e/testapp/go.mod | 11 +- e2e/testapp/go.sum | 1577 +++++++++++++++++++++++++++++++++++++++++++- eth/go.mod | 2 +- eth/go.sum | 4 +- go.work.sum | 6 +- 7 files changed, 1584 insertions(+), 22 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index 4b91ec627d..8da0f0e3a9 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/cosmos/go.sum b/cosmos/go.sum index 97c6bfbbd1..299b78f4bd 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -110,8 +110,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= -github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index eebea332dd..23b888f687 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,7 +4,7 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 @@ -15,8 +15,8 @@ require ( cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d - pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65 - pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 + pkg.berachain.dev/polaris/cosmos v0.0.0-20231012162131-c1edabdcf30e + pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 ) require ( @@ -61,7 +61,6 @@ require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect @@ -270,8 +269,8 @@ require ( gotest.tools/v3 v3.5.0 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 // indirect - pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 // indirect + pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 // indirect + pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index e3217d747d..30c8108945 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -1,307 +1,1872 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI= +cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= +cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= +cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= +cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= +cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= +cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= +cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= +cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 h1:axKhxRa3M9QW2GdKJUsSyzo44gxcwSOTGeomtkbQClM= +cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508/go.mod h1:qcJ1zwLIMefpDHZuYSa73yBe/k5HyQ5H1Jg9PWv30Ts= cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6IDE38o0Wp8xE/+BAxocb0oyX4I= +cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= +cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d h1:LH8NPa2+yoMFdCTxCFyQUX5zVDip4YDgtg7e0EecDqo= +cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d/go.mod h1:+5jCm6Lk/CrQhQvtJFy/tmuLfhQKNMn/U0vwrRz/dxQ= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.312 h1:llrElfzeqG/YOLFFKjg1xNpZCFJ2xraIi3PqSuP+95k= +github.com/aws/aws-sdk-go v1.44.312/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= +github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= +github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.0 h1:ogKnpiPX7gxCvqTEF4ly25/wAxUqf181t30P3vqdpdc= +github.com/cometbft/cometbft v0.38.0/go.mod h1:5Jz0Z8YsHSf0ZaAqGvi/ifioSdVFPtEGrm8Y9T/993k= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.0 h1:1OnSpOykNkUIBIBJKdhwy2p0JlW5o+Az02ICzZmvvdg= +github.com/consensys/gnark-crypto v0.12.0/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E= +github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= +github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= +github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= +github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= +github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= +github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= +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/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= +github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= +github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emicklei/dot v1.6.0 h1:vUzuoVE8ipzS7QkES4UfxdpCwdU2U97m2Pb2tQCoYRY= +github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= +github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= +github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= +github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +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= github.com/hashicorp/go-bexpr v0.1.12 h1:XrdVhmwu+9iYxIUWxsGVG7NQwrhzJZ0vR6nbN5bLgrA= +github.com/hashicorp/go-bexpr v0.1.12/go.mod h1:ACktpcSySkFNpcxWSClFrut7wicd9WzisnvHuw+g9K8= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= +github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/Hqck/U= +github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= +github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= +github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= +github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/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.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= +github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= +github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/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/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= +github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= +github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +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= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +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= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +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= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= +golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +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= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= +google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354 h1:ot7e/6InxTBcPq8Rg/4cog4JbsAxnPakaghUaI+vYXY= -pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65 h1:pxqHh3Ifn4csuTfoc6pSieQLXMHBkFStSROwY3fElXA= -pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354 h1:xVRqWkLJmjExDCWHg/mCGFqSif51+eucyP8TJuLseiM= -pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354 h1:QcNeLF3LUwwaEOsV6fdILiLH+BAsCcO+Um/nU1NsZ1w= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 h1:q9gSJk2kQQbz/3cPcXGCW+JdQvxAm+7ukcDqzZiUcmw= +pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231012162131-c1edabdcf30e h1:wpN0jFBorlIymQH41f1Wx1MHgODABs1sAeHMI6fg1kw= +pkg.berachain.dev/polaris/cosmos v0.0.0-20231012162131-c1edabdcf30e/go.mod h1:SeId0o7/S/oz7n7Ix9GMihe49jCZIDpTTBPyVReyM7k= +pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 h1:gOqKP7ZCzIU1NZrwdISnxswAatut/6Xi7JjdSpHbZk8= +pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= +pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4 h1:3zGPs5JJpBtysLMNWa5wKEhwC+j3p5AAK0gZ1fWuEc8= +pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4/go.mod h1:OcMl9wH8872Q4++ikKXIm1FC4FbuGUWHxrjb6LCzvIY= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/eth/go.mod b/eth/go.mod index d09a505de0..afe77d4f66 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 require ( github.com/ethereum/go-ethereum v1.13.1 diff --git a/eth/go.sum b/eth/go.sum index 9e956bdb12..7f4ca58dc0 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -12,8 +12,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c h1:EVtFobLk6FtW51prPJwcq1YUStrYoGDfSTaOWt/ClN4= -github.com/berachain/polaris-geth v0.0.0-20231010014032-30e3547d965c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= diff --git a/go.work.sum b/go.work.sum index c81314c5e2..ea5a88fb38 100644 --- a/go.work.sum +++ b/go.work.sum @@ -460,6 +460,8 @@ github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= +github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= @@ -941,7 +943,6 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= @@ -973,7 +974,6 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= @@ -1006,9 +1006,7 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= From 85b7adce6b017bc43a85d3e0e0bc55734c93d702 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 12 Oct 2023 13:57:58 -0400 Subject: [PATCH 088/122] refactor(chain): improve log string --- eth/core/chain_writer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 7c3ace4a49..1afa721e74 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -90,7 +90,7 @@ func (bc *blockchain) InsertBlock( // *********************************************** // blockHash, blockNum := block.Hash(), block.Number().Uint64() bc.logger.Info( - "finalizing evm block", "block_hash", blockHash.Hex(), "num_txs", len(receipts)) + "finalizing evm block", "hash", blockHash.Hex(), "num_txs", len(receipts)) // store the block header on the host chain err = bc.bp.StoreHeader(block.Header()) From f7e455f6f80e39441ffe171d70cdbeb520ec29c5 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 13 Oct 2023 15:59:16 -0400 Subject: [PATCH 089/122] chore(app): Setup app better. (#1224) --- .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- cosmos/config/mocks/app_options.go | 2 +- cosmos/runtime/depinject.go | 83 ------ .../runtime/logging.go | 38 +-- cosmos/runtime/runtime.go | 76 ++++-- cosmos/txpool/mocks/geth_tx_pool.go | 2 +- cosmos/txpool/mocks/lifecycle.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_broadcaster.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- cosmos/x/evm/depinject.go | 2 - cosmos/x/evm/genesis_test.go | 21 +- cosmos/x/evm/interfaces.go | 6 - cosmos/x/evm/keeper/genesis.go | 2 +- cosmos/x/evm/keeper/host.go | 47 ++-- cosmos/x/evm/keeper/keeper.go | 15 +- cosmos/x/evm/keeper/processor.go | 15 +- cosmos/x/evm/plugins/block/header.go | 11 - cosmos/x/evm/plugins/block/header_test.go | 6 +- cosmos/x/evm/plugins/block/interfaces.go | 39 --- cosmos/x/evm/plugins/block/plugin.go | 41 +-- cosmos/x/evm/plugins/configuration/plugin.go | 54 ---- .../evm/plugins/historical/historical_data.go | 2 +- cosmos/x/evm/plugins/historical/interfaces.go | 25 -- cosmos/x/evm/plugins/historical/plugin.go | 13 +- .../x/evm/plugins/historical/plugin_test.go | 4 +- .../x/evm/plugins/precompile/plugin_test.go | 2 +- cosmos/x/evm/plugins/state/genesis_test.go | 2 +- cosmos/x/evm/plugins/state/plugin.go | 21 +- .../plugins/state/plugin_benchmark_test.go | 2 +- cosmos/x/evm/plugins/state/plugin_test.go | 2 +- e2e/testapp/app.go | 49 ++-- e2e/testapp/polard/cmd/root.go | 2 - eth/core/chain.go | 15 +- eth/core/chain_resources.go | 2 + eth/core/chain_writer.go | 2 +- eth/core/host.go | 19 -- eth/core/mock/block_plugin.mock.go | 90 +------ eth/core/mock/config_plugin.mock.go | 114 -------- eth/core/mock/host.go | 54 ---- eth/core/mock/host.mock.go | 254 ------------------ eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/polar_state_db.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- eth/core/types/transaction.rlpgen.go | 3 - eth/crypto/imported.go | 30 +-- eth/params/imported.go | 3 - eth/polar/backend.go | 23 +- 62 files changed, 225 insertions(+), 1012 deletions(-) delete mode 100644 cosmos/runtime/depinject.go rename eth/core/mock/config_plugin.go => cosmos/runtime/logging.go (59%) delete mode 100644 cosmos/x/evm/plugins/block/interfaces.go delete mode 100644 cosmos/x/evm/plugins/configuration/plugin.go delete mode 100644 cosmos/x/evm/plugins/historical/interfaces.go delete mode 100644 eth/core/mock/config_plugin.mock.go delete mode 100644 eth/core/mock/host.go delete mode 100644 eth/core/mock/host.mock.go diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index a6277b2955..5bcb39485f 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -59,7 +59,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea2646970667358221220b8747d134404de4f68ec89426a62d8617708e74ff07ea4e11939db7028c8355664736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea26469706673582212204851c65929628c6917f205d63c2ed1fe53414a6ef5256c40efcb934edb9babd164736f6c63430008150033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index 3ed97e890f..7f38d198c2 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220d55ff6e47540c6013ff6f852d1f50dafdad161b2c9b5cc3e82260979ddd5d45864736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index 2c1f8a9225..1534feef92 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea2646970667358221220eb7f57407b06306a368cfd6b44ffe4a4c87116d2894dad0b67f2516e7d8ff05564736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea264697066735822122043654432997c95922bfcf12c9cded90160bd69b0223f1939299c88cc6eb9f4c664736f6c63430008150033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index fd4f26d9ec..c571e43323 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -80,7 +80,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea26469706673582212206e68cc9e1af8c1457b7c19bae135a8ae3e3ab13687c25f67afeb4537de87481464736f6c63430008150033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea26469706673582212203a7ddd435312b1bb86536949e71389633ba2796df3994b5da3a8ce07417a5b4264736f6c63430008150033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 30836b560e..74deba0f5b 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220c7e84b6db206f5d9266ae734b492fdafba600b28130ce87ee834c4d9603e490864736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220e1befea2f1d88361e22fa46de66a0946314b8d5bf3a55903625d53ee040c04d264736f6c63430008150033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index bbca3ec106..d90f5ec8c9 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122026d74557dd2a531de3f06b31fa0092f284f80f0768ed6793e01c3bd2f031323764736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122032de415702619c2679a6596f73b8062fb27ef9e79eecaa57e39997b2e4430c3864736f6c63430008150033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index 10953f09ae..ee50028de0 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea26469706673582212202e51cf7fd61df0464d3a27dd6535d12e463c0bf3246e7a15387d926c38d7288764736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go index 3dab32675a..75bd3c1a4d 100644 --- a/cosmos/config/mocks/app_options.go +++ b/cosmos/config/mocks/app_options.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/runtime/depinject.go b/cosmos/runtime/depinject.go deleted file mode 100644 index d6ada38e17..0000000000 --- a/cosmos/runtime/depinject.go +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package runtime - -import ( - "cosmossdk.io/depinject" - "cosmossdk.io/log" - - "pkg.berachain.dev/polaris/cosmos/config" - evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" - ethlog "pkg.berachain.dev/polaris/eth/log" - "pkg.berachain.dev/polaris/eth/polar" -) - -// DepInjectInput is the input for the dep inject framework. -type DepInjectInput struct { - depinject.In - - Logger log.Logger - EVMKeeper *evmkeeper.Keeper - Config func() *config.Config -} - -// DepInjectOutput is the output for the dep inject framework. -type DepInjectOutput struct { - depinject.Out - - Polaris *Polaris -} - -// ProvidePolarisRuntime creates a new Polaris runtime from the provided -// dependencies. -func ProvidePolarisRuntime(input DepInjectInput) DepInjectOutput { - cfg := input.Config() - node, err := polar.NewGethNetworkingStack(&cfg.Node) - if err != nil { - panic(err) - } - - polaris := polar.NewWithNetworkingStack( - &cfg.Polar, input.EVMKeeper.Host, node, ethlog.FuncHandler( - func(r *ethlog.Record) error { - polarisGethLogger := input.Logger.With("module", "polaris-geth") - switch r.Lvl { //nolint:nolintlint,exhaustive // linter is bugged. - case ethlog.LvlTrace: - case ethlog.LvlDebug: - polarisGethLogger.Debug(r.Msg, r.Ctx...) - case ethlog.LvlInfo: - polarisGethLogger.Info(r.Msg, r.Ctx...) - case ethlog.LvlWarn: - case ethlog.LvlCrit: - case ethlog.LvlError: - polarisGethLogger.Error(r.Msg, r.Ctx...) - } - return nil - }), - ) - - return DepInjectOutput{ - Polaris: &Polaris{ - Polaris: polaris, - EVMKeeper: input.EVMKeeper, - }, - } -} diff --git a/eth/core/mock/config_plugin.go b/cosmos/runtime/logging.go similarity index 59% rename from eth/core/mock/config_plugin.go rename to cosmos/runtime/logging.go index 9d2a53bf6c..5721a4b21d 100644 --- a/eth/core/mock/config_plugin.go +++ b/cosmos/runtime/logging.go @@ -18,27 +18,29 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package mock +package runtime import ( - "context" + "cosmossdk.io/log" - "pkg.berachain.dev/polaris/eth/params" + ethlog "pkg.berachain.dev/polaris/eth/log" ) -// const testBaseFee = 69 - -//go:generate moq -out ./config_plugin.mock.go -pkg mock ../ ConfigurationPlugin - -func NewConfigurationPluginMock() *ConfigurationPluginMock { - // make and configure a mocked core.ConfigurationPlugin - mockedConfigurationPlugin := &ConfigurationPluginMock{ - ChainConfigFunc: func() *params.ChainConfig { - return params.DefaultChainConfig - }, - PrepareFunc: func(contextMoqParam context.Context) { - // no-op - }, - } - return mockedConfigurationPlugin +// LoggerFuncHandler injects the cosmos-sdk logger into geth. +func LoggerFuncHandler(logger log.Logger) ethlog.Handler { + return ethlog.FuncHandler(func(r *ethlog.Record) error { + polarisGethLogger := logger.With("module", "polaris-geth") + switch r.Lvl { //nolint:nolintlint,exhaustive // linter is bugged. + case ethlog.LvlTrace: + case ethlog.LvlDebug: + polarisGethLogger.Debug(r.Msg, r.Ctx...) + case ethlog.LvlInfo: + polarisGethLogger.Info(r.Msg, r.Ctx...) + case ethlog.LvlWarn: + case ethlog.LvlCrit: + case ethlog.LvlError: + polarisGethLogger.Error(r.Msg, r.Ctx...) + } + return nil + }) } diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 6e217e18e0..9a31826911 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -31,52 +31,78 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/node" + "pkg.berachain.dev/polaris/cosmos/config" libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" "pkg.berachain.dev/polaris/cosmos/txpool" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" - enginep "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/polar" ) +// EVMKeeper is an interface that defines the methods needed for the EVM setup. +type EVMKeeper interface { + // Setup initializes the EVM keeper. + Setup(evmkeeper.Blockchain) error + + // TODO: remove. + StartEnginePlugin(client.Context) +} + +// Polaris is a struct that wraps the Polaris struct from the polar package. +// It also includes wrapped versions of the Geth Miner and TxPool. type Polaris struct { *polar.Polaris - // polaris keepers - EVMKeeper *evmkeeper.Keeper - - // polaris componets - WrappedMiner *miner.Miner + // WrappedMiner is a wrapped version of the Miner component. + WrappedMiner *miner.Miner + // WrappedTxPool is a wrapped version of the Mempool component. WrappedTxPool *txpool.Mempool } -func (p *Polaris) Setup(bApp *baseapp.BaseApp) error { - // SetupPrecompiles is used to setup the precompile contracts post depinject. - if err := p.EVMKeeper.SetupPrecompiles(); err != nil { - return err +// ProvidePolarisRuntime creates a new Polaris runtime from the provided +// dependencies. +func New(cfg *config.Config, logger log.Logger, host core.PolarisHostChain) *Polaris { + node, err := polar.NewGethNetworkingStack(&cfg.Node) + if err != nil { + panic(err) } - // Init is used to setup the polaris struct. - if err := p.Polaris.Init(); err != nil { - return err + polaris := polar.NewWithNetworkingStack( + &cfg.Polar, host, node, LoggerFuncHandler(logger), + ) + + return &Polaris{ + Polaris: polaris, } +} - // Setup TxPool Wrapper +// Setup is a function that sets up the Polaris struct. +// It takes a BaseApp and an EVMKeeper as arguments. +// It returns an error if the setup fails. +func (p *Polaris) Setup(bApp *baseapp.BaseApp, ek EVMKeeper) error { p.WrappedTxPool = txpool.New(p.TxPool()) bApp.SetMempool(p.WrappedTxPool) p.WrappedMiner = miner.New(p.Miner()) bApp.SetPrepareProposal(p.WrappedMiner.PrepareProposal) - // TODO: deprecate this - p.EVMKeeper.SetBlockchain(p.Blockchain()) + if err := ek.Setup(p.Blockchain()); err != nil { + return err + } + + // Set the ante handler to nil, since it is not needed. + bApp.SetAnteHandler(nil) return nil } -func (p *Polaris) Init(clientCtx client.Context, logger log.Logger) error { +// Init is a function that initializes the Polaris struct. +// It takes a client context and a logger as arguments. +// It returns an error if the initialization fails. +func (p *Polaris) Init(clientCtx client.Context, logger log.Logger, ek EVMKeeper) error { // Initialize services. p.WrappedMiner.Init(libtx.NewSerializer[*engine.ExecutionPayloadEnvelope]( clientCtx.TxConfig, evmtypes.WrapPayload)) @@ -88,15 +114,16 @@ func (p *Polaris) Init(clientCtx client.Context, logger log.Logger) error { p.RegisterServices(clientCtx, []node.Lifecycle{ p.WrappedTxPool, }) + + // + ek.StartEnginePlugin(clientCtx) return nil } -// Register Services allows for the application to register lifecycles with the evm -// networking stack. -func (p *Polaris) RegisterServices(clientContext client.Context, lcs []node.Lifecycle) { - // TODO: probably get rid of engine plugin or something and handle rpc methods better. - p.EVMKeeper.Host.GetEnginePlugin().(enginep.Plugin).Start(clientContext) - +// RegisterServices is a function that allows for the application to register lifecycles with +// the evm networking stack. It takes a client context and a slice of node.Lifecycle +// as arguments. +func (p *Polaris) RegisterServices(_ client.Context, lcs []node.Lifecycle) { // Register the services with polaris. for _, lc := range lcs { p.RegisterService(lc) @@ -108,6 +135,9 @@ func (p *Polaris) RegisterServices(clientContext client.Context, lcs []node.Life } } +// LoadLastState is a function that loads the last state of the Polaris struct. +// It takes a CommitMultiStore and an appHeight as arguments. +// It returns an error if the loading fails. func (p *Polaris) LoadLastState(cms storetypes.CommitMultiStore, appHeight uint64) error { cmsCtx := sdk.Context{}. WithMultiStore(cms). diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index d07f24ab9c..13e8837024 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index d298fc6edd..10149b6675 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index fb4978bad6..7dada2b96b 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index 40e832bdac..ce56bd8777 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index 005dac8dd9..ad301bbf86 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 5d23bf5718..5cf02ba74f 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index 84c81460f1..92f0989765 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/cosmos/x/evm/depinject.go b/cosmos/x/evm/depinject.go index 7f9da636b4..dbee502d48 100644 --- a/cosmos/x/evm/depinject.go +++ b/cosmos/x/evm/depinject.go @@ -57,7 +57,6 @@ type DepInjectInput struct { QueryContextFn func() func(height int64, prove bool) (sdk.Context, error) AccountKeeper AccountKeeper - StakingKeeper StakingKeeper } // DepInjectOutput is the output for the dep inject framework. @@ -77,7 +76,6 @@ func ProvideModule(in DepInjectInput) DepInjectOutput { k := keeper.NewKeeper( in.AccountKeeper, - in.StakingKeeper, in.Key, in.CustomPrecompiles, in.QueryContextFn, diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index e0ce86b08f..8f0157702b 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -29,14 +29,11 @@ import ( "cosmossdk.io/log" - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/ethereum/go-ethereum/consensus/beacon" "pkg.berachain.dev/polaris/cosmos/config" - "pkg.berachain.dev/polaris/cosmos/precompile/staking" testutil "pkg.berachain.dev/polaris/cosmos/testutil" "pkg.berachain.dev/polaris/cosmos/x/evm" "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -60,29 +57,25 @@ func TestGenesis(t *testing.T) { var _ = Describe("", func() { var ( - cdc codec.JSONCodec ctx sdk.Context - sc ethprecompile.StatefulImpl ak state.AccountKeeper - sk stakingkeeper.Keeper k *keeper.Keeper am evm.AppModule err error ) BeforeEach(func() { - ctx, ak, _, sk = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) + ctx, ak, _, _ = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) ctx = ctx.WithBlockHeight(0) - sc = staking.NewPrecompileContract(ak, &sk) cfg := config.DefaultConfig() ethGen.Config = params.DefaultChainConfig cfg.Node.DataDir = GinkgoT().TempDir() cfg.Node.KeyStoreDir = GinkgoT().TempDir() k = keeper.NewKeeper( - ak, sk, + ak, testutil.EvmKey, func() *ethprecompile.Injector { - return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{sc}...) + return ethprecompile.NewPrecompiles([]ethprecompile.Registrable{}...) }, func() func(height int64, prove bool) (sdk.Context, error) { return func(height int64, prove bool) (sdk.Context, error) { @@ -93,7 +86,7 @@ var _ = Describe("", func() { cfg, ) k.SetBlockchain( - core.NewChain(k.Host, beacon.NewFaker()), + core.NewChain(k.Host, params.DefaultChainConfig, beacon.NewFaker()), ) err = k.SetupPrecompiles() @@ -110,7 +103,7 @@ var _ = Describe("", func() { if err != nil { panic(err) } - am.InitGenesis(ctx, cdc, bz) + am.InitGenesis(ctx, nil, bz) }) When("the genesis is valid", func() { @@ -161,9 +154,9 @@ var _ = Describe("", func() { if err != nil { panic(err) } - am.InitGenesis(ctx, cdc, bz) + am.InitGenesis(ctx, nil, bz) - data := am.ExportGenesis(ctx, cdc) + data := am.ExportGenesis(ctx, nil) if data == nil { panic(fmt.Errorf("data is nil")) } diff --git a/cosmos/x/evm/interfaces.go b/cosmos/x/evm/interfaces.go index 8b47b0676f..eb1c7a9899 100644 --- a/cosmos/x/evm/interfaces.go +++ b/cosmos/x/evm/interfaces.go @@ -26,7 +26,6 @@ import ( addresscodec "cosmossdk.io/core/address" sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // AccountKeeper defines the expected account keeper. @@ -41,8 +40,3 @@ type AccountKeeper interface { RemoveAccount(ctx context.Context, account sdk.AccountI) IterateAccounts(ctx context.Context, cb func(account sdk.AccountI) bool) } - -type StakingKeeper interface { - GetValidatorByConsAddr(context.Context, sdk.ConsAddress) (stakingtypes.Validator, error) - ValidatorAddressCodec() addresscodec.Codec -} diff --git a/cosmos/x/evm/keeper/genesis.go b/cosmos/x/evm/keeper/genesis.go index cedf97f0a7..1928a52056 100644 --- a/cosmos/x/evm/keeper/genesis.go +++ b/cosmos/x/evm/keeper/genesis.go @@ -31,7 +31,7 @@ import ( // InitGenesis is called during the InitGenesis. func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { // TODO: Feels jank as fuck lol, but it works. - genState.Config = k.Host.GetConfigurationPlugin().ChainConfig() + genState.Config = k.chain.Config() // Initialize all the plugins. for _, plugin := range k.Host.GetAllPlugins() { diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index 3437b469ca..997dbe50f1 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -28,7 +28,6 @@ import ( "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/configuration" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/historical" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile" @@ -44,17 +43,13 @@ var _ core.PolarisHostChain = (*Host)(nil) type Host struct { // The various plugins that are are used to implement core.PolarisHostChain. bp block.Plugin - cp configuration.Plugin ep engine.Plugin hp historical.Plugin pp precompile.Plugin sp state.Plugin logger log.Logger - ak state.AccountKeeper - storeKey storetypes.StoreKey - pcs func() *ethprecompile.Injector - qc func() func(height int64, prove bool) (sdk.Context, error) + pcs func() *ethprecompile.Injector } // Newhost creates new instances of the plugin host. @@ -62,31 +57,24 @@ func NewHost( cfg config.Config, storeKey storetypes.StoreKey, ak state.AccountKeeper, - sk block.StakingKeeper, precompiles func() *ethprecompile.Injector, qc func() func(height int64, prove bool) (sdk.Context, error), logger log.Logger, ) *Host { // We setup the host with some Cosmos standard sauce. - h := &Host{} - - // Build the Plugins - h.bp = block.NewPlugin(storeKey, sk) - h.cp = configuration.NewPlugin(&cfg.Polar.Chain) - h.ep = engine.NewPlugin() - h.pcs = precompiles - h.storeKey = storeKey - h.ak = ak - h.qc = qc - h.logger = logger - - // Setup the state, precompile, historical, and txpool plugins - h.hp = historical.NewPlugin(h.cp, h.bp, nil, h.storeKey) - h.pp = precompile.NewPlugin() - h.sp = state.NewPlugin(h.ak, h.storeKey, nil) - h.bp.SetQueryContextFn(h.qc) - h.sp.SetQueryContextFn(h.qc) + h := &Host{ + bp: block.NewPlugin( + storeKey, qc, + ), + ep: engine.NewPlugin(), + pcs: precompiles, + pp: precompile.NewPlugin(), + sp: state.NewPlugin(ak, storeKey, qc, nil), + logger: logger, + } + // historical plugin requires block plugin. + h.hp = historical.NewPlugin(&cfg.Polar.Chain, h.bp, nil, storeKey) return h } @@ -108,15 +96,12 @@ func (h *Host) GetBlockPlugin() core.BlockPlugin { return h.bp } -// GetConfigurationPlugin returns the configuration plugin. -func (h *Host) GetConfigurationPlugin() core.ConfigurationPlugin { - return h.cp -} - // GetEnginePlugin returns the engine plugin. func (h *Host) GetEnginePlugin() core.EnginePlugin { return h.ep } + +// GetHistoricalPlugin returns the historical plugin. func (h *Host) GetHistoricalPlugin() core.HistoricalPlugin { return h.hp } @@ -133,5 +118,5 @@ func (h *Host) GetStatePlugin() core.StatePlugin { // GetAllPlugins returns all the plugins. func (h *Host) GetAllPlugins() []any { - return []any{h.bp, h.cp, h.hp, h.pp, h.sp} + return []any{h.bp, h.hp, h.pp, h.sp} } diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index 8823510a3f..aee1c4d0ac 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -26,18 +26,20 @@ import ( "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" "pkg.berachain.dev/polaris/cosmos/config" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/core" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" + "pkg.berachain.dev/polaris/eth/params" ) type Blockchain interface { PreparePlugins(context.Context) + Config() *params.ChainConfig core.ChainWriter core.ChainReader } @@ -56,7 +58,6 @@ type Keeper struct { // NewKeeper creates new instances of the polaris Keeper. func NewKeeper( ak state.AccountKeeper, - sk block.StakingKeeper, storeKey storetypes.StoreKey, pcs func() *ethprecompile.Injector, qc func() func(height int64, prove bool) (sdk.Context, error), @@ -67,7 +68,6 @@ func NewKeeper( *polarisCfg, storeKey, ak, - sk, pcs, qc, logger, @@ -78,6 +78,15 @@ func NewKeeper( } } +func (k *Keeper) Setup(chain Blockchain) error { + k.chain = chain + return k.SetupPrecompiles() +} + +func (k *Keeper) StartEnginePlugin(ctx client.Context) { + k.ep.Start(ctx) +} + // SetBlock sets the underlying ethereum blockchain on the keeper. func (k *Keeper) SetBlockchain(chain Blockchain) { k.chain = chain diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index 536454047c..da949bc79f 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -35,9 +35,11 @@ import ( func (k *Keeper) ProcessPayloadEnvelope( ctx context.Context, msg *evmtypes.WrappedPayloadEnvelope, ) (*evmtypes.WrappedPayloadEnvelopeResponse, error) { - var err error - var block *types.Block - + var ( + err error + block *types.Block + envelope engine.ExecutionPayloadEnvelope + ) // TODO: maybe we just consume the block gas limit and call it a day? sCtx := sdk.UnwrapSDKContext(ctx) gasMeter := sCtx.GasMeter() @@ -48,14 +50,11 @@ func (k *Keeper) ProcessPayloadEnvelope( blockGasMeter.RefundGas(blockGasMeter.GasConsumed(), "reset before evm block") defer gasMeter.ConsumeGas(gasMeter.GasConsumed(), "reset after evm") - envelope := engine.ExecutionPayloadEnvelope{} - err = envelope.UnmarshalJSON(msg.Data) - if err != nil { + if err = envelope.UnmarshalJSON(msg.Data); err != nil { return nil, fmt.Errorf("failed to unmarshal payload envelope: %w", err) } - block, err = engine.ExecutableDataToBlock(*envelope.ExecutionPayload, nil, nil) - if err != nil { + if block, err = engine.ExecutableDataToBlock(*envelope.ExecutionPayload, nil, nil); err != nil { k.Logger(sCtx).Error("failed to build evm block", "err", err) return nil, err } diff --git a/cosmos/x/evm/plugins/block/header.go b/cosmos/x/evm/plugins/block/header.go index 06a0f37b2e..5a21b31e04 100644 --- a/cosmos/x/evm/plugins/block/header.go +++ b/cosmos/x/evm/plugins/block/header.go @@ -25,8 +25,6 @@ import ( "fmt" "math/big" - sdk "github.com/cosmos/cosmos-sdk/types" - "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" @@ -37,15 +35,6 @@ import ( // prevHeaderHashes is the number of previous header hashes being stored on chain. const prevHeaderHashes = 256 -// =========================================================================== -// Polaris Block Header Tracking -// ===========================================================================. - -// SetQueryContextFn sets the query context func for the plugin. -func (p *plugin) SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) { - p.getQueryContext = fn -} - // GetHeaderByNumber returns the header at the given height, using the plugin's query context. // // GetHeaderByNumber implements core.BlockPlugin. diff --git a/cosmos/x/evm/plugins/block/header_test.go b/cosmos/x/evm/plugins/block/header_test.go index 87212a5fd7..6ea4cc17b1 100644 --- a/cosmos/x/evm/plugins/block/header_test.go +++ b/cosmos/x/evm/plugins/block/header_test.go @@ -45,13 +45,11 @@ var _ = Describe("Header", func() { var p *plugin BeforeEach(func() { - _, _, _, sk := testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) ctx = testutil.NewContext( log.NewTestLogger(GinkgoT())). WithBlockGasMeter(storetypes.NewGasMeter(uint64(10000))) - p = utils.MustGetAs[*plugin](NewPlugin(testutil.EvmKey, sk)) - p.SetQueryContextFn( - func() func(height int64, prove bool) (sdk.Context, error) { return mockQueryContext }) + p = utils.MustGetAs[*plugin](NewPlugin(testutil.EvmKey, + func() func(height int64, prove bool) (sdk.Context, error) { return mockQueryContext })) p.Prepare(ctx) // on block 0 (genesis) }) diff --git a/cosmos/x/evm/plugins/block/interfaces.go b/cosmos/x/evm/plugins/block/interfaces.go deleted file mode 100644 index de6e54412e..0000000000 --- a/cosmos/x/evm/plugins/block/interfaces.go +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package block - -import ( - "context" - - addresscodec "cosmossdk.io/core/address" - - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -type StakingKeeper interface { - GetValidatorByConsAddr(context.Context, sdk.ConsAddress) (stakingtypes.Validator, error) - ValidatorAddressCodec() addresscodec.Codec -} - -type Validator interface { - GetOperator() sdk.ValAddress // operator address to receive/return validators coins -} diff --git a/cosmos/x/evm/plugins/block/plugin.go b/cosmos/x/evm/plugins/block/plugin.go index f6984ea91c..316dddc019 100644 --- a/cosmos/x/evm/plugins/block/plugin.go +++ b/cosmos/x/evm/plugins/block/plugin.go @@ -22,24 +22,18 @@ package block import ( "context" - "fmt" - "math/big" storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" - "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core" ) type Plugin interface { plugins.HasGenesis core.BlockPlugin - - // SetQueryContextFn sets the function used for querying historical block headers. - SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) } type plugin struct { @@ -49,14 +43,15 @@ type plugin struct { storekey storetypes.StoreKey // getQueryContext allows for querying block headers. getQueryContext func() func(height int64, prove bool) (sdk.Context, error) - // sk represents the cosmos staking keeper. - sk StakingKeeper } -func NewPlugin(storekey storetypes.StoreKey, sk StakingKeeper) Plugin { +func NewPlugin( + storekey storetypes.StoreKey, + qfn func() func(height int64, prove bool) (sdk.Context, error), +) Plugin { return &plugin{ - storekey: storekey, - sk: sk, + storekey: storekey, + getQueryContext: qfn, } } @@ -64,27 +59,3 @@ func NewPlugin(storekey storetypes.StoreKey, sk StakingKeeper) Plugin { func (p *plugin) Prepare(ctx context.Context) { p.ctx = sdk.UnwrapSDKContext(ctx) } - -// BaseFee implements core.BlockPlugin. -func (p *plugin) BaseFee() *big.Int { - return big.NewInt(-1) // we defer to polaris' built in eip-1559 for the base fee. -} - -// GetNewBlockMetadata returns the host chain block metadata for the given block height. It returns -// the coinbase address, the timestamp of the block. -func (p *plugin) GetNewBlockMetadata(number uint64) (common.Address, uint64) { - cometHeader := p.ctx.BlockHeader() - if uint64(cometHeader.Height) != number { - panic(fmt.Errorf("block height mismatch. got: %d, expected %d", cometHeader.Height, number)) - } - - val, err := p.sk.GetValidatorByConsAddr(p.ctx, cometHeader.ProposerAddress) - if err != nil { - panic(err) - } - valBz, err := p.sk.ValidatorAddressCodec().StringToBytes(val.GetOperator()) - if err != nil { - panic(err) - } - return common.BytesToAddress(valBz), uint64(cometHeader.Time.UTC().Unix()) -} diff --git a/cosmos/x/evm/plugins/configuration/plugin.go b/cosmos/x/evm/plugins/configuration/plugin.go deleted file mode 100644 index 5e34e8c088..0000000000 --- a/cosmos/x/evm/plugins/configuration/plugin.go +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package configuration - -import ( - "context" - - "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/params" -) - -// Plugin is the interface that must be implemented by the plugin. -type Plugin interface { - core.ConfigurationPlugin -} - -// plugin implements the core.ConfigurationPlugin interface. -type plugin struct { - chainConfig *params.ChainConfig -} - -// NewPlugin returns a new plugin instance. -func NewPlugin(chainConfig *params.ChainConfig) Plugin { - return &plugin{ - chainConfig: chainConfig, - } -} - -func (p *plugin) Prepare(context.Context) { - // no-op -} - -// GetChainConfig is used to get the genesis info of the Ethereum chain. -func (p *plugin) ChainConfig() *params.ChainConfig { - return p.chainConfig -} diff --git a/cosmos/x/evm/plugins/historical/historical_data.go b/cosmos/x/evm/plugins/historical/historical_data.go index 53957fdd57..5854f2fe5a 100644 --- a/cosmos/x/evm/plugins/historical/historical_data.go +++ b/cosmos/x/evm/plugins/historical/historical_data.go @@ -185,5 +185,5 @@ func (p *plugin) GetReceiptsByHash(blockHash common.Hash) (coretypes.Receipts, e return nil, err } - return coretypes.DeriveReceiptsFromBlock(p.cp.ChainConfig(), receipts, block) + return coretypes.DeriveReceiptsFromBlock(p.chainConfig, receipts, block) } diff --git a/cosmos/x/evm/plugins/historical/interfaces.go b/cosmos/x/evm/plugins/historical/interfaces.go deleted file mode 100644 index f4cdd4e37b..0000000000 --- a/cosmos/x/evm/plugins/historical/interfaces.go +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package historical - -type StakingKeeper interface { - // TODO: coinbase stuff -} diff --git a/cosmos/x/evm/plugins/historical/plugin.go b/cosmos/x/evm/plugins/historical/plugin.go index fdc32e26b8..335c800174 100644 --- a/cosmos/x/evm/plugins/historical/plugin.go +++ b/cosmos/x/evm/plugins/historical/plugin.go @@ -29,6 +29,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/plugins" "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth/params" ) // Plugin is the interface that must be implemented by the plugin. @@ -41,8 +42,8 @@ type Plugin interface { type plugin struct { // ctx is the current block context, used for accessing current block info and kv stores. ctx sdk.Context - // cp is used to get the current chain config. - cp core.ConfigurationPlugin + // chainConfig stores the chain configuration for the evm chain.make + chainConfig *params.ChainConfig // bp represents the block plugin, used for accessing historical block headers. bp core.BlockPlugin // storekey is the store key for the header store. @@ -51,13 +52,13 @@ type plugin struct { // NewPlugin creates a new instance of the block plugin from the given context. func NewPlugin( - cp core.ConfigurationPlugin, bp core.BlockPlugin, + chainConfig *params.ChainConfig, bp core.BlockPlugin, _ storetypes.StoreKey, storekey storetypes.StoreKey, ) Plugin { return &plugin{ - cp: cp, - bp: bp, - storeKey: storekey, + chainConfig: chainConfig, + bp: bp, + storeKey: storekey, } } diff --git a/cosmos/x/evm/plugins/historical/plugin_test.go b/cosmos/x/evm/plugins/historical/plugin_test.go index e6f52e89fa..dd318558ed 100644 --- a/cosmos/x/evm/plugins/historical/plugin_test.go +++ b/cosmos/x/evm/plugins/historical/plugin_test.go @@ -34,6 +34,7 @@ import ( "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/mock" coretypes "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/params" "pkg.berachain.dev/polaris/lib/utils" . "github.com/onsi/ginkgo/v2" @@ -48,10 +49,9 @@ var _ = Describe("Historical Data", func() { BeforeEach(func() { ctx = testutil.NewContext(log.NewTestLogger(GinkgoT())).WithBlockHeight(0) - cp := mock.NewConfigurationPluginMock() bp := mock.NewBlockPluginMock() - p = utils.MustGetAs[*plugin](NewPlugin(cp, bp, nil, testutil.EvmKey)) + p = utils.MustGetAs[*plugin](NewPlugin(params.DefaultChainConfig, bp, nil, testutil.EvmKey)) Expect(p.InitGenesis(ctx, core.DefaultGenesis)).To(Succeed()) }) diff --git a/cosmos/x/evm/plugins/precompile/plugin_test.go b/cosmos/x/evm/plugins/precompile/plugin_test.go index 135be6f22e..b848d8a1be 100644 --- a/cosmos/x/evm/plugins/precompile/plugin_test.go +++ b/cosmos/x/evm/plugins/precompile/plugin_test.go @@ -130,7 +130,7 @@ type mockSDB struct { func (ms *mockSDB) GetPlugin() ethstate.Plugin { return state.NewPlugin( - nil, nil, nil, + nil, nil, nil, nil, ) } diff --git a/cosmos/x/evm/plugins/state/genesis_test.go b/cosmos/x/evm/plugins/state/genesis_test.go index 81818fbebe..e7b7456b14 100644 --- a/cosmos/x/evm/plugins/state/genesis_test.go +++ b/cosmos/x/evm/plugins/state/genesis_test.go @@ -47,7 +47,7 @@ var _ = Describe("Genesis", func() { BeforeEach(func() { var ak state.AccountKeeper ctx, ak, _, _ = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) - sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) + sp = state.NewPlugin(ak, testutil.EvmKey, nil, &mockPLF{}) // Create account for alice, bob acc := ak.NewAccountWithAddress(ctx, bob[:]) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 1ee99123f2..8b10912944 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -55,8 +55,6 @@ var ( type Plugin interface { plugins.HasGenesis core.StatePlugin - // SetQueryContextFn sets the query context func for the plugin. - SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) // IterateBalances iterates over the balances of all accounts and calls the callback function. IterateBalances(fn func(common.Address, *big.Int) bool) // IterateState iterates over the state of all accounts and calls the callback function. @@ -107,8 +105,8 @@ type plugin struct { // keepers used for balance and account information. ak AccountKeeper - // getQueryContext allows for querying state a historical height. - getQueryContext func() func(height int64, prove bool) (sdk.Context, error) + // qfn allows for querying state a historical height. + qfn func() func(height int64, prove bool) (sdk.Context, error) // dbErr stores any error that is returned from state modifications on the underlying // keepers. @@ -123,6 +121,7 @@ type plugin struct { func NewPlugin( ak AccountKeeper, storeKey storetypes.StoreKey, + qfn func() func(height int64, prove bool) (sdk.Context, error), plf events.PrecompileLogFactory, ) Plugin { return &plugin{ @@ -130,6 +129,7 @@ func NewPlugin( ak: ak, plf: plf, mu: sync.Mutex{}, + qfn: qfn, } } @@ -524,17 +524,12 @@ func (p *plugin) IterateBalances(fn func(common.Address, *big.Int) bool) { // Historical State // ============================================================================= -// SetQueryContextFn sets the query context func for the plugin. -func (p *plugin) SetQueryContextFn(fn func() func(height int64, prove bool) (sdk.Context, error)) { - p.getQueryContext = fn -} - // StateAtBlockNumber implements `core.StatePlugin`. func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { var ctx sdk.Context // Ensure the query context function is set. - if p.getQueryContext == nil { + if p.qfn == nil { return nil, errors.New("no query context function set in host chain") } @@ -551,14 +546,14 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { } else { // Get the query context at the given height. var err error - ctx, err = p.getQueryContext()(int64Number, false) + ctx, err = p.qfn()(int64Number, false) if err != nil { return nil, err } } // Create a State Plugin with the requested chain height. - sp := NewPlugin(p.ak, p.storeKey, p.plf) + sp := NewPlugin(p.ak, p.storeKey, p.qfn, p.plf) // TODO: Manager properly if p.latestState.MultiStore() != nil { sp.Reset(ctx) @@ -572,7 +567,7 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // Clone implements libtypes.Cloneable. func (p *plugin) Clone() ethstate.Plugin { - sp := NewPlugin(p.ak, p.storeKey, p.plf) + sp := NewPlugin(p.ak, p.storeKey, p.qfn, p.plf) // TODO: Manager properly if p.ctx.MultiStore() != nil { cacheCtx, _ := p.ctx.CacheContext() diff --git a/cosmos/x/evm/plugins/state/plugin_benchmark_test.go b/cosmos/x/evm/plugins/state/plugin_benchmark_test.go index 1be40c1c27..0155a19945 100644 --- a/cosmos/x/evm/plugins/state/plugin_benchmark_test.go +++ b/cosmos/x/evm/plugins/state/plugin_benchmark_test.go @@ -40,7 +40,7 @@ var ( func GetNewStatePlugin() core.StatePlugin { ctx, ak, _, _ := testutil.SetupMinimalKeepers(log.NewTestLogger(&testing.B{})) - sp := state.NewPlugin(ak, testutil.EvmKey, nil) + sp := state.NewPlugin(ak, testutil.EvmKey, nil, nil) sp.Reset(ctx) return sp } diff --git a/cosmos/x/evm/plugins/state/plugin_test.go b/cosmos/x/evm/plugins/state/plugin_test.go index a506dcd658..2a80548e2d 100644 --- a/cosmos/x/evm/plugins/state/plugin_test.go +++ b/cosmos/x/evm/plugins/state/plugin_test.go @@ -50,7 +50,7 @@ var _ = Describe("State Plugin", func() { BeforeEach(func() { ctx, ak, _, _ = testutil.SetupMinimalKeepers(log.NewTestLogger(GinkgoT())) - sp = state.NewPlugin(ak, testutil.EvmKey, &mockPLF{}) + sp = state.NewPlugin(ak, testutil.EvmKey, nil, &mockPLF{}) sp.Reset(ctx) }) diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 9337c96a80..54ed11508f 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -57,8 +57,19 @@ import ( evmconfig "pkg.berachain.dev/polaris/cosmos/config" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" polarruntime "pkg.berachain.dev/polaris/cosmos/runtime" + evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" ) +//nolint:gochecknoinits // from sdk. +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } + + DefaultNodeHome = filepath.Join(userHomeDir, ".polard") +} + // DefaultNodeHome default home directories for the application daemon. var DefaultNodeHome string @@ -72,6 +83,7 @@ var ( // capabilities aren't needed for testing. type SimApp struct { *runtime.App + *polarruntime.Polaris legacyAmino *codec.LegacyAmino appCodec codec.Codec txConfig client.TxConfig @@ -90,19 +102,8 @@ type SimApp struct { EvidenceKeeper evidencekeeper.Keeper ConsensusParamsKeeper consensuskeeper.Keeper - // polaris contains all the required components for the - // polaris evm. - polaris *polarruntime.Polaris -} - -//nolint:gochecknoinits // from sdk. -func init() { - userHomeDir, err := os.UserHomeDir() - if err != nil { - panic(err) - } - - DefaultNodeHome = filepath.Join(userHomeDir, ".polard") + // polaris required keeper + EVMKeeper *evmkeeper.Keeper } // NewPolarisApp returns a reference to an initialized SimApp. @@ -118,7 +119,7 @@ func NewPolarisApp( baseAppOptions ...func(*baseapp.BaseApp), ) *SimApp { var ( - app = &SimApp{polaris: &polarruntime.Polaris{}} + app = &SimApp{} appBuilder *runtime.AppBuilder // merge the AppConfig and other configuration in one config appConfig = depinject.Configs( @@ -126,7 +127,6 @@ func NewPolarisApp( depinject.Provide( signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope], - polarruntime.ProvidePolarisRuntime, ), depinject.Supply( // supply the application options @@ -178,23 +178,22 @@ func NewPolarisApp( &app.UpgradeKeeper, &app.EvidenceKeeper, &app.ConsensusParamsKeeper, - &app.polaris, - &app.polaris.EVMKeeper, + &app.EVMKeeper, ); err != nil { panic(err) } // Build the app using the app builder. app.App = appBuilder.Build(db, traceStore, baseAppOptions...) + app.Polaris = polarruntime.New( + evmconfig.MustReadConfigFromAppOpts(appOpts), app.Logger(), app.EVMKeeper.Host, + ) - // Initialize Polaris Runtime. - if err := app.polaris.Setup(app.BaseApp); err != nil { + // Setup Polaris Runtime. + if err := app.Polaris.Setup(app.BaseApp, app.EVMKeeper); err != nil { panic(err) } - // Set the ante handler to nil, since it is not needed. - app.SetAnteHandler(nil) - // register streaming services if err := app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { panic(err) @@ -212,7 +211,7 @@ func NewPolarisApp( } // Load the last state of the polaris evm. - if err := app.polaris.LoadLastState( + if err := app.Polaris.LoadLastState( app.CommitMultiStore(), uint64(app.LastBlockHeight()), ); err != nil { panic(err) @@ -259,14 +258,14 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon panic(err) } - if err := app.polaris.Init(apiSvr.ClientCtx, app.Logger()); err != nil { + if err := app.Polaris.Init(apiSvr.ClientCtx, app.Logger(), app.EVMKeeper); err != nil { panic(err) } } // Close shuts down the application. func (app *SimApp) Close() error { - if pl := app.polaris; pl != nil { + if pl := app.Polaris; pl != nil { return pl.Close() } return app.BaseApp.Close() diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 322878a9d2..fa1f9a002f 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -64,7 +64,6 @@ import ( evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" - polarruntime "pkg.berachain.dev/polaris/cosmos/runtime" testapp "pkg.berachain.dev/polaris/e2e/testapp" ) @@ -91,7 +90,6 @@ func NewRootCmd() *cobra.Command { simtestutil.NewAppOptionsWithFlagHome(tempDir()), ), depinject.Provide( - polarruntime.ProvidePolarisRuntime, signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedEthereumTransaction], signinglib.ProvideNoopGetSigners[*evmv1alpha1.WrappedPayloadEnvelope]), ), diff --git a/eth/core/chain.go b/eth/core/chain.go index 5f7092858b..c3e6f68078 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -46,9 +46,9 @@ const defaultCacheSize = 1024 // Compile-time check to ensure that `blockchain` implements the `Blockchain` api. var _ Blockchain = (*blockchain)(nil) +// Blockchain interface defines the methods that a blockchain must have. type Blockchain interface { PreparePlugins(ctx context.Context) - Config() *params.ChainConfig ChainReader ChainWriter ChainSubscriber @@ -60,7 +60,6 @@ type Blockchain interface { type blockchain struct { // the host chain plugins that the Polaris EVM is running on. bp BlockPlugin - cp ConfigurationPlugin hp HistoricalPlugin pp PrecompilePlugin sp StatePlugin @@ -73,6 +72,9 @@ type blockchain struct { // vmConfig is the configuration used to create the EVM. vmConfig *vm.Config + // config represents the chain config. + config *params.ChainConfig + // currentBlock is the current/pending block. currentBlock atomic.Pointer[types.Block] // finalizedBlock is the finalized/latest block. @@ -112,14 +114,14 @@ type blockchain struct { // NewChain creates and returns a `api.Chain` with the given EVM chain configuration and host. func NewChain( - host PolarisHostChain, engine consensus.Engine, + host PolarisHostChain, config *params.ChainConfig, engine consensus.Engine, ) *blockchain { //nolint:revive // only used as `api.Chain`. bc := &blockchain{ bp: host.GetBlockPlugin(), - cp: host.GetConfigurationPlugin(), hp: host.GetHistoricalPlugin(), pp: host.GetPrecompilePlugin(), sp: host.GetStatePlugin(), + config: config, vmConfig: &vm.Config{}, receiptsCache: lru.NewCache[common.Hash, types.Receipts](defaultCacheSize), blockNumCache: lru.NewCache[uint64, *types.Block](defaultCacheSize), @@ -131,7 +133,7 @@ func NewChain( engine: engine, } bc.statedb = state.NewStateDB(bc.sp, bc.pp) - bc.processor = core.NewStateProcessor(bc.cp.ChainConfig(), bc, bc.engine) + bc.processor = core.NewStateProcessor(bc.config, bc, bc.engine) // TODO: hmm... bc.currentBlock.Store( types.NewBlock(&types.Header{Time: 0, Number: big.NewInt(0), @@ -151,7 +153,6 @@ func (bc *blockchain) PreparePlugins(ctx context.Context) { bc.sp.Prepare(ctx) bc.sp.Reset(ctx) bc.bp.Prepare(ctx) - bc.cp.Prepare(ctx) if bc.hp != nil { bc.hp.Prepare(ctx) } @@ -159,7 +160,7 @@ func (bc *blockchain) PreparePlugins(ctx context.Context) { // ChainConfig returns the Ethereum chain config of the chain. func (bc *blockchain) Config() *params.ChainConfig { - return bc.cp.ChainConfig() + return bc.config } // loadLastState loads the last known chain state from the database. This method diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 9627211b6b..95b67cb421 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -26,6 +26,7 @@ import ( "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/vm" + "pkg.berachain.dev/polaris/eth/params" ) // ChainResources is the interface that defines functions for code paths within the chain to @@ -34,6 +35,7 @@ type ChainResources interface { StateAtBlockNumber(uint64) (state.StateDB, error) StateAt(root common.Hash) (state.StateDB, error) GetVMConfig() *vm.Config + Config() *params.ChainConfig } // StateAt returns a statedb configured to read what the state of the blockchain is/was at a given. diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index 1afa721e74..e96ae7b976 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -73,7 +73,7 @@ func (bc *blockchain) InsertBlock( var err error if _, err = bc.statedb.Commit( block.NumberU64(), - bc.cp.ChainConfig().IsEIP158(block.Header().Number), + bc.config.IsEIP158(block.Header().Number), ); err != nil { return err } diff --git a/eth/core/host.go b/eth/core/host.go index e17e432c1d..395e69ad1b 100644 --- a/eth/core/host.go +++ b/eth/core/host.go @@ -22,7 +22,6 @@ package core import ( "context" - "math/big" "github.com/ethereum/go-ethereum" @@ -30,7 +29,6 @@ import ( "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/params" libtypes "pkg.berachain.dev/polaris/lib/types" ) @@ -38,8 +36,6 @@ import ( type PolarisHostChain interface { // GetBlockPlugin returns the `BlockPlugin` of the Polaris host chain. GetBlockPlugin() BlockPlugin - // GetConfigurationPlugin returns the `ConfigurationPlugin` of the Polaris host chain. - GetConfigurationPlugin() ConfigurationPlugin // GetEnginePlugin() returns the `EnginePlugin` of the Polaris host chain. GetEnginePlugin() EnginePlugin // GetHistoricalPlugin returns the OPTIONAL `HistoricalPlugin` of the Polaris host chain. @@ -63,27 +59,12 @@ type ( // BlockPlugin implements `libtypes.Preparable`. Calling `Prepare` should reset the // BlockPlugin to a default state. libtypes.Preparable - // GetNewBlockMetadata returns a new block metadata (coinbase, timestamp) for the given - // block number. - GetNewBlockMetadata(uint64) (common.Address, uint64) // GetHeaderByNumber returns the block header at the given block number. GetHeaderByNumber(uint64) (*types.Header, error) // GetHeaderByHash returns the block header with the given block hash. GetHeaderByHash(common.Hash) (*types.Header, error) // StoreHeader stores the block header at the given block number. StoreHeader(*types.Header) error - // BaseFee returns the base fee of the current block. - BaseFee() *big.Int - } - - // ConfigurationPlugin defines the methods that the chain running Polaris EVM should - // implement in order to configuration the parameters of the Polaris EVM. - ConfigurationPlugin interface { - // ConfigurationPlugin implements `libtypes.Preparable`. Calling `Prepare` should reset - // the `ConfigurationPlugin` to a default state. - libtypes.Preparable - // ChainConfig returns the current chain configuration of the Polaris EVM. - ChainConfig() *params.ChainConfig } // EnginePlugin defines methods that allow the chain to have insight into the underlying diff --git a/eth/core/mock/block_plugin.mock.go b/eth/core/mock/block_plugin.mock.go index e421995fde..4f944abd34 100644 --- a/eth/core/mock/block_plugin.mock.go +++ b/eth/core/mock/block_plugin.mock.go @@ -7,7 +7,6 @@ import ( "context" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "math/big" "pkg.berachain.dev/polaris/eth/core" "sync" ) @@ -22,18 +21,12 @@ var _ core.BlockPlugin = &BlockPluginMock{} // // // make and configure a mocked core.BlockPlugin // mockedBlockPlugin := &BlockPluginMock{ -// BaseFeeFunc: func() *big.Int { -// panic("mock out the BaseFee method") -// }, // GetHeaderByHashFunc: func(hash common.Hash) (*types.Header, error) { // panic("mock out the GetHeaderByHash method") // }, // GetHeaderByNumberFunc: func(v uint64) (*types.Header, error) { // panic("mock out the GetHeaderByNumber method") // }, -// GetNewBlockMetadataFunc: func(v uint64) (common.Address, uint64) { -// panic("mock out the GetNewBlockMetadata method") -// }, // PrepareFunc: func(contextMoqParam context.Context) { // panic("mock out the Prepare method") // }, @@ -47,18 +40,12 @@ var _ core.BlockPlugin = &BlockPluginMock{} // // } type BlockPluginMock struct { - // BaseFeeFunc mocks the BaseFee method. - BaseFeeFunc func() *big.Int - // GetHeaderByHashFunc mocks the GetHeaderByHash method. GetHeaderByHashFunc func(hash common.Hash) (*types.Header, error) // GetHeaderByNumberFunc mocks the GetHeaderByNumber method. GetHeaderByNumberFunc func(v uint64) (*types.Header, error) - // GetNewBlockMetadataFunc mocks the GetNewBlockMetadata method. - GetNewBlockMetadataFunc func(v uint64) (common.Address, uint64) - // PrepareFunc mocks the Prepare method. PrepareFunc func(contextMoqParam context.Context) @@ -67,9 +54,6 @@ type BlockPluginMock struct { // calls tracks calls to the methods. calls struct { - // BaseFee holds details about calls to the BaseFee method. - BaseFee []struct { - } // GetHeaderByHash holds details about calls to the GetHeaderByHash method. GetHeaderByHash []struct { // Hash is the hash argument value. @@ -80,11 +64,6 @@ type BlockPluginMock struct { // V is the v argument value. V uint64 } - // GetNewBlockMetadata holds details about calls to the GetNewBlockMetadata method. - GetNewBlockMetadata []struct { - // V is the v argument value. - V uint64 - } // Prepare holds details about calls to the Prepare method. Prepare []struct { // ContextMoqParam is the contextMoqParam argument value. @@ -96,39 +75,10 @@ type BlockPluginMock struct { Header *types.Header } } - lockBaseFee sync.RWMutex - lockGetHeaderByHash sync.RWMutex - lockGetHeaderByNumber sync.RWMutex - lockGetNewBlockMetadata sync.RWMutex - lockPrepare sync.RWMutex - lockStoreHeader sync.RWMutex -} - -// BaseFee calls BaseFeeFunc. -func (mock *BlockPluginMock) BaseFee() *big.Int { - if mock.BaseFeeFunc == nil { - panic("BlockPluginMock.BaseFeeFunc: method is nil but BlockPlugin.BaseFee was just called") - } - callInfo := struct { - }{} - mock.lockBaseFee.Lock() - mock.calls.BaseFee = append(mock.calls.BaseFee, callInfo) - mock.lockBaseFee.Unlock() - return mock.BaseFeeFunc() -} - -// BaseFeeCalls gets all the calls that were made to BaseFee. -// Check the length with: -// -// len(mockedBlockPlugin.BaseFeeCalls()) -func (mock *BlockPluginMock) BaseFeeCalls() []struct { -} { - var calls []struct { - } - mock.lockBaseFee.RLock() - calls = mock.calls.BaseFee - mock.lockBaseFee.RUnlock() - return calls + lockGetHeaderByHash sync.RWMutex + lockGetHeaderByNumber sync.RWMutex + lockPrepare sync.RWMutex + lockStoreHeader sync.RWMutex } // GetHeaderByHash calls GetHeaderByHashFunc. @@ -195,38 +145,6 @@ func (mock *BlockPluginMock) GetHeaderByNumberCalls() []struct { return calls } -// GetNewBlockMetadata calls GetNewBlockMetadataFunc. -func (mock *BlockPluginMock) GetNewBlockMetadata(v uint64) (common.Address, uint64) { - if mock.GetNewBlockMetadataFunc == nil { - panic("BlockPluginMock.GetNewBlockMetadataFunc: method is nil but BlockPlugin.GetNewBlockMetadata was just called") - } - callInfo := struct { - V uint64 - }{ - V: v, - } - mock.lockGetNewBlockMetadata.Lock() - mock.calls.GetNewBlockMetadata = append(mock.calls.GetNewBlockMetadata, callInfo) - mock.lockGetNewBlockMetadata.Unlock() - return mock.GetNewBlockMetadataFunc(v) -} - -// GetNewBlockMetadataCalls gets all the calls that were made to GetNewBlockMetadata. -// Check the length with: -// -// len(mockedBlockPlugin.GetNewBlockMetadataCalls()) -func (mock *BlockPluginMock) GetNewBlockMetadataCalls() []struct { - V uint64 -} { - var calls []struct { - V uint64 - } - mock.lockGetNewBlockMetadata.RLock() - calls = mock.calls.GetNewBlockMetadata - mock.lockGetNewBlockMetadata.RUnlock() - return calls -} - // Prepare calls PrepareFunc. func (mock *BlockPluginMock) Prepare(contextMoqParam context.Context) { if mock.PrepareFunc == nil { diff --git a/eth/core/mock/config_plugin.mock.go b/eth/core/mock/config_plugin.mock.go deleted file mode 100644 index 40302b5018..0000000000 --- a/eth/core/mock/config_plugin.mock.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package mock - -import ( - "context" - "github.com/ethereum/go-ethereum/params" - "pkg.berachain.dev/polaris/eth/core" - "sync" -) - -// Ensure, that ConfigurationPluginMock does implement core.ConfigurationPlugin. -// If this is not the case, regenerate this file with moq. -var _ core.ConfigurationPlugin = &ConfigurationPluginMock{} - -// ConfigurationPluginMock is a mock implementation of core.ConfigurationPlugin. -// -// func TestSomethingThatUsesConfigurationPlugin(t *testing.T) { -// -// // make and configure a mocked core.ConfigurationPlugin -// mockedConfigurationPlugin := &ConfigurationPluginMock{ -// ChainConfigFunc: func() *params.ChainConfig { -// panic("mock out the ChainConfig method") -// }, -// PrepareFunc: func(contextMoqParam context.Context) { -// panic("mock out the Prepare method") -// }, -// } -// -// // use mockedConfigurationPlugin in code that requires core.ConfigurationPlugin -// // and then make assertions. -// -// } -type ConfigurationPluginMock struct { - // ChainConfigFunc mocks the ChainConfig method. - ChainConfigFunc func() *params.ChainConfig - - // PrepareFunc mocks the Prepare method. - PrepareFunc func(contextMoqParam context.Context) - - // calls tracks calls to the methods. - calls struct { - // ChainConfig holds details about calls to the ChainConfig method. - ChainConfig []struct { - } - // Prepare holds details about calls to the Prepare method. - Prepare []struct { - // ContextMoqParam is the contextMoqParam argument value. - ContextMoqParam context.Context - } - } - lockChainConfig sync.RWMutex - lockPrepare sync.RWMutex -} - -// ChainConfig calls ChainConfigFunc. -func (mock *ConfigurationPluginMock) ChainConfig() *params.ChainConfig { - if mock.ChainConfigFunc == nil { - panic("ConfigurationPluginMock.ChainConfigFunc: method is nil but ConfigurationPlugin.ChainConfig was just called") - } - callInfo := struct { - }{} - mock.lockChainConfig.Lock() - mock.calls.ChainConfig = append(mock.calls.ChainConfig, callInfo) - mock.lockChainConfig.Unlock() - return mock.ChainConfigFunc() -} - -// ChainConfigCalls gets all the calls that were made to ChainConfig. -// Check the length with: -// -// len(mockedConfigurationPlugin.ChainConfigCalls()) -func (mock *ConfigurationPluginMock) ChainConfigCalls() []struct { -} { - var calls []struct { - } - mock.lockChainConfig.RLock() - calls = mock.calls.ChainConfig - mock.lockChainConfig.RUnlock() - return calls -} - -// Prepare calls PrepareFunc. -func (mock *ConfigurationPluginMock) Prepare(contextMoqParam context.Context) { - if mock.PrepareFunc == nil { - panic("ConfigurationPluginMock.PrepareFunc: method is nil but ConfigurationPlugin.Prepare was just called") - } - callInfo := struct { - ContextMoqParam context.Context - }{ - ContextMoqParam: contextMoqParam, - } - mock.lockPrepare.Lock() - mock.calls.Prepare = append(mock.calls.Prepare, callInfo) - mock.lockPrepare.Unlock() - mock.PrepareFunc(contextMoqParam) -} - -// PrepareCalls gets all the calls that were made to Prepare. -// Check the length with: -// -// len(mockedConfigurationPlugin.PrepareCalls()) -func (mock *ConfigurationPluginMock) PrepareCalls() []struct { - ContextMoqParam context.Context -} { - var calls []struct { - ContextMoqParam context.Context - } - mock.lockPrepare.RLock() - calls = mock.calls.Prepare - mock.lockPrepare.RUnlock() - return calls -} diff --git a/eth/core/mock/host.go b/eth/core/mock/host.go deleted file mode 100644 index bd22be85f5..0000000000 --- a/eth/core/mock/host.go +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package mock - -import "pkg.berachain.dev/polaris/eth/core" - -//go:generate moq -out ./host.mock.go -pkg mock ../ PolarisHostChain - -func NewMockHostAndPlugins() ( - *PolarisHostChainMock, *BlockPluginMock, *ConfigurationPluginMock, - *HistoricalPluginMock, *PrecompilePluginMock, *StatePluginMock, -) { - bp := NewBlockPluginMock() - cp := NewConfigurationPluginMock() - hp := NewHistoricalPluginMock() - pp := NewPrecompilePluginMock() - sp := NewStatePluginMock() - mockedPolarisHostChain := &PolarisHostChainMock{ - GetBlockPluginFunc: func() core.BlockPlugin { - return bp - }, - GetConfigurationPluginFunc: func() core.ConfigurationPlugin { - return cp - }, - GetHistoricalPluginFunc: func() core.HistoricalPlugin { - return hp - }, - GetPrecompilePluginFunc: func() core.PrecompilePlugin { - return pp - }, - GetStatePluginFunc: func() core.StatePlugin { - return sp - }, - } - return mockedPolarisHostChain, bp, cp, hp, pp, sp -} diff --git a/eth/core/mock/host.mock.go b/eth/core/mock/host.mock.go deleted file mode 100644 index da08fdf97d..0000000000 --- a/eth/core/mock/host.mock.go +++ /dev/null @@ -1,254 +0,0 @@ -// Code generated by moq; DO NOT EDIT. -// github.com/matryer/moq - -package mock - -import ( - "pkg.berachain.dev/polaris/eth/core" - "pkg.berachain.dev/polaris/eth/core/precompile" - "sync" -) - -// Ensure, that PolarisHostChainMock does implement core.PolarisHostChain. -// If this is not the case, regenerate this file with moq. -var _ core.PolarisHostChain = &PolarisHostChainMock{} - -// PolarisHostChainMock is a mock implementation of core.PolarisHostChain. -// -// func TestSomethingThatUsesPolarisHostChain(t *testing.T) { -// -// // make and configure a mocked core.PolarisHostChain -// mockedPolarisHostChain := &PolarisHostChainMock{ -// GetBlockPluginFunc: func() core.BlockPlugin { -// panic("mock out the GetBlockPlugin method") -// }, -// GetConfigurationPluginFunc: func() core.ConfigurationPlugin { -// panic("mock out the GetConfigurationPlugin method") -// }, -// GetEnginePluginFunc: func() core.EnginePlugin { -// panic("mock out the GetEnginePlugin method") -// }, -// GetHistoricalPluginFunc: func() core.HistoricalPlugin { -// panic("mock out the GetHistoricalPlugin method") -// }, -// GetPrecompilePluginFunc: func() precompile.Plugin { -// panic("mock out the GetPrecompilePlugin method") -// }, -// GetStatePluginFunc: func() core.StatePlugin { -// panic("mock out the GetStatePlugin method") -// }, -// } -// -// // use mockedPolarisHostChain in code that requires core.PolarisHostChain -// // and then make assertions. -// -// } -type PolarisHostChainMock struct { - // GetBlockPluginFunc mocks the GetBlockPlugin method. - GetBlockPluginFunc func() core.BlockPlugin - - // GetConfigurationPluginFunc mocks the GetConfigurationPlugin method. - GetConfigurationPluginFunc func() core.ConfigurationPlugin - - // GetEnginePluginFunc mocks the GetEnginePlugin method. - GetEnginePluginFunc func() core.EnginePlugin - - // GetHistoricalPluginFunc mocks the GetHistoricalPlugin method. - GetHistoricalPluginFunc func() core.HistoricalPlugin - - // GetPrecompilePluginFunc mocks the GetPrecompilePlugin method. - GetPrecompilePluginFunc func() precompile.Plugin - - // GetStatePluginFunc mocks the GetStatePlugin method. - GetStatePluginFunc func() core.StatePlugin - - // calls tracks calls to the methods. - calls struct { - // GetBlockPlugin holds details about calls to the GetBlockPlugin method. - GetBlockPlugin []struct { - } - // GetConfigurationPlugin holds details about calls to the GetConfigurationPlugin method. - GetConfigurationPlugin []struct { - } - // GetEnginePlugin holds details about calls to the GetEnginePlugin method. - GetEnginePlugin []struct { - } - // GetHistoricalPlugin holds details about calls to the GetHistoricalPlugin method. - GetHistoricalPlugin []struct { - } - // GetPrecompilePlugin holds details about calls to the GetPrecompilePlugin method. - GetPrecompilePlugin []struct { - } - // GetStatePlugin holds details about calls to the GetStatePlugin method. - GetStatePlugin []struct { - } - } - lockGetBlockPlugin sync.RWMutex - lockGetConfigurationPlugin sync.RWMutex - lockGetEnginePlugin sync.RWMutex - lockGetHistoricalPlugin sync.RWMutex - lockGetPrecompilePlugin sync.RWMutex - lockGetStatePlugin sync.RWMutex -} - -// GetBlockPlugin calls GetBlockPluginFunc. -func (mock *PolarisHostChainMock) GetBlockPlugin() core.BlockPlugin { - if mock.GetBlockPluginFunc == nil { - panic("PolarisHostChainMock.GetBlockPluginFunc: method is nil but PolarisHostChain.GetBlockPlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetBlockPlugin.Lock() - mock.calls.GetBlockPlugin = append(mock.calls.GetBlockPlugin, callInfo) - mock.lockGetBlockPlugin.Unlock() - return mock.GetBlockPluginFunc() -} - -// GetBlockPluginCalls gets all the calls that were made to GetBlockPlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetBlockPluginCalls()) -func (mock *PolarisHostChainMock) GetBlockPluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetBlockPlugin.RLock() - calls = mock.calls.GetBlockPlugin - mock.lockGetBlockPlugin.RUnlock() - return calls -} - -// GetConfigurationPlugin calls GetConfigurationPluginFunc. -func (mock *PolarisHostChainMock) GetConfigurationPlugin() core.ConfigurationPlugin { - if mock.GetConfigurationPluginFunc == nil { - panic("PolarisHostChainMock.GetConfigurationPluginFunc: method is nil but PolarisHostChain.GetConfigurationPlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetConfigurationPlugin.Lock() - mock.calls.GetConfigurationPlugin = append(mock.calls.GetConfigurationPlugin, callInfo) - mock.lockGetConfigurationPlugin.Unlock() - return mock.GetConfigurationPluginFunc() -} - -// GetConfigurationPluginCalls gets all the calls that were made to GetConfigurationPlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetConfigurationPluginCalls()) -func (mock *PolarisHostChainMock) GetConfigurationPluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetConfigurationPlugin.RLock() - calls = mock.calls.GetConfigurationPlugin - mock.lockGetConfigurationPlugin.RUnlock() - return calls -} - -// GetEnginePlugin calls GetEnginePluginFunc. -func (mock *PolarisHostChainMock) GetEnginePlugin() core.EnginePlugin { - if mock.GetEnginePluginFunc == nil { - panic("PolarisHostChainMock.GetEnginePluginFunc: method is nil but PolarisHostChain.GetEnginePlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetEnginePlugin.Lock() - mock.calls.GetEnginePlugin = append(mock.calls.GetEnginePlugin, callInfo) - mock.lockGetEnginePlugin.Unlock() - return mock.GetEnginePluginFunc() -} - -// GetEnginePluginCalls gets all the calls that were made to GetEnginePlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetEnginePluginCalls()) -func (mock *PolarisHostChainMock) GetEnginePluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetEnginePlugin.RLock() - calls = mock.calls.GetEnginePlugin - mock.lockGetEnginePlugin.RUnlock() - return calls -} - -// GetHistoricalPlugin calls GetHistoricalPluginFunc. -func (mock *PolarisHostChainMock) GetHistoricalPlugin() core.HistoricalPlugin { - if mock.GetHistoricalPluginFunc == nil { - panic("PolarisHostChainMock.GetHistoricalPluginFunc: method is nil but PolarisHostChain.GetHistoricalPlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetHistoricalPlugin.Lock() - mock.calls.GetHistoricalPlugin = append(mock.calls.GetHistoricalPlugin, callInfo) - mock.lockGetHistoricalPlugin.Unlock() - return mock.GetHistoricalPluginFunc() -} - -// GetHistoricalPluginCalls gets all the calls that were made to GetHistoricalPlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetHistoricalPluginCalls()) -func (mock *PolarisHostChainMock) GetHistoricalPluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetHistoricalPlugin.RLock() - calls = mock.calls.GetHistoricalPlugin - mock.lockGetHistoricalPlugin.RUnlock() - return calls -} - -// GetPrecompilePlugin calls GetPrecompilePluginFunc. -func (mock *PolarisHostChainMock) GetPrecompilePlugin() precompile.Plugin { - if mock.GetPrecompilePluginFunc == nil { - panic("PolarisHostChainMock.GetPrecompilePluginFunc: method is nil but PolarisHostChain.GetPrecompilePlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetPrecompilePlugin.Lock() - mock.calls.GetPrecompilePlugin = append(mock.calls.GetPrecompilePlugin, callInfo) - mock.lockGetPrecompilePlugin.Unlock() - return mock.GetPrecompilePluginFunc() -} - -// GetPrecompilePluginCalls gets all the calls that were made to GetPrecompilePlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetPrecompilePluginCalls()) -func (mock *PolarisHostChainMock) GetPrecompilePluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetPrecompilePlugin.RLock() - calls = mock.calls.GetPrecompilePlugin - mock.lockGetPrecompilePlugin.RUnlock() - return calls -} - -// GetStatePlugin calls GetStatePluginFunc. -func (mock *PolarisHostChainMock) GetStatePlugin() core.StatePlugin { - if mock.GetStatePluginFunc == nil { - panic("PolarisHostChainMock.GetStatePluginFunc: method is nil but PolarisHostChain.GetStatePlugin was just called") - } - callInfo := struct { - }{} - mock.lockGetStatePlugin.Lock() - mock.calls.GetStatePlugin = append(mock.calls.GetStatePlugin, callInfo) - mock.lockGetStatePlugin.Unlock() - return mock.GetStatePluginFunc() -} - -// GetStatePluginCalls gets all the calls that were made to GetStatePlugin. -// Check the length with: -// -// len(mockedPolarisHostChain.GetStatePluginCalls()) -func (mock *PolarisHostChainMock) GetStatePluginCalls() []struct { -} { - var calls []struct { - } - mock.lockGetStatePlugin.RLock() - calls = mock.calls.GetStatePlugin - mock.lockGetStatePlugin.RUnlock() - return calls -} diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 0ecc9f0b1a..7ed5837f94 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index 005d3584ae..7096396505 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index 1f4aa681e6..d8cb61ad81 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 038ead2256..59d14f165c 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index 64f0e7bc98..b38c383a87 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index 27dde8ee58..c3e3bda1ec 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index efc5426ea5..c624b3d00b 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/polar_state_db.go b/eth/core/state/mocks/polar_state_db.go index 7171448e27..8383e6889e 100644 --- a/eth/core/state/mocks/polar_state_db.go +++ b/eth/core/state/mocks/polar_state_db.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index 71b4b7ea13..b066d04221 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.3. DO NOT EDIT. +// Code generated by mockery v2.35.4. DO NOT EDIT. package mocks diff --git a/eth/core/types/transaction.rlpgen.go b/eth/core/types/transaction.rlpgen.go index c335ec137e..5006261ca3 100644 --- a/eth/core/types/transaction.rlpgen.go +++ b/eth/core/types/transaction.rlpgen.go @@ -1,8 +1,5 @@ // Code generated by rlpgen. DO NOT EDIT. -//go:build !norlpgen -// +build !norlpgen - package types import "github.com/ethereum/go-ethereum/common" diff --git a/eth/crypto/imported.go b/eth/crypto/imported.go index fb327ca948..8d10097681 100644 --- a/eth/crypto/imported.go +++ b/eth/crypto/imported.go @@ -25,23 +25,15 @@ import ( ) var ( - SigToPub = crypto.SigToPub - Ecrecover = crypto.Ecrecover - CreateAddress = crypto.CreateAddress - UnmarshalPubkey = crypto.UnmarshalPubkey - CompressPubkey = crypto.CompressPubkey - DecompressPubkey = crypto.DecompressPubkey - DigestLength = crypto.DigestLength - EthSign = crypto.Sign - LoadECDSA = crypto.LoadECDSA - FromECDSA = crypto.FromECDSA - GenerateEthKey = crypto.GenerateKey - ValidateSignatureValues = crypto.ValidateSignatureValues - Keccak256 = crypto.Keccak256 - Keccak256Hash = crypto.Keccak256Hash - PubkeyToAddress = crypto.PubkeyToAddress - SignatureLength = crypto.SignatureLength - ToECDSA = crypto.ToECDSA - VerifySignature = crypto.VerifySignature - FromECDSAPub = crypto.FromECDSAPub + // GenerateEthKey is a function that generates a new Ethereum key. + GenerateEthKey = crypto.GenerateKey + // Keccak256 is a function that computes and returns the Keccak256 hash of the input data. + Keccak256 = crypto.Keccak256 + // Keccak256Hash is a function that computes and returns the Keccak256 hash of the input data, + // but the return type is Hash. + Keccak256Hash = crypto.Keccak256Hash + // PubkeyToAddress is a function that derives the Ethereum address from the given public key. + PubkeyToAddress = crypto.PubkeyToAddress + // LoadECDSA is a function that loads a private key from a given file. + LoadECDSA = crypto.LoadECDSA ) diff --git a/eth/params/imported.go b/eth/params/imported.go index 30b029768b..ad3d10f97d 100644 --- a/eth/params/imported.go +++ b/eth/params/imported.go @@ -30,9 +30,6 @@ type ( ) var ( - // BloomBitsBlocks is the number of blocks a single bloom bit section vector - // contains on the server side. - BloomBitsBlocks = params.BloomBitsBlocks // VersionWithMeta holds the textual version string including the metadata. VersionWithMeta = params.VersionWithMeta // VersionWithCommit holds the textual version string including the commit hash. diff --git a/eth/polar/backend.go b/eth/polar/backend.go index cf9f3ff057..61c141213c 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -109,7 +109,7 @@ func NewWithNetworkingStack( engine := beacon.New(&consensus.DummyEthOne{}) pl := &Polaris{ config: config, - blockchain: core.NewChain(host, engine), + blockchain: core.NewChain(host, &config.Chain, engine), stack: stack, host: host, enginePlugin: host.GetEnginePlugin(), @@ -128,13 +128,6 @@ func NewWithNetworkingStack( pl.backend = NewBackend(pl, pl.config) - return pl -} - -// Init initializes the Polaris struct. -func (pl *Polaris) Init() error { - var err error - // Run safety message for feedback to the user if they are running // with development configs. pl.config.SafetyMessage() @@ -145,27 +138,21 @@ func (pl *Polaris) Init() error { ) // Setup the transaction pool and attach the legacyPool. + var err error if pl.txPool, err = txpool.New( new(big.Int).SetUint64(pl.config.LegacyTxPool.PriceLimit), pl.blockchain, []txpool.SubPool{legacyPool}, ); err != nil { - return err + panic(err) } mux := new(event.TypeMux) //nolint:staticcheck // deprecated but still in geth. // TODO: miner config to app.toml pl.miner = miner.New(pl, &pl.config.Miner, - pl.host.GetConfigurationPlugin().ChainConfig(), mux, pl.engine, pl.isLocalBlock) - // extra data must be nil until 1 block 1 transaction. - // eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) - // Build and set the RPC Backend and other services. - - // if pl.APIBackend.allowUnprotectedTxs { - // log.Info("Unprotected transactions allowed") - // } + &pl.config.Chain, mux, pl.engine, pl.isLocalBlock) - return nil + return pl } // APIs return the collection of RPC services the polar package offers. From 7390bc746f8a5aab50c109c3bed61e99b2f155d1 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 13 Oct 2023 16:04:10 -0400 Subject: [PATCH 090/122] refactor(x/evm): improve genesis tests slightly --- cosmos/x/evm/genesis_test.go | 51 ++++++++++++++---------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index 8f0157702b..c128a2dcaa 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -21,9 +21,7 @@ package evm_test import ( - "bytes" "encoding/json" - "fmt" "math/big" "testing" @@ -52,10 +50,10 @@ var ( func TestGenesis(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm") + RunSpecs(t, "Genesis Suite") } -var _ = Describe("", func() { +var _ = Describe("Genesis", func() { var ( ctx sdk.Context ak state.AccountKeeper @@ -94,19 +92,17 @@ var _ = Describe("", func() { am = evm.NewAppModule(k, ak) }) - Context("On InitGenesis", func() { + Describe("On InitGenesis", func() { + var bz []byte BeforeEach(func() { + bz, err = json.Marshal(ethGen) + Expect(err).ToNot(HaveOccurred()) }) JustBeforeEach(func() { - var bz []byte - bz, err = json.Marshal(ethGen) - if err != nil { - panic(err) - } am.InitGenesis(ctx, nil, bz) }) - When("the genesis is valid", func() { + Context("when the genesis is valid", func() { It("should succeed without error", func() { Expect(err).ToNot(HaveOccurred()) }) @@ -119,16 +115,14 @@ var _ = Describe("", func() { sp := k.Host.GetStatePlugin() for addr, acc := range ethGen.Alloc { balance := sp.GetBalance(addr) - cmp := balance.Cmp(acc.Balance) - Expect(cmp).To(BeZero()) + Expect(balance).To(Equal(acc.Balance)) } }) It("should have the correct code", func() { sp := k.Host.GetStatePlugin() for addr, acc := range ethGen.Alloc { code := sp.GetCode(addr) - cmp := bytes.Compare(code, acc.Code) - Expect(cmp).To(BeZero()) + Expect(code).To(Equal(acc.Code)) } }) It("should have the correct hash", func() { @@ -136,36 +130,31 @@ var _ = Describe("", func() { for addr, acc := range ethGen.Alloc { for key, expectedHash := range acc.Storage { actualHash := sp.GetState(addr, key) - cmp := bytes.Compare(actualHash.Bytes(), expectedHash.Bytes()) - Expect(cmp).To(BeZero()) + Expect(actualHash.Bytes()).To(Equal(expectedHash.Bytes())) } } }) }) }) - Context("On ExportGenesis", func() { + Describe("On ExportGenesis", func() { var ( actualGenesis core.Genesis + bz []byte ) - JustBeforeEach(func() { - var bz []byte + BeforeEach(func() { bz, err = json.Marshal(ethGen) - if err != nil { - panic(err) - } + Expect(err).ToNot(HaveOccurred()) am.InitGenesis(ctx, nil, bz) - + }) + JustBeforeEach(func() { data := am.ExportGenesis(ctx, nil) - if data == nil { - panic(fmt.Errorf("data is nil")) - } - if err = actualGenesis.UnmarshalJSON(data); err != nil { - panic(err) - } + Expect(data).ToNot(BeNil()) + err = actualGenesis.UnmarshalJSON(data) + Expect(err).ToNot(HaveOccurred()) }) - When("the genesis is valid", func() { + Context("when the genesis is valid", func() { It("should export without fail", func() { ethGen.Config = nil ethGen.BaseFee = big.NewInt(int64(params.InitialBaseFee)) From 6b80065f7e6ac3cef838ac643bdad40396acf3a3 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 13 Oct 2023 16:05:25 -0400 Subject: [PATCH 091/122] fix(test): genesis naming --- cosmos/x/evm/genesis_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index c128a2dcaa..c6b0bd5dfe 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -50,7 +50,7 @@ var ( func TestGenesis(t *testing.T) { RegisterFailHandler(Fail) - RunSpecs(t, "Genesis Suite") + RunSpecs(t, "cosmos/x/evm") } var _ = Describe("Genesis", func() { From 6e20f9a0ed71bdf75a60ba9feed75a808f73b583 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:55:52 -0400 Subject: [PATCH 092/122] chore(deps-dev): bump undici from 5.22.1 to 5.26.3 in /contracts (#1229) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- contracts/package-lock.json | 38 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/contracts/package-lock.json b/contracts/package-lock.json index 6bd13f8473..7fa009d796 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -761,6 +761,15 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", @@ -1922,18 +1931,6 @@ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -3926,15 +3923,6 @@ "node": ">= 0.8" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4097,12 +4085,12 @@ } }, "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", + "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", "dev": true, "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" From 1aa969f82b0b2da8f6f7f0f750aa18e29a740776 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:11:21 -0400 Subject: [PATCH 093/122] chore(deps): bump @babel/traverse from 7.21.2 to 7.23.2 in /docs/web (#1230) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/web/pnpm-lock.yaml | 295 ++++++++++++++-------------------------- docs/web/yarn.lock | 144 +++++++++++--------- 2 files changed, 183 insertions(+), 256 deletions(-) diff --git a/docs/web/pnpm-lock.yaml b/docs/web/pnpm-lock.yaml index 9ae1a730e0..66b3d6c68f 100644 --- a/docs/web/pnpm-lock.yaml +++ b/docs/web/pnpm-lock.yaml @@ -78,18 +78,11 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: false - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 - dev: false - - /@babel/code-frame@7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.10 + '@babel/highlight': 7.22.20 chalk: 2.4.2 dev: false @@ -103,15 +96,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helpers': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2(supports-color@5.5.0) + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 @@ -121,21 +114,11 @@ packages: - supports-color dev: false - /@babel/generator@7.21.1: - resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.2 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: false - - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 @@ -145,21 +128,21 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.2 + '@babel/types': 7.22.10 dev: false /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-compilation-targets@7.22.10: @@ -181,8 +164,8 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) @@ -218,65 +201,45 @@ packages: - supports-color dev: false - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.2 - dev: false - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 - dev: false - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.2 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: false /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.2 + '@babel/types': 7.22.10 dev: false /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): @@ -286,18 +249,18 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.5 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: false /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-plugin-utils@7.22.5: @@ -313,7 +276,7 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.10 dev: false @@ -324,7 +287,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 dev: false @@ -333,33 +296,21 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 - dev: false - - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.2 + '@babel/types': 7.23.0 dev: false /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 - dev: false - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.23.0 dev: false /@babel/helper-string-parser@7.22.5: @@ -367,8 +318,8 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: false @@ -386,54 +337,37 @@ packages: resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: false /@babel/helpers@7.22.10: resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2(supports-color@5.5.0) + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color dev: false - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: false - - /@babel/highlight@7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: false - /@babel/parser@7.21.2: - resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.2 - dev: false - - /@babel/parser@7.22.10: - resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.10): @@ -466,7 +400,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) @@ -794,7 +728,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) @@ -864,8 +798,8 @@ packages: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) @@ -881,7 +815,7 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 + '@babel/template': 7.22.15 dev: false /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.10): @@ -977,7 +911,7 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -1056,7 +990,7 @@ packages: '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: false /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.10): @@ -1246,7 +1180,7 @@ packages: '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: false /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.10): @@ -1475,7 +1409,7 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.10) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.10) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.10) - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.10) babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.10) babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.10) @@ -1504,7 +1438,7 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 esutils: 2.0.3 dev: false @@ -1547,75 +1481,48 @@ packages: regenerator-runtime: 0.13.11 dev: false - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.21.2 - '@babel/types': 7.21.2 - dev: false - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: false - /@babel/traverse@7.21.2(supports-color@5.5.0): - resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} + /@babel/traverse@7.23.2(supports-color@5.5.0): + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.1 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.2 - '@babel/types': 7.21.2 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/traverse@7.22.10: - resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: false - /@babel/types@7.21.2: - resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 dev: false - /@babel/types@7.22.10: - resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: false @@ -2405,7 +2312,7 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.0 '@babel/preset-env': 7.22.10(@babel/core@7.22.10) flow-parser: 0.206.0 jscodeshift: 0.14.0(@babel/preset-env@7.22.10) @@ -3434,7 +3341,7 @@ packages: /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: - color-name: 1.1.3 + color-name: 1.1.4 simple-swizzle: 0.2.2 dev: false @@ -4656,7 +4563,7 @@ packages: resolution: {integrity: sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 '@jest/types': 29.6.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -4774,7 +4681,7 @@ packages: '@babel/preset-env': ^7.1.6 dependencies: '@babel/core': 7.22.10 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.0 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) @@ -5366,7 +5273,7 @@ packages: '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.10) '@babel/plugin-transform-typescript': 7.22.10(@babel/core@7.22.10) '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.10) - '@babel/template': 7.22.5 + '@babel/template': 7.22.15 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.22.10) react-refresh: 0.4.3 transitivePeerDependencies: @@ -5413,8 +5320,8 @@ packages: resolution: {integrity: sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==} engines: {node: '>=16'} dependencies: - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/traverse': 7.23.2(supports-color@5.5.0) + '@babel/types': 7.23.0 invariant: 2.2.4 metro-symbolicate: 0.76.7 nullthrows: 1.1.1 @@ -5429,8 +5336,8 @@ packages: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} engines: {node: '>=16'} dependencies: - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/traverse': 7.23.2(supports-color@5.5.0) + '@babel/types': 7.23.0 invariant: 2.2.4 metro-symbolicate: 0.76.8 nullthrows: 1.1.1 @@ -5476,9 +5383,9 @@ packages: engines: {node: '>=16'} dependencies: '@babel/core': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 + '@babel/generator': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2(supports-color@5.5.0) nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -5489,9 +5396,9 @@ packages: engines: {node: '>=16'} dependencies: '@babel/core': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 babel-preset-fbjs: 3.4.0(@babel/core@7.22.10) metro: 0.76.7 metro-babel-transformer: 0.76.7 @@ -5512,13 +5419,13 @@ packages: engines: {node: '>=16'} hasBin: true dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 '@babel/core': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2(supports-color@5.5.0) + '@babel/types': 7.23.0 accepts: 1.3.8 async: 3.2.4 chalk: 4.1.2 @@ -7567,7 +7474,7 @@ packages: react-is: '>= 16.8.0' dependencies: '@babel/helper-module-imports': 7.18.6 - '@babel/traverse': 7.21.2(supports-color@5.5.0) + '@babel/traverse': 7.23.2(supports-color@5.5.0) '@emotion/is-prop-valid': 1.2.0 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 diff --git a/docs/web/yarn.lock b/docs/web/yarn.lock index 0d59c2a46a..1e7a1552e6 100644 --- a/docs/web/yarn.lock +++ b/docs/web/yarn.lock @@ -2,19 +2,20 @@ # yarn lockfile v1 -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.21.0" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -26,25 +27,25 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": version "7.18.6" @@ -53,36 +54,46 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.20.7", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/runtime@^7.10.4", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1": version "7.21.0" @@ -91,32 +102,32 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" "@babel/traverse@^7.4.5": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": +"@babel/types@^7.18.6": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== @@ -125,6 +136,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@emotion/is-prop-valid@^0.8.2": version "0.8.8" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" @@ -986,7 +1006,7 @@ chalk@2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" -chalk@^2.0.0: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== From dcc827039d5cef57010fcea4d7e0fc779035cb6e Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 16 Oct 2023 17:07:15 -0400 Subject: [PATCH 094/122] refactor(evm): Deprecate engine plugin + allow custom `consensus.Engine` (#1225) --- .github/workflows/codeql.yml | 2 +- .github/workflows/daily.yml | 2 +- .github/workflows/e2e.yml | 8 +- .github/workflows/pipeline.yml | 2 +- Makefile | 2 +- cosmos/config/config.go | 17 +- cosmos/miner/miner.go | 13 +- .../comet_bft.go => runtime/comet/sync.go} | 22 ++- cosmos/runtime/runtime.go | 101 ++++++---- cosmos/txpool/mempool.go | 14 +- cosmos/x/evm/depinject.go | 3 - cosmos/x/evm/genesis_test.go | 4 +- cosmos/x/evm/keeper/deprecate_me_please.go | 63 ------- cosmos/x/evm/keeper/host.go | 26 +-- cosmos/x/evm/keeper/keeper.go | 18 +- cosmos/x/evm/module.go | 2 + cosmos/x/evm/plugins/engine/plugin.go | 54 ------ .../evm/plugins/historical/historical_test.go | 33 ---- .../x/evm/plugins/historical/plugin_test.go | 6 + .../x/evm/plugins/precompile/plugin_test.go | 6 + cosmos/x/evm/types/tx.go | 5 - e2e/localnet/network/fixture_test.go | 2 +- e2e/localnet/network/node_test.go | 2 +- e2e/precompile/utils.go | 2 +- e2e/testapp/app.go | 6 +- e2e/testapp/docker/base.Dockerfile | 2 +- e2e/testapp/polard/cmd/root.go | 3 + eth/core/host.go | 17 -- eth/eth.go | 178 ++++++++++++++++++ .../precompile_test.go => eth/node/config.go | 27 ++- eth/{polar => node}/node.go | 37 ++-- eth/polar/api_backend.go | 54 ++++-- eth/polar/backend.go | 174 +++++++---------- eth/polar/config.go | 2 - 34 files changed, 459 insertions(+), 450 deletions(-) rename cosmos/{x/evm/plugins/engine/comet_bft.go => runtime/comet/sync.go} (79%) delete mode 100644 cosmos/x/evm/keeper/deprecate_me_please.go delete mode 100644 cosmos/x/evm/plugins/engine/plugin.go delete mode 100644 cosmos/x/evm/plugins/historical/historical_test.go create mode 100644 eth/eth.go rename cosmos/x/evm/plugins/precompile/precompile_test.go => eth/node/config.go (66%) rename eth/{polar => node}/node.go (70%) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4242f4c71a..c6aa413585 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -34,7 +34,7 @@ # fail-fast: false # matrix: # language: ["go"] -# versions: [1.21.1] +# versions: [1.21.3] # # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # # Use only 'java' to analyze code written in Java, Kotlin or both # # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 8b9941cbc0..ac9743aff5 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -8,7 +8,7 @@ jobs: docs: strategy: matrix: - go-version: [1.21.1] + go-version: [1.21.3] python-version: [3.11.5] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index d3579c6a5b..ae61d8acb8 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -32,7 +32,7 @@ jobs: matrix: docker-type: [base] # Changed docker-version to docker-type for consistency with the Makefile os: [polaris-linux-latest] - go-version: [1.21.1] + go-version: [1.21.3] arch: [amd64] # Changed go-arch to arch for consistency with the Makefile image-name: ["polard/base:v0.0.0"] export-name: [base-image] @@ -70,7 +70,7 @@ jobs: namespace: [cosmos] docker-type: [localnet] # Changed docker-version to docker-type for consistency with the Makefile os: [polaris-linux-latest] - go-version: [1.21.1] + go-version: [1.21.3] arch: [amd64] # Changed go-arch to arch for consistency with the Makefile base-image: [base-image] image-name: ["polard/localnet:v0.0.0"] @@ -115,7 +115,7 @@ jobs: strategy: matrix: os: [polaris-linux-latest] - go-version: [1.21.1] + go-version: [1.21.3] base-image: [base-image] runs-on: ${{ matrix.os }} steps: @@ -151,7 +151,7 @@ jobs: matrix: namespace: ["e2e", "localnet"] os: [polaris-linux-latest] - go-version: [1.21.1] + go-version: [1.21.3] base-image: [localnet] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 745bdb95f7..8aa85611a7 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -32,7 +32,7 @@ jobs: matrix: args: ["build", "lint", "test-unit-race", "test-unit-cover"] os: [polaris-linux-latest] - go-version: [1.21.1] + go-version: [1.21.3] runs-on: ${{ matrix.os }} steps: - name: Checkout diff --git a/Makefile b/Makefile index 828a1032fb..d1fba61dff 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ proto-build: # Variables DOCKER_TYPE ?= base ARCH ?= arm64 -GO_VERSION ?= 1.21.1 +GO_VERSION ?= 1.21.3 IMAGE_NAME ?= polard IMAGE_VERSION ?= v0.0.0 BASE_IMAGE ?= polard/base:$(IMAGE_VERSION) diff --git a/cosmos/config/config.go b/cosmos/config/config.go index c9dd76499c..2bbf8648b7 100644 --- a/cosmos/config/config.go +++ b/cosmos/config/config.go @@ -27,13 +27,15 @@ import ( servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/node" - "pkg.berachain.dev/polaris/cosmos/config/flags" + "pkg.berachain.dev/polaris/eth" "pkg.berachain.dev/polaris/eth/accounts" + "pkg.berachain.dev/polaris/eth/node" "pkg.berachain.dev/polaris/eth/polar" ) +type Config = eth.Config + // SetupCosmosConfig sets up the Cosmos SDK configuration to be compatible with the // semantics of etheruem. func SetupCosmosConfig() { @@ -49,22 +51,15 @@ func SetupCosmosConfig() { // DefaultConfig returns the default configuration for a polaris chain. func DefaultConfig() *Config { - nodeCfg := *polar.DefaultGethNodeConfig() + nodeCfg := node.DefaultConfig() nodeCfg.DataDir = "" nodeCfg.KeyStoreDir = "" return &Config{ Polar: *polar.DefaultConfig(), - Node: nodeCfg, + Node: *nodeCfg, } } -// Config represents the configuration options for a node running a polar -// evm. -type Config struct { - Polar polar.Config - Node node.Config -} - // MustReadConfigFromAppOpts reads the configuration options from the given // application options. Panics if the configuration cannot be read. func MustReadConfigFromAppOpts(opts servertypes.AppOptions) *Config { diff --git a/cosmos/miner/miner.go b/cosmos/miner/miner.go index a4169088c6..39a6ab583c 100644 --- a/cosmos/miner/miner.go +++ b/cosmos/miner/miner.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/miner" + "pkg.berachain.dev/polaris/eth" "pkg.berachain.dev/polaris/eth/core/types" ) @@ -44,23 +45,17 @@ type EnvelopeSerializer interface { ToSdkTxBytes(*engine.ExecutionPayloadEnvelope, uint64) ([]byte, error) } -// GethMiner represents the underlying *miner.Miner from geth. -type GethMiner interface { - BuildPayload(*miner.BuildPayloadArgs) (*miner.Payload, error) - Etherbase() common.Address -} - // Miner implements the baseapp.TxSelector interface. type Miner struct { - GethMiner + eth.Miner serializer EnvelopeSerializer currentPayload *miner.Payload } // New produces a cosmos miner from a geth miner. -func New(gm GethMiner) *Miner { +func New(gm eth.Miner) *Miner { return &Miner{ - GethMiner: gm, + Miner: gm, } } diff --git a/cosmos/x/evm/plugins/engine/comet_bft.go b/cosmos/runtime/comet/sync.go similarity index 79% rename from cosmos/x/evm/plugins/engine/comet_bft.go rename to cosmos/runtime/comet/sync.go index f65d66a84d..327432b8a0 100644 --- a/cosmos/x/evm/plugins/engine/comet_bft.go +++ b/cosmos/runtime/comet/sync.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package engine +package comet import ( "context" @@ -28,22 +28,26 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum" + + "pkg.berachain.dev/polaris/eth/polar" ) -// syncView is a view of the sync status from CometBFT. -type cometBftView struct { +var _ polar.SyncStatusProvider = (*cometSyncStatus)(nil) + +// cometSyncStatus is a view of the sync status from CometBFT. +type cometSyncStatus struct { cometClient client.CometRPC } -// newSyncView returns a new syncView. -func newSyncView(clientCtx client.Context) *cometBftView { - return &cometBftView{ +// NewSyncProvider returns a new cometSyncStatus. +func NewSyncProvider(clientCtx client.Context) polar.SyncStatusProvider { + return &cometSyncStatus{ cometClient: clientCtx.Client, } } // PeerCount returns the number of peers currently connected to the node. -func (sv *cometBftView) PeerCount(ctx context.Context) (uint64, error) { +func (sv *cometSyncStatus) PeerCount(ctx context.Context) (uint64, error) { result, err := sv.cometClient.(cmtclient.NetworkClient).NetInfo(ctx) if err != nil { return 0, err @@ -54,7 +58,7 @@ func (sv *cometBftView) PeerCount(ctx context.Context) (uint64, error) { // Listening returns whether the node is currently listening for incoming // connections from other nodes. -func (sv *cometBftView) Listening(ctx context.Context) (bool, error) { +func (sv *cometSyncStatus) Listening(ctx context.Context) (bool, error) { result, err := sv.cometClient.(cmtclient.NetworkClient).NetInfo(ctx) if err != nil { return false, err @@ -64,7 +68,7 @@ func (sv *cometBftView) Listening(ctx context.Context) (bool, error) { } // SyncProgress returns the current sync progress. -func (sv *cometBftView) SyncProgress(ctx context.Context) (ethereum.SyncProgress, error) { +func (sv *cometSyncStatus) SyncProgress(ctx context.Context) (ethereum.SyncProgress, error) { resultStatus, err := sv.cometClient.(cmtclient.StatusClient).Status(ctx) if err != nil { return ethereum.SyncProgress{}, err diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 9a31826911..76f82bbd43 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -21,123 +21,150 @@ package runtime import ( + "time" + "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" - "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/mempool" "github.com/ethereum/go-ethereum/beacon/engine" - "github.com/ethereum/go-ethereum/node" - "pkg.berachain.dev/polaris/cosmos/config" libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" + "pkg.berachain.dev/polaris/cosmos/runtime/comet" "pkg.berachain.dev/polaris/cosmos/txpool" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth" + "pkg.berachain.dev/polaris/eth/consensus" "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" - "pkg.berachain.dev/polaris/eth/polar" + "pkg.berachain.dev/polaris/eth/node" ) // EVMKeeper is an interface that defines the methods needed for the EVM setup. type EVMKeeper interface { // Setup initializes the EVM keeper. Setup(evmkeeper.Blockchain) error +} - // TODO: remove. - StartEnginePlugin(client.Context) +// CosmosApp is an interface that defines the methods needed for the Cosmos setup. +type CosmosApp interface { + SetPrepareProposal(sdk.PrepareProposalHandler) + SetMempool(mempool.Mempool) + SetAnteHandler(sdk.AnteHandler) } // Polaris is a struct that wraps the Polaris struct from the polar package. // It also includes wrapped versions of the Geth Miner and TxPool. type Polaris struct { - *polar.Polaris + *eth.ExecutionLayer // WrappedMiner is a wrapped version of the Miner component. WrappedMiner *miner.Miner // WrappedTxPool is a wrapped version of the Mempool component. WrappedTxPool *txpool.Mempool + // logger is the underlying logger supplied by the sdk. + logger log.Logger } // ProvidePolarisRuntime creates a new Polaris runtime from the provided // dependencies. -func New(cfg *config.Config, logger log.Logger, host core.PolarisHostChain) *Polaris { - node, err := polar.NewGethNetworkingStack(&cfg.Node) +func New( + cfg *eth.Config, + logger log.Logger, + host core.PolarisHostChain, + engine consensus.Engine, +) *Polaris { + var err error + p := &Polaris{ + logger: logger, + } + + p.ExecutionLayer, err = eth.New("geth", cfg, host, engine, LoggerFuncHandler(logger)) if err != nil { panic(err) } - polaris := polar.NewWithNetworkingStack( - &cfg.Polar, host, node, LoggerFuncHandler(logger), - ) - - return &Polaris{ - Polaris: polaris, - } + return p } -// Setup is a function that sets up the Polaris struct. +// Build is a function that sets up the Polaris struct. // It takes a BaseApp and an EVMKeeper as arguments. // It returns an error if the setup fails. -func (p *Polaris) Setup(bApp *baseapp.BaseApp, ek EVMKeeper) error { +func (p *Polaris) Build(app CosmosApp, ek EVMKeeper) error { p.WrappedTxPool = txpool.New(p.TxPool()) - bApp.SetMempool(p.WrappedTxPool) + app.SetMempool(p.WrappedTxPool) p.WrappedMiner = miner.New(p.Miner()) - bApp.SetPrepareProposal(p.WrappedMiner.PrepareProposal) + app.SetPrepareProposal(p.WrappedMiner.PrepareProposal) if err := ek.Setup(p.Blockchain()); err != nil { return err } // Set the ante handler to nil, since it is not needed. - bApp.SetAnteHandler(nil) + app.SetAnteHandler(nil) return nil } -// Init is a function that initializes the Polaris struct. -// It takes a client context and a logger as arguments. -// It returns an error if the initialization fails. -func (p *Polaris) Init(clientCtx client.Context, logger log.Logger, ek EVMKeeper) error { - // Initialize services. +// SetupServices initializes and registers the services with Polaris. +// It takes a client context as an argument and returns an error if the setup fails. +func (p *Polaris) SetupServices(clientCtx client.Context) error { + // Initialize the miner with a new execution payload serializer. p.WrappedMiner.Init(libtx.NewSerializer[*engine.ExecutionPayloadEnvelope]( clientCtx.TxConfig, evmtypes.WrapPayload)) - p.WrappedTxPool.Init(logger, clientCtx, libtx.NewSerializer[*coretypes.Transaction]( + // Initialize the txpool with a new transaction serializer. + p.WrappedTxPool.Init(p.logger, clientCtx, libtx.NewSerializer[*coretypes.Transaction]( clientCtx.TxConfig, evmtypes.WrapTx)) // Register services with Polaris. - p.RegisterServices(clientCtx, []node.Lifecycle{ + p.RegisterLifecycles([]node.Lifecycle{ p.WrappedTxPool, }) - // - ek.StartEnginePlugin(clientCtx) - return nil + // Register the sync status provider with Polaris. + p.RegisterSyncStatusProvider(comet.NewSyncProvider(clientCtx)) + + // Start the services. TODO: move to place race condition is solved. + return p.StartServices() } // RegisterServices is a function that allows for the application to register lifecycles with // the evm networking stack. It takes a client context and a slice of node.Lifecycle // as arguments. -func (p *Polaris) RegisterServices(_ client.Context, lcs []node.Lifecycle) { +func (p *Polaris) RegisterLifecycles(lcs []node.Lifecycle) { // Register the services with polaris. for _, lc := range lcs { - p.RegisterService(lc) + p.ExecutionLayer.RegisterLifecycle(lc) } +} - // Start the services. - if err := p.StartServices(); err != nil { - panic(err) - } +// StartServices starts the services of the Polaris struct. +func (p *Polaris) StartServices() error { + go func() { + // TODO: these values are sensitive due to a race condition in the json-rpc ports opening. + // If the JSON-RPC opens before the first block is committed, hive tests will start failing. + // This needs to be fixed before mainnet as its ghetto af. If the block time is too long + // and this sleep is too short, it will cause hive tests to error out. + time.Sleep(5 * time.Second) //nolint:gomnd // as explained above. + if err := p.ExecutionLayer.Start(); err != nil { + panic(err) + } + }() + + return nil } // LoadLastState is a function that loads the last state of the Polaris struct. // It takes a CommitMultiStore and an appHeight as arguments. // It returns an error if the loading fails. +// TODO: is incomplete in the blockchain object. func (p *Polaris) LoadLastState(cms storetypes.CommitMultiStore, appHeight uint64) error { cmsCtx := sdk.Context{}. WithMultiStore(cms). diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index 98b389f086..a0b9e83895 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -30,10 +30,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/mempool" "github.com/ethereum/go-ethereum/core/txpool/legacypool" - "github.com/ethereum/go-ethereum/event" "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/core" + "pkg.berachain.dev/polaris/eth" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/lib/utils" ) @@ -44,13 +43,6 @@ var ( _ Lifecycle = (*Mempool)(nil) ) -// GethTxPool represents the interface to interact with the geth txpool. -type GethTxPool interface { - Add([]*coretypes.Transaction, bool, bool) []error - Stats() (int, int) - SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription -} - // Lifecycle represents a lifecycle object. type Lifecycle interface { Start() error @@ -62,12 +54,12 @@ type Lifecycle interface { // is to allow for transactions coming in from CometBFT's gossip to be added to the underlying // geth txpool during `CheckTx`, that is the only purpose of `Mempool“. type Mempool struct { - txpool GethTxPool + txpool eth.TxPool handler Lifecycle } // NewMempool creates a new Mempool. -func New(txpool GethTxPool) *Mempool { +func New(txpool eth.TxPool) *Mempool { return &Mempool{ txpool: txpool, } diff --git a/cosmos/x/evm/depinject.go b/cosmos/x/evm/depinject.go index dbee502d48..cdf5b44334 100644 --- a/cosmos/x/evm/depinject.go +++ b/cosmos/x/evm/depinject.go @@ -23,7 +23,6 @@ package evm import ( "cosmossdk.io/core/appmodule" "cosmossdk.io/depinject" - "cosmossdk.io/log" store "cosmossdk.io/store/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" @@ -51,7 +50,6 @@ type DepInjectInput struct { Key *store.KVStoreKey AppOpts servertypes.AppOptions - Logger log.Logger PolarisCfg func() *config.Config CustomPrecompiles func() *ethprecompile.Injector `optional:"true"` QueryContextFn func() func(height int64, prove bool) (sdk.Context, error) @@ -79,7 +77,6 @@ func ProvideModule(in DepInjectInput) DepInjectOutput { in.Key, in.CustomPrecompiles, in.QueryContextFn, - in.Logger, in.PolarisCfg(), ) m := NewAppModule(k, in.AccountKeeper) diff --git a/cosmos/x/evm/genesis_test.go b/cosmos/x/evm/genesis_test.go index c6b0bd5dfe..702672fc99 100644 --- a/cosmos/x/evm/genesis_test.go +++ b/cosmos/x/evm/genesis_test.go @@ -80,12 +80,12 @@ var _ = Describe("Genesis", func() { return ctx, nil } }, - log.NewTestLogger(GinkgoT()), cfg, ) - k.SetBlockchain( + err = k.Setup( core.NewChain(k.Host, params.DefaultChainConfig, beacon.NewFaker()), ) + Expect(err).ToNot(HaveOccurred()) err = k.SetupPrecompiles() Expect(err).ToNot(HaveOccurred()) diff --git a/cosmos/x/evm/keeper/deprecate_me_please.go b/cosmos/x/evm/keeper/deprecate_me_please.go deleted file mode 100644 index fb9c75d272..0000000000 --- a/cosmos/x/evm/keeper/deprecate_me_please.go +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package keeper - -import ( - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" - "pkg.berachain.dev/polaris/eth/common" -) - -// TODO: Remove these, because they're hacky af. -// Required temporarily for BGT plugin in the Berachain repo, these REALLY -// REALLY REALLY REALLY NEED TO GO, IF YOU ARE BUILDING YOUR OWN POLARIS CHAIN -// PLEASE DO NOT USE THIS FUNCTIONS DIRECTLY. - -func (k *Keeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress) *big.Int { - ethAddr := common.BytesToAddress(addr) - return new(big.Int).SetBytes(ctx.KVStore(k.storeKey).Get(state.BalanceKeyFor(ethAddr))) -} - -func (k *Keeper) SetBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { - ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set(state.BalanceKeyFor(ethAddr), amount.Bytes()) -} - -func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { - if amount.Sign() == 0 { - return - } - ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set( - state.BalanceKeyFor(ethAddr), new(big.Int).Add(k.GetBalance(ctx, addr), amount).Bytes()) -} - -func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, amount *big.Int) { - if amount.Sign() == 0 { - return - } - ethAddr := common.BytesToAddress(addr) - ctx.KVStore(k.storeKey).Set( - state.BalanceKeyFor(ethAddr), new(big.Int).Sub(k.GetBalance(ctx, addr), amount).Bytes()) -} diff --git a/cosmos/x/evm/keeper/host.go b/cosmos/x/evm/keeper/host.go index 997dbe50f1..a61ab59511 100644 --- a/cosmos/x/evm/keeper/host.go +++ b/cosmos/x/evm/keeper/host.go @@ -21,14 +21,12 @@ package keeper import ( - "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/block" - "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/engine" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/historical" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile" pclog "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/precompile/log" @@ -42,12 +40,10 @@ var _ core.PolarisHostChain = (*Host)(nil) type Host struct { // The various plugins that are are used to implement core.PolarisHostChain. - bp block.Plugin - ep engine.Plugin - hp historical.Plugin - pp precompile.Plugin - sp state.Plugin - logger log.Logger + bp block.Plugin + hp historical.Plugin + pp precompile.Plugin + sp state.Plugin pcs func() *ethprecompile.Injector } @@ -59,18 +55,15 @@ func NewHost( ak state.AccountKeeper, precompiles func() *ethprecompile.Injector, qc func() func(height int64, prove bool) (sdk.Context, error), - logger log.Logger, ) *Host { // We setup the host with some Cosmos standard sauce. h := &Host{ bp: block.NewPlugin( storeKey, qc, ), - ep: engine.NewPlugin(), - pcs: precompiles, - pp: precompile.NewPlugin(), - sp: state.NewPlugin(ak, storeKey, qc, nil), - logger: logger, + pcs: precompiles, + pp: precompile.NewPlugin(), + sp: state.NewPlugin(ak, storeKey, qc, nil), } // historical plugin requires block plugin. @@ -96,11 +89,6 @@ func (h *Host) GetBlockPlugin() core.BlockPlugin { return h.bp } -// GetEnginePlugin returns the engine plugin. -func (h *Host) GetEnginePlugin() core.EnginePlugin { - return h.ep -} - // GetHistoricalPlugin returns the historical plugin. func (h *Host) GetHistoricalPlugin() core.HistoricalPlugin { return h.hp diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index aee1c4d0ac..ec60248414 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -26,7 +26,6 @@ import ( "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" - "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" "pkg.berachain.dev/polaris/cosmos/config" @@ -50,9 +49,6 @@ type Keeper struct { // provider is the struct that houses the Polaris EVM. chain Blockchain - - // TODO: remove this, because it's hacky af. - storeKey storetypes.StoreKey } // NewKeeper creates new instances of the polaris Keeper. @@ -61,7 +57,6 @@ func NewKeeper( storeKey storetypes.StoreKey, pcs func() *ethprecompile.Injector, qc func() func(height int64, prove bool) (sdk.Context, error), - logger log.Logger, polarisCfg *config.Config, ) *Keeper { host := NewHost( @@ -70,11 +65,9 @@ func NewKeeper( ak, pcs, qc, - logger, ) return &Keeper{ - Host: host, - storeKey: storeKey, + Host: host, } } @@ -83,15 +76,6 @@ func (k *Keeper) Setup(chain Blockchain) error { return k.SetupPrecompiles() } -func (k *Keeper) StartEnginePlugin(ctx client.Context) { - k.ep.Start(ctx) -} - -// SetBlock sets the underlying ethereum blockchain on the keeper. -func (k *Keeper) SetBlockchain(chain Blockchain) { - k.chain = chain -} - // Logger returns a module-specific logger. func (k *Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With(types.ModuleName) diff --git a/cosmos/x/evm/module.go b/cosmos/x/evm/module.go index c6e9810b1d..5969ad3dd3 100644 --- a/cosmos/x/evm/module.go +++ b/cosmos/x/evm/module.go @@ -126,10 +126,12 @@ func (am AppModule) RegisterServices(registrar grpc.ServiceRegistrar) error { // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion } +// PrepareCheckState prepares the application state for a check. func (am AppModule) PrepareCheckState(ctx context.Context) error { return am.keeper.PrepareCheckState(ctx) } +// Precommit performs precommit operations. func (am AppModule) Precommit(ctx context.Context) error { return am.keeper.Precommit(ctx) } diff --git a/cosmos/x/evm/plugins/engine/plugin.go b/cosmos/x/evm/plugins/engine/plugin.go deleted file mode 100644 index 0b5afac1ee..0000000000 --- a/cosmos/x/evm/plugins/engine/plugin.go +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package engine - -import ( - "github.com/cosmos/cosmos-sdk/client" - - "pkg.berachain.dev/polaris/eth/core" -) - -// Compile-time type assertion. -var _ Plugin = (*plugin)(nil) - -// Plugin defines the required functions of the transaction pool plugin. -type Plugin interface { - core.EnginePlugin - Start(client.Context) -} - -// plugin represents the transaction pool plugin. -type plugin struct { - *cometBftView -} - -// NewPlugin returns a new transaction pool plugin. -func NewPlugin() Plugin { - return &plugin{} -} - -// Setup implements the Plugin interface. -func (p *plugin) Start(ctx client.Context) { - p.cometBftView = newSyncView(ctx) -} - -// IsPlugin implements the Plugin interface. -func (plugin) IsPlugin() {} diff --git a/cosmos/x/evm/plugins/historical/historical_test.go b/cosmos/x/evm/plugins/historical/historical_test.go deleted file mode 100644 index 31da0dd3d2..0000000000 --- a/cosmos/x/evm/plugins/historical/historical_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2023, Berachain Foundation. All rights reserved. -// Use of this software is govered by the Business Source License included -// in the LICENSE file of this repository and at www.mariadb.com/bsl11. -// -// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY -// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER -// VERSIONS OF THE LICENSED WORK. -// -// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF -// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF -// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). -// -// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON -// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, -// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND -// TITLE. - -package historical - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestHistoricalPlugin(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/historical") -} diff --git a/cosmos/x/evm/plugins/historical/plugin_test.go b/cosmos/x/evm/plugins/historical/plugin_test.go index dd318558ed..a89b0f1e66 100644 --- a/cosmos/x/evm/plugins/historical/plugin_test.go +++ b/cosmos/x/evm/plugins/historical/plugin_test.go @@ -22,6 +22,7 @@ package historical import ( "math/big" + "testing" "cosmossdk.io/log" @@ -41,6 +42,11 @@ import ( . "github.com/onsi/gomega" ) +func TestHistoricalPlugin(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/x/evm/plugins/historical") +} + var _ = Describe("Historical Data", func() { var ( p *plugin diff --git a/cosmos/x/evm/plugins/precompile/plugin_test.go b/cosmos/x/evm/plugins/precompile/plugin_test.go index b848d8a1be..cb2cdff89f 100644 --- a/cosmos/x/evm/plugins/precompile/plugin_test.go +++ b/cosmos/x/evm/plugins/precompile/plugin_test.go @@ -24,6 +24,7 @@ import ( "context" "errors" "math/big" + "testing" "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" @@ -45,6 +46,11 @@ import ( . "github.com/onsi/gomega" ) +func TestPrecompile(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/x/evm/plugins/precompile") +} + var _ = Describe("plugin", func() { var p *plugin var e vm.PrecompileEVM diff --git a/cosmos/x/evm/types/tx.go b/cosmos/x/evm/types/tx.go index 25ea25500f..7b78140d55 100644 --- a/cosmos/x/evm/types/tx.go +++ b/cosmos/x/evm/types/tx.go @@ -23,16 +23,11 @@ package types import ( "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/beacon/engine" coretypes "pkg.berachain.dev/polaris/eth/core/types" ) -// WrappedEthereumTransaction defines a Cosmos SDK message for Ethereum transactions. -var _ sdk.Msg = (*WrappedEthereumTransaction)(nil) - // WrapTx sets the transaction data from an `coretypes.Transaction`. func WrapTx(tx *coretypes.Transaction) (*WrappedEthereumTransaction, error) { bz, err := tx.MarshalBinary() diff --git a/e2e/localnet/network/fixture_test.go b/e2e/localnet/network/fixture_test.go index 78301a1b59..e5976e6796 100644 --- a/e2e/localnet/network/fixture_test.go +++ b/e2e/localnet/network/fixture_test.go @@ -59,7 +59,7 @@ var _ = Describe("JSON RPC tests", func() { "goodcontainer", "8545/tcp", "8546/tcp", - "1.21.1", + "1.21.3", )) Expect(tf).ToNot(BeNil()) client = tf.EthClient() diff --git a/e2e/localnet/network/node_test.go b/e2e/localnet/network/node_test.go index 0081f76e0e..bbdd07a49e 100644 --- a/e2e/localnet/network/node_test.go +++ b/e2e/localnet/network/node_test.go @@ -49,7 +49,7 @@ var _ = Describe("ContainerizedNode", func() { "8545/tcp", "8546/tcp", []string{ - "GO_VERSION=1.21.1", + "GO_VERSION=1.21.3", "BASE_IMAGE=polard/base:v0.0.0", }, ) diff --git a/e2e/precompile/utils.go b/e2e/precompile/utils.go index 328d9fc162..166bf2949c 100644 --- a/e2e/precompile/utils.go +++ b/e2e/precompile/utils.go @@ -34,7 +34,7 @@ const ( containerName = "goodcontainer" polardHTTPAddress = "8545/tcp" polardWSAddress = "8546/tcp" - goVersion = "1.21.1" + goVersion = "1.21.3" ) // NewPolarisFixtureConfig returns a polaris fixture config. diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 54ed11508f..a3db0b32c7 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -186,11 +186,11 @@ func NewPolarisApp( // Build the app using the app builder. app.App = appBuilder.Build(db, traceStore, baseAppOptions...) app.Polaris = polarruntime.New( - evmconfig.MustReadConfigFromAppOpts(appOpts), app.Logger(), app.EVMKeeper.Host, + evmconfig.MustReadConfigFromAppOpts(appOpts), app.Logger(), app.EVMKeeper.Host, nil, ) // Setup Polaris Runtime. - if err := app.Polaris.Setup(app.BaseApp, app.EVMKeeper); err != nil { + if err := app.Polaris.Build(app.BaseApp, app.EVMKeeper); err != nil { panic(err) } @@ -258,7 +258,7 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon panic(err) } - if err := app.Polaris.Init(apiSvr.ClientCtx, app.Logger(), app.EVMKeeper); err != nil { + if err := app.Polaris.SetupServices(apiSvr.ClientCtx); err != nil { panic(err) } } diff --git a/e2e/testapp/docker/base.Dockerfile b/e2e/testapp/docker/base.Dockerfile index 16986eeb0c..f28e7b7f45 100644 --- a/e2e/testapp/docker/base.Dockerfile +++ b/e2e/testapp/docker/base.Dockerfile @@ -18,7 +18,7 @@ ### Stage 0 - Build Arguments ### ####################################################### -ARG GO_VERSION=1.21.1 +ARG GO_VERSION=1.21.3 ARG GOARCH=amd64 ARG GOOS=linux ARG NAME=polaris-cosmos diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index fa1f9a002f..44e7a1fc88 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -174,6 +174,9 @@ func initCometBFTConfig() *cmtcfg.Config { consensus.TimeoutPrevote = time.Second * 2 consensus.TimeoutPrecommit = time.Second * 2 consensus.TimeoutCommit = time.Second * 2 + + // Disable the indexer + cfg.TxIndex.Indexer = "null" return cfg } diff --git a/eth/core/host.go b/eth/core/host.go index 395e69ad1b..2fc19c8ff1 100644 --- a/eth/core/host.go +++ b/eth/core/host.go @@ -21,10 +21,6 @@ package core import ( - "context" - - "github.com/ethereum/go-ethereum" - "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/core/precompile" "pkg.berachain.dev/polaris/eth/core/state" @@ -36,8 +32,6 @@ import ( type PolarisHostChain interface { // GetBlockPlugin returns the `BlockPlugin` of the Polaris host chain. GetBlockPlugin() BlockPlugin - // GetEnginePlugin() returns the `EnginePlugin` of the Polaris host chain. - GetEnginePlugin() EnginePlugin // GetHistoricalPlugin returns the OPTIONAL `HistoricalPlugin` of the Polaris host chain. GetHistoricalPlugin() HistoricalPlugin // GetPrecompilePlugin returns the OPTIONAL `PrecompilePlugin` of the Polaris host chain. @@ -67,17 +61,6 @@ type ( StoreHeader(*types.Header) error } - // EnginePlugin defines methods that allow the chain to have insight into the underlying - // consensus engine of the host chain. - EnginePlugin interface { - // SyncProgress returns the current sync progress of the host chain. - SyncProgress(ctx context.Context) (ethereum.SyncProgress, error) - // IsListening returns whether or not the host chain is listening for new blocks. - Listening(ctx context.Context) (bool, error) - // PeerCount returns the current number of peers connected to the host chain. - PeerCount(ctx context.Context) (uint64, error) - } - // StatePlugin defines the methods that the chain running Polaris EVM should implement. StatePlugin interface { state.Plugin diff --git a/eth/eth.go b/eth/eth.go new file mode 100644 index 0000000000..39eb5868ef --- /dev/null +++ b/eth/eth.go @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package eth + +import ( + "fmt" + "net/http" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/miner" + + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/eth/consensus" + "pkg.berachain.dev/polaris/eth/core" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/log" + "pkg.berachain.dev/polaris/eth/node" + "pkg.berachain.dev/polaris/eth/polar" + "pkg.berachain.dev/polaris/eth/rpc" +) + +type ( + + // Miner represents the `Miner` that exists on the backend of the execution layer. + Miner interface { + BuildPayload(*miner.BuildPayloadArgs) (*miner.Payload, error) + Etherbase() common.Address + } + + // TxPool represents the `TxPool` that exists on the backend of the execution layer. + TxPool interface { + Add([]*coretypes.Transaction, bool, bool) []error + Stats() (int, int) + SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription + } + + // ExecutionLayerNode is the entrypoint for the evm execution environment. + NetworkingStack interface { + // IsExtRPCEnabled returns true if the networking stack is configured to expose JSON-RPC API. + ExtRPCEnabled() bool + + // RegisterHandler manually registers a new handler into the networking stack. + RegisterHandler(string, string, http.Handler) + + // RegisterAPIs registers JSON-RPC handlers for the networking stack. + RegisterAPIs([]rpc.API) + + // RegisterLifecycles registers objects to have their lifecycle manged by the stack. + RegisterLifecycle(node.Lifecycle) + + // Start starts the networking stack. + Start() error + + // Close stops the networking stack + Close() error + } + + // ExecutionLayer represents the execution layer for a polaris EVM chain. + ExecutionLayer struct { + // stack handles all networking aspects of the execution layer. mainly JSON-RPC. + stack NetworkingStack + // backend is the entry point to the core logic of the execution layer. + backend *polar.Polaris + } + + // Config struct holds the configuration for Polaris and Node. + Config struct { + Polar polar.Config + Node node.Config + } +) + +// New creates a new execution layer with the provided host chain. +// It takes a client type, configuration, host chain, consensus engine, and log handler +// as parameters. It returns a pointer to the ExecutionLayer and an error if any. +func New( + client string, cfg any, host core.PolarisHostChain, + engine consensus.Engine, logHandler log.Handler, +) (*ExecutionLayer, error) { + clientFactories := map[string]func( + any, core.PolarisHostChain, consensus.Engine, log.Handler, + ) (*ExecutionLayer, error){ + "geth": newGethExecutionLayer, + } + + factory, ok := clientFactories[client] + if !ok { + return nil, fmt.Errorf("unknown execution layer: %s", client) + } + + return factory(cfg, host, engine, logHandler) +} + +// newGethExecutionLayer creates a new geth execution layer. +// It returns a pointer to the ExecutionLayer and an error if any. +func newGethExecutionLayer( + anyCfg any, host core.PolarisHostChain, + engine consensus.Engine, logHandler log.Handler, +) (*ExecutionLayer, error) { + cfg, ok := anyCfg.(*Config) + if !ok { + // If the configuration type is invalid, return an error + return nil, fmt.Errorf("invalid config type") + } + + gethNode, err := node.New(&cfg.Node) + if err != nil { + return nil, err + } + + // In Polaris we don't use P2P at the geth level. + gethNode.SetP2PDisabled(true) + + // Create a new Polaris backend + backend := polar.New(&cfg.Polar, host, engine, gethNode, logHandler) + + // Return a new ExecutionLayer with the created gethNode and backend + return &ExecutionLayer{ + stack: gethNode, + backend: backend, + }, nil +} + +// RegisterSyncStatusProvider registers a sync status provider to the backend of the +// execution layer. +func (el *ExecutionLayer) RegisterSyncStatusProvider(provider polar.SyncStatusProvider) { + el.backend.RegisterSyncStatusProvider(provider) +} + +// RegisterLifecycle registers a lifecycle to the networking stack of the execution layer. +func (el *ExecutionLayer) RegisterLifecycle(lifecycle node.Lifecycle) { + el.stack.RegisterLifecycle(lifecycle) +} + +// Start starts the networking stack of the execution layer. +// It returns an error if the start operation fails. +func (el *ExecutionLayer) Start() error { + return el.stack.Start() +} + +// Close stops the networking stack of the execution layer. +// It returns an error if the close operation fails. +func (el *ExecutionLayer) Close() error { + return el.stack.Close() +} + +// Miner returns the miner interface of the backend of the execution layer. +func (el *ExecutionLayer) Miner() Miner { + return el.backend.Miner() +} + +// TxPool returns the transaction pool interface of the backend of the execution layer. +func (el *ExecutionLayer) TxPool() TxPool { + return el.backend.TxPool() +} + +// Blockchain returns the blockchain interface of the backend of the execution layer. +func (el *ExecutionLayer) Blockchain() core.Blockchain { + return el.backend.Blockchain() +} diff --git a/cosmos/x/evm/plugins/precompile/precompile_test.go b/eth/node/config.go similarity index 66% rename from cosmos/x/evm/plugins/precompile/precompile_test.go rename to eth/node/config.go index 7b36b3f82e..b10f106bd9 100644 --- a/cosmos/x/evm/plugins/precompile/precompile_test.go +++ b/eth/node/config.go @@ -18,16 +18,29 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package precompile +package node import ( - "testing" + "github.com/ethereum/go-ethereum/node" +) - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" +const ( + // clientIdentifier is the identifier string for the client. + clientIdentifier = "polaris-geth" ) -func TestPrecompile(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cosmos/x/evm/plugins/precompile") +// Config represents the configuration options for a node running a polar +// evm. +type Config struct { + node.Config +} + +// DefaultConfig returns the default configuration for a polaris chain. +func DefaultConfig() *Config { + nodeCfg := *DefaultGethNodeConfig() + nodeCfg.DataDir = "" + nodeCfg.KeyStoreDir = "" + return &Config{ + Config: nodeCfg, + } } diff --git a/eth/polar/node.go b/eth/node/node.go similarity index 70% rename from eth/polar/node.go rename to eth/node/node.go index 4374365663..7b243efedc 100644 --- a/eth/polar/node.go +++ b/eth/node/node.go @@ -18,39 +18,48 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package polar +package node import ( + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/node" ) -// Node is a wrapper around the go-ethereum node.Node object. -// TODO: deprecate this and use a more elegant solution. -type Node struct { - *node.Node -} +type ( + // Lifecycle represents a lifecycle object. + Lifecycle = node.Lifecycle + + // GethExecutionNode is the entrypoint for the evm execution environment. + GethExecutionNode struct { + *node.Node + } +) -// NewGetNetworkingStack creates a new NetworkingStack instance for use on an -// underlying blockchain. -func NewGethNetworkingStack(config *node.Config) (NetworkingStack, error) { - node, err := node.New(config) +// New creates a new execution layer node with the provided backend. +func New(config *Config) (*GethExecutionNode, error) { + gethNode, err := node.New(&config.Config) if err != nil { return nil, err } // In Polaris we don't use P2P at the geth level. - node.SetP2PDisabled(true) + gethNode.SetP2PDisabled(true) - return &Node{ - Node: node, + return &GethExecutionNode{ + Node: gethNode, }, nil } // ExtRPCEnabled returns whether or not the external RPC service is enabled. -func (n *Node) ExtRPCEnabled() bool { +func (n *GethExecutionNode) ExtRPCEnabled() bool { return n.Node.Config().ExtRPCEnabled() } +// ExtRPCEnabled returns whether or not the external RPC service is enabled. +func (n *GethExecutionNode) EventMux() *event.TypeMux { //nolint:staticcheck // still in geth. + return n.Node.EventMux() +} + // DefaultConfig returns the default configuration for the provider. func DefaultGethNodeConfig() *node.Config { nodeCfg := node.DefaultConfig diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go index 3bc43c5279..b810b98d73 100644 --- a/eth/polar/api_backend.go +++ b/eth/polar/api_backend.go @@ -49,34 +49,50 @@ import ( // Backend represents the backend object for a Polaris chain. It extends the standard // go-ethereum backend object. -type Backend interface { - polarapi.EthBackend - polarapi.NetBackend - polarapi.Web3Backend -} +type ( + APIBackend interface { + polarapi.EthBackend + polarapi.NetBackend + polarapi.Web3Backend + } + + // SyncStatusProvider defines methods that allow the chain to have insight into the underlying + // consensus engine of the host chain. + SyncStatusProvider interface { + // SyncProgress returns the current sync progress of the host chain. + SyncProgress(ctx context.Context) (ethereum.SyncProgress, error) + // IsListening returns whether or not the host chain is listening for new blocks. + Listening(ctx context.Context) (bool, error) + // PeerCount returns the current number of peers connected to the host chain. + PeerCount(ctx context.Context) (uint64, error) + } +) // backend represents the backend for the JSON-RPC service. type backend struct { - polar *Polaris - cfg *Config - gpo *gasprice.Oracle - logger log.Logger + polar *Polaris + cfg *Config + extRPCEnabled bool + gpo *gasprice.Oracle + logger log.Logger } // ============================================================================== // Constructor // ============================================================================== -// NewBackend returns a new `Backend` object. -func NewBackend( +// NewAPIBackend returns a new `Backend` object. +func NewAPIBackend( polar *Polaris, + extRPCEnabled bool, cfg *Config, -) Backend { +) APIBackend { b := &backend{ - polar: polar, - cfg: cfg, - logger: log.Root(), + polar: polar, + cfg: cfg, + extRPCEnabled: extRPCEnabled, + logger: log.Root(), } if cfg.GPO.Default == nil { @@ -135,7 +151,7 @@ func (b *backend) AccountManager() *accounts.Manager { // ExtRPCEnabled returns whether the RPC endpoints are exposed over external // interfaces. func (b *backend) ExtRPCEnabled() bool { - return b.polar.stack.ExtRPCEnabled() + return b.extRPCEnabled } // RPCGasCap returns the global gas cap for eth_call over rpc: this is @@ -568,7 +584,7 @@ func (b *backend) Version() string { // SyncProgress returns the current progress of the sync algorithm. func (b *backend) SyncProgress() ethereum.SyncProgress { - sp, err := b.polar.enginePlugin.SyncProgress(context.Background()) + sp, err := b.polar.syncStatus.SyncProgress(context.Background()) if err != nil { b.logger.Error("eth.rpc.backend.SyncProgress", "err", err) return ethereum.SyncProgress{} @@ -578,7 +594,7 @@ func (b *backend) SyncProgress() ethereum.SyncProgress { // Listening returns whether the node is listening for connections. func (b *backend) Listening() bool { - listening, err := b.polar.enginePlugin.Listening(context.Background()) + listening, err := b.polar.syncStatus.Listening(context.Background()) if err != nil { b.logger.Error("eth.rpc.backend.Listening", "err", err) return false @@ -588,7 +604,7 @@ func (b *backend) Listening() bool { // PeerCount returns the number of connected peers. func (b *backend) PeerCount() hexutil.Uint { - peerCount, err := b.polar.enginePlugin.PeerCount(context.Background()) + peerCount, err := b.polar.syncStatus.PeerCount(context.Background()) if err != nil { b.logger.Error("eth.rpc.backend.PeerCount", "err", err) return hexutil.Uint(0) diff --git a/eth/polar/backend.go b/eth/polar/backend.go index 61c141213c..babdef9fb2 100644 --- a/eth/polar/backend.go +++ b/eth/polar/backend.go @@ -22,8 +22,6 @@ package polar import ( "math/big" - "net/http" - "time" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/consensus/beacon" @@ -35,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" + "pkg.berachain.dev/polaris/eth/common" "pkg.berachain.dev/polaris/eth/consensus" "pkg.berachain.dev/polaris/eth/core" "pkg.berachain.dev/polaris/eth/core/types" @@ -52,69 +51,44 @@ var defaultEthConfig = ethconfig.Config{ FilterLogCacheSize: 0, } -// NetworkingStack defines methods that allow a Polaris chain to build and expose JSON-RPC API. -type NetworkingStack interface { - // IsExtRPCEnabled returns true if the networking stack is configured to expose JSON-RPC API. +// executionLayerNode defines methods that allow a Polaris chain to build and expose JSON-RPC API. +type executionLayerNode interface { ExtRPCEnabled() bool - - // RegisterHandler manually registers a new handler into the networking stack. - RegisterHandler(string, string, http.Handler) - - // RegisterAPIs registers JSON-RPC handlers for the networking stack. RegisterAPIs([]rpc.API) - - // RegisterLifecycles registers objects to have their lifecycle manged by the stack. RegisterLifecycle(node.Lifecycle) - - // Start starts the networking stack. - Start() error - - // Close stops the networking stack - Close() error + EventMux() *event.TypeMux //nolint:staticcheck // deprecated but still in geth. } // Polaris is the only object that an implementing chain should use. type Polaris struct { config *Config - // NetworkingStack represents the networking stack responsible for exposes the JSON-RPC - // APIs. Although possible, it does not handle p2p networking like its sibling in geth - // would. - stack NetworkingStack - // core pieces of the polaris stack host core.PolarisHostChain blockchain core.Blockchain txPool *txpool.TxPool miner *miner.Miner - // backend is utilize by the api handlers as a middleware between the JSON-RPC APIs - // and the core pieces. - backend Backend + // apiBackend is utilize by the api handlers as a middleware between the + // JSON-RPC APIs and the core pieces. + apiBackend APIBackend + syncStatus SyncStatusProvider // engine represents the consensus engine for the backend. - enginePlugin core.EnginePlugin - engine consensus.Engine + engine consensus.Engine // filterSystem is the filter system that is used by the filter API. // TODO: relocate filterSystem *filters.FilterSystem } -func NewWithNetworkingStack( +// New creates a new backend for the Polaris EVM. +func New( config *Config, host core.PolarisHostChain, - stack NetworkingStack, + engine consensus.Engine, + stack executionLayerNode, logHandler log.Handler, ) *Polaris { - engine := beacon.New(&consensus.DummyEthOne{}) - pl := &Polaris{ - config: config, - blockchain: core.NewChain(host, &config.Chain, engine), - stack: stack, - host: host, - enginePlugin: host.GetEnginePlugin(), - engine: engine, - } // When creating a Polaris EVM, we allow the implementing chain // to specify their own log handler. If logHandler is nil then we // we use the default geth log handler. @@ -126,7 +100,25 @@ func NewWithNetworkingStack( log.Root().SetHandler(logHandler) } - pl.backend = NewBackend(pl, pl.config) + if config.Miner.GasPrice == nil || config.Miner.GasPrice.Cmp(common.Big0) <= 0 { + log.Warn("Sanitizing invalid miner gas price", + "provided", config.Miner.GasPrice, "updated", ethconfig.Defaults.Miner.GasPrice) + config.Miner.GasPrice = new(big.Int).Set(ethconfig.Defaults.Miner.GasPrice) + } + + if engine == nil { + engine = beacon.New(&consensus.DummyEthOne{}) + } + + pl := &Polaris{ + config: config, + host: host, + engine: engine, + blockchain: core.NewChain(host, &config.Chain, engine), + } + + // Build the backend api object. + pl.apiBackend = NewAPIBackend(pl, stack.ExtRPCEnabled(), pl.config) // Run safety message for feedback to the user if they are running // with development configs. @@ -147,107 +139,83 @@ func NewWithNetworkingStack( panic(err) } - mux := new(event.TypeMux) //nolint:staticcheck // deprecated but still in geth. - // TODO: miner config to app.toml + // Setup the miner, we use a dummy isLocal function, since it is not used. pl.miner = miner.New(pl, &pl.config.Miner, - &pl.config.Chain, mux, pl.engine, pl.isLocalBlock) + &pl.config.Chain, stack.EventMux(), pl.engine, + func(header *types.Header) bool { return true }, + ) + + // Register the backend on the node + stack.RegisterAPIs(pl.APIs()) + stack.RegisterLifecycle(pl) + // Register the filter API separately in order to get access to the filterSystem + pl.filterSystem = utils.RegisterFilterAPI(stack, pl.apiBackend, &defaultEthConfig) return pl } +// Start implements node.Lifecycle, starting all internal goroutines needed by the +// Polaris protocol implementation. +func (pl *Polaris) Start() error { + return nil +} + +// Stop implements node.Lifecycle, terminating all internal goroutines used by the +// Polaris protocol. +func (pl *Polaris) Stop() error { + return nil +} + // APIs return the collection of RPC services the polar package offers. // NOTE, some of these services probably need to be moved to somewhere else. func (pl *Polaris) APIs() []rpc.API { // Grab a bunch of the apis from go-Polaris (thx bae) - apis := polarapi.GethAPIs(pl.backend, pl.blockchain) + apis := polarapi.GethAPIs(pl.apiBackend, pl.blockchain) // Append all the local APIs and return return append(apis, []rpc.API{ { Namespace: "net", - Service: polarapi.NewNetAPI(pl.backend), + Service: polarapi.NewNetAPI(pl.apiBackend), }, { Namespace: "web3", - Service: polarapi.NewWeb3API(pl.backend), + Service: polarapi.NewWeb3API(pl.apiBackend), }, }...) } -// isLocalBlock checks whether the specified block is mined -// by local miner accounts. -// -// We regard two types of accounts as local miner account: etherbase -// and accounts specified via `txpool.locals` flag. -func (pl *Polaris) isLocalBlock(header *types.Header) bool { - author, err := pl.engine.Author(header) - if err != nil { - log.Warn( - "Failed to retrieve block author", "number", - header.Number.Uint64(), "hash", header.Hash(), "err", err, - ) - return false - } - // Check whether the given address is etherbase. - if author == pl.miner.Etherbase() { - return true - } - // Check whether the given address is specified by `txpool.local` - // CLI flag. - for _, account := range pl.config.LegacyTxPool.Locals { - if account == author { - return true - } - } - return false -} - -// StartServices notifies the NetworkStack to spin up (i.e json-rpc). -func (pl *Polaris) StartServices() error { - // Register the JSON-RPCs with the networking stack. - pl.stack.RegisterAPIs(pl.APIs()) - - // Register the filter API separately in order to get access to the filterSystem - pl.filterSystem = utils.RegisterFilterAPI(pl.stack, pl.backend, &defaultEthConfig) - - go func() { - // TODO: these values are sensitive due to a race condition in the json-rpc ports opening. - // If the JSON-RPC opens before the first block is committed, hive tests will start failing. - // This needs to be fixed before mainnet as its ghetto af. If the block time is too long - // and this sleep is too short, it will cause hive tests to error out. - time.Sleep(5 * time.Second) //nolint:gomnd // as explained above. - if err := pl.stack.Start(); err != nil { - panic(err) - } - }() - return nil -} - -// RegisterService adds a service to the networking stack. -func (pl *Polaris) RegisterService(lc node.Lifecycle) { - pl.stack.RegisterLifecycle(lc) -} - -func (pl *Polaris) Close() error { - return pl.stack.Close() +// RegisterSyncStatusProvider registers a sync status provider. +func (pl *Polaris) RegisterSyncStatusProvider( + syncStatus SyncStatusProvider, +) { + pl.syncStatus = syncStatus } +// Host returns the Polaris host chain. func (pl *Polaris) Host() core.PolarisHostChain { return pl.host } +// Engine returns the consensus engine. +func (pl *Polaris) Engine() consensus.Engine { return pl.engine } + +// Miner returns the miner. func (pl *Polaris) Miner() *miner.Miner { return pl.miner } +// TxPool returns the transaction pool. func (pl *Polaris) TxPool() *txpool.TxPool { return pl.txPool } +// MinerChain returns the blockchain. func (pl *Polaris) MinerChain() miner.BlockChain { - return pl.blockchain + return pl.Blockchain() } +// Blockchain returns the blockchain. func (pl *Polaris) Blockchain() core.Blockchain { return pl.blockchain } diff --git a/eth/polar/config.go b/eth/polar/config.go index aa47c46b05..a5e0c9e81e 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -35,8 +35,6 @@ import ( ) const ( - // clientIdentifier is the identifier string for the client. - clientIdentifier = "polaris-geth" // gpoDefault is the default gpo starting point. gpoDefault = 1000000000 From a7d688facff2ea28f9414dbdf5ef5c110790c59a Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 17 Oct 2023 11:48:50 -0400 Subject: [PATCH 095/122] refactor(docs): move to `docs-monorepo` (#1232) --- docs/README.md | 1 + docs/{web/public => img}/bear_banner.png | Bin .../public => img}/cosmos-sdk-swagger.png | Bin docs/{web/public => img}/header.png | Bin .../public => img}/metamask-add-network.png | Bin docs/{web/public => img}/milky-way.ico | Bin docs/{web/public => img}/milky-way.png | Bin docs/{web/public => img}/playground.png | Bin .../public => img}/polaris_architecture.png | Bin docs/{web/public => img}/staking-example.png | Bin docs/{web/pages/docs => md}/_meta.json | 0 docs/{web/pages/docs => md}/architecture.mdx | 0 .../docs => md}/building-modules/_meta.json | 0 .../creating-custom-modules.mdx | 0 .../building-modules/intro-to-modules.mdx | 0 .../building-modules/list-of-modules.mdx | 0 .../building-precompiles/_meta.json | 0 .../creating-custom-precompiles.mdx | 0 .../intro-to-precompiles.mdx | 0 .../precompile-performance.mdx | 0 docs/{web/pages/docs => md}/contributing.mdx | 0 .../pages/docs => md}/erc20-middleware.mdx | 0 .../{web/pages/docs => md}/evm-on-polaris.mdx | 0 .../docs => md}/for-frontend-devs/_meta.json | 0 .../for-frontend-devs/available-tools.mdx | 0 .../for-frontend-devs/chain-config.mdx | 0 .../for-frontend-devs/staking-example.mdx | 0 .../docs => md}/for-solidity-devs/_meta.json | 0 .../for-solidity-devs/dev-tools/_meta.json | 0 .../dev-tools/available-tools.mdx | 0 .../dev-tools/foundry-polaris.mdx | 0 .../for-solidity-devs/developer-overview.mdx | 0 docs/{web/pages/docs => md}/index.mdx | 0 .../interacting-with-node/_meta.json | 0 .../interacting-with-node/gen-brod-sign.mdx | 0 .../interacting-with-node/querying-cli.mdx | 0 .../interacting-with-node/querying-grpc.mdx | 0 .../querying-json-rpc.mdx | 0 .../interacting-with-node/querying-rest.mdx | 0 docs/{web/pages/docs => md}/introduction.mdx | 0 .../pages/docs => md}/json-rpc-cosmos.mdx | 0 docs/{web/pages/docs => md}/json-rpc.mdx | 0 .../{web/pages/docs => md}/key-management.mdx | 0 docs/{web/pages/docs => md}/opcodes.mdx | 0 .../precompile-cosmos-overview.mdx | 0 .../pages/docs => md}/precompile-overview.mdx | 0 .../docs => md}/running-a-node/_meta.json | 0 .../running-a-node/running-locally-docker.mdx | 0 .../running-a-node/running-locally.mdx | 0 .../running-a-node/running-on-aws.mdx | 0 .../running-a-node/running-on-azure.mdx | 0 .../running-a-node/running-on-gcp.mdx | 0 docs/{web/pages/docs => md}/system-config.mdx | 0 docs/{web/pages/docs => md}/tracing.mdx | 0 .../{web/pages/docs => md}/using-metamask.mdx | 0 docs/web/README.md | 9 - .../web/components/add-chain-btn/chainInfo.ts | 37 - docs/web/components/add-chain-btn/index.tsx | 22 - .../components/add-chain-btn/style.module.css | 37 - .../components/animation/SVG curve (1).svg | 1 - docs/web/components/animation/index.tsx | 31 - docs/web/components/card/index.tsx | 95 - docs/web/components/card/style.module.css | 39 - docs/web/components/features/index.tsx | 55 - docs/web/components/features/style.module.css | 127 - .../components/features/themes-animation.tsx | 120 - docs/web/components/file-tree/index.tsx | 145 - docs/web/components/icons/globe.tsx | 12 - docs/web/components/icons/markdown.tsx | 8 - docs/web/components/icons/switch.tsx | 8 - docs/web/components/screenshot/index.jsx | 22 - docs/web/components/table/index.tsx | 38 - docs/web/components/table/style.module.css | 13 - docs/web/components/text/index.tsx | 34 - docs/web/components/text/style.module.css | 25 - docs/web/components/utils/shadow.jsx | 22 - docs/web/components/video/index.jsx | 14 - docs/web/next.config.js | 23 - docs/web/package.json | 38 - docs/web/pages/_app.tsx | 18 - docs/web/pages/_meta.json | 11 - docs/web/pages/index.mdx | 231 - docs/web/pages/index.module.css | 80 - docs/web/pages/styles.css | 105 - docs/web/pnpm-lock.yaml | 8156 ----------------- docs/web/style.css | 107 - docs/web/theme.config.jsx | 92 - docs/web/tsconfig.json | 29 - docs/web/window.d.ts | 6 - docs/web/yarn-error.log | 2858 ------ docs/web/yarn.lock | 3846 -------- docs/yarn.lock | 4 - 92 files changed, 1 insertion(+), 16518 deletions(-) rename docs/{web/public => img}/bear_banner.png (100%) rename docs/{web/public => img}/cosmos-sdk-swagger.png (100%) rename docs/{web/public => img}/header.png (100%) rename docs/{web/public => img}/metamask-add-network.png (100%) rename docs/{web/public => img}/milky-way.ico (100%) rename docs/{web/public => img}/milky-way.png (100%) rename docs/{web/public => img}/playground.png (100%) rename docs/{web/public => img}/polaris_architecture.png (100%) rename docs/{web/public => img}/staking-example.png (100%) rename docs/{web/pages/docs => md}/_meta.json (100%) rename docs/{web/pages/docs => md}/architecture.mdx (100%) rename docs/{web/pages/docs => md}/building-modules/_meta.json (100%) rename docs/{web/pages/docs => md}/building-modules/creating-custom-modules.mdx (100%) rename docs/{web/pages/docs => md}/building-modules/intro-to-modules.mdx (100%) rename docs/{web/pages/docs => md}/building-modules/list-of-modules.mdx (100%) rename docs/{web/pages/docs => md}/building-precompiles/_meta.json (100%) rename docs/{web/pages/docs => md}/building-precompiles/creating-custom-precompiles.mdx (100%) rename docs/{web/pages/docs => md}/building-precompiles/intro-to-precompiles.mdx (100%) rename docs/{web/pages/docs => md}/building-precompiles/precompile-performance.mdx (100%) rename docs/{web/pages/docs => md}/contributing.mdx (100%) rename docs/{web/pages/docs => md}/erc20-middleware.mdx (100%) rename docs/{web/pages/docs => md}/evm-on-polaris.mdx (100%) rename docs/{web/pages/docs => md}/for-frontend-devs/_meta.json (100%) rename docs/{web/pages/docs => md}/for-frontend-devs/available-tools.mdx (100%) rename docs/{web/pages/docs => md}/for-frontend-devs/chain-config.mdx (100%) rename docs/{web/pages/docs => md}/for-frontend-devs/staking-example.mdx (100%) rename docs/{web/pages/docs => md}/for-solidity-devs/_meta.json (100%) rename docs/{web/pages/docs => md}/for-solidity-devs/dev-tools/_meta.json (100%) rename docs/{web/pages/docs => md}/for-solidity-devs/dev-tools/available-tools.mdx (100%) rename docs/{web/pages/docs => md}/for-solidity-devs/dev-tools/foundry-polaris.mdx (100%) rename docs/{web/pages/docs => md}/for-solidity-devs/developer-overview.mdx (100%) rename docs/{web/pages/docs => md}/index.mdx (100%) rename docs/{web/pages/docs => md}/interacting-with-node/_meta.json (100%) rename docs/{web/pages/docs => md}/interacting-with-node/gen-brod-sign.mdx (100%) rename docs/{web/pages/docs => md}/interacting-with-node/querying-cli.mdx (100%) rename docs/{web/pages/docs => md}/interacting-with-node/querying-grpc.mdx (100%) rename docs/{web/pages/docs => md}/interacting-with-node/querying-json-rpc.mdx (100%) rename docs/{web/pages/docs => md}/interacting-with-node/querying-rest.mdx (100%) rename docs/{web/pages/docs => md}/introduction.mdx (100%) rename docs/{web/pages/docs => md}/json-rpc-cosmos.mdx (100%) rename docs/{web/pages/docs => md}/json-rpc.mdx (100%) rename docs/{web/pages/docs => md}/key-management.mdx (100%) rename docs/{web/pages/docs => md}/opcodes.mdx (100%) rename docs/{web/pages/docs => md}/precompile-cosmos-overview.mdx (100%) rename docs/{web/pages/docs => md}/precompile-overview.mdx (100%) rename docs/{web/pages/docs => md}/running-a-node/_meta.json (100%) rename docs/{web/pages/docs => md}/running-a-node/running-locally-docker.mdx (100%) rename docs/{web/pages/docs => md}/running-a-node/running-locally.mdx (100%) rename docs/{web/pages/docs => md}/running-a-node/running-on-aws.mdx (100%) rename docs/{web/pages/docs => md}/running-a-node/running-on-azure.mdx (100%) rename docs/{web/pages/docs => md}/running-a-node/running-on-gcp.mdx (100%) rename docs/{web/pages/docs => md}/system-config.mdx (100%) rename docs/{web/pages/docs => md}/tracing.mdx (100%) rename docs/{web/pages/docs => md}/using-metamask.mdx (100%) delete mode 100644 docs/web/README.md delete mode 100644 docs/web/components/add-chain-btn/chainInfo.ts delete mode 100644 docs/web/components/add-chain-btn/index.tsx delete mode 100644 docs/web/components/add-chain-btn/style.module.css delete mode 100644 docs/web/components/animation/SVG curve (1).svg delete mode 100644 docs/web/components/animation/index.tsx delete mode 100644 docs/web/components/card/index.tsx delete mode 100644 docs/web/components/card/style.module.css delete mode 100644 docs/web/components/features/index.tsx delete mode 100644 docs/web/components/features/style.module.css delete mode 100644 docs/web/components/features/themes-animation.tsx delete mode 100644 docs/web/components/file-tree/index.tsx delete mode 100644 docs/web/components/icons/globe.tsx delete mode 100644 docs/web/components/icons/markdown.tsx delete mode 100644 docs/web/components/icons/switch.tsx delete mode 100644 docs/web/components/screenshot/index.jsx delete mode 100644 docs/web/components/table/index.tsx delete mode 100644 docs/web/components/table/style.module.css delete mode 100644 docs/web/components/text/index.tsx delete mode 100644 docs/web/components/text/style.module.css delete mode 100644 docs/web/components/utils/shadow.jsx delete mode 100644 docs/web/components/video/index.jsx delete mode 100644 docs/web/next.config.js delete mode 100644 docs/web/package.json delete mode 100644 docs/web/pages/_app.tsx delete mode 100644 docs/web/pages/_meta.json delete mode 100644 docs/web/pages/index.mdx delete mode 100644 docs/web/pages/index.module.css delete mode 100644 docs/web/pages/styles.css delete mode 100644 docs/web/pnpm-lock.yaml delete mode 100644 docs/web/style.css delete mode 100644 docs/web/theme.config.jsx delete mode 100644 docs/web/tsconfig.json delete mode 100644 docs/web/window.d.ts delete mode 100644 docs/web/yarn-error.log delete mode 100644 docs/web/yarn.lock delete mode 100644 docs/yarn.lock diff --git a/docs/README.md b/docs/README.md index e69de29bb2..c5463f60a3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1 @@ +# @cordoruy pls add a readme and stuff explaining how the docs compiling works diff --git a/docs/web/public/bear_banner.png b/docs/img/bear_banner.png similarity index 100% rename from docs/web/public/bear_banner.png rename to docs/img/bear_banner.png diff --git a/docs/web/public/cosmos-sdk-swagger.png b/docs/img/cosmos-sdk-swagger.png similarity index 100% rename from docs/web/public/cosmos-sdk-swagger.png rename to docs/img/cosmos-sdk-swagger.png diff --git a/docs/web/public/header.png b/docs/img/header.png similarity index 100% rename from docs/web/public/header.png rename to docs/img/header.png diff --git a/docs/web/public/metamask-add-network.png b/docs/img/metamask-add-network.png similarity index 100% rename from docs/web/public/metamask-add-network.png rename to docs/img/metamask-add-network.png diff --git a/docs/web/public/milky-way.ico b/docs/img/milky-way.ico similarity index 100% rename from docs/web/public/milky-way.ico rename to docs/img/milky-way.ico diff --git a/docs/web/public/milky-way.png b/docs/img/milky-way.png similarity index 100% rename from docs/web/public/milky-way.png rename to docs/img/milky-way.png diff --git a/docs/web/public/playground.png b/docs/img/playground.png similarity index 100% rename from docs/web/public/playground.png rename to docs/img/playground.png diff --git a/docs/web/public/polaris_architecture.png b/docs/img/polaris_architecture.png similarity index 100% rename from docs/web/public/polaris_architecture.png rename to docs/img/polaris_architecture.png diff --git a/docs/web/public/staking-example.png b/docs/img/staking-example.png similarity index 100% rename from docs/web/public/staking-example.png rename to docs/img/staking-example.png diff --git a/docs/web/pages/docs/_meta.json b/docs/md/_meta.json similarity index 100% rename from docs/web/pages/docs/_meta.json rename to docs/md/_meta.json diff --git a/docs/web/pages/docs/architecture.mdx b/docs/md/architecture.mdx similarity index 100% rename from docs/web/pages/docs/architecture.mdx rename to docs/md/architecture.mdx diff --git a/docs/web/pages/docs/building-modules/_meta.json b/docs/md/building-modules/_meta.json similarity index 100% rename from docs/web/pages/docs/building-modules/_meta.json rename to docs/md/building-modules/_meta.json diff --git a/docs/web/pages/docs/building-modules/creating-custom-modules.mdx b/docs/md/building-modules/creating-custom-modules.mdx similarity index 100% rename from docs/web/pages/docs/building-modules/creating-custom-modules.mdx rename to docs/md/building-modules/creating-custom-modules.mdx diff --git a/docs/web/pages/docs/building-modules/intro-to-modules.mdx b/docs/md/building-modules/intro-to-modules.mdx similarity index 100% rename from docs/web/pages/docs/building-modules/intro-to-modules.mdx rename to docs/md/building-modules/intro-to-modules.mdx diff --git a/docs/web/pages/docs/building-modules/list-of-modules.mdx b/docs/md/building-modules/list-of-modules.mdx similarity index 100% rename from docs/web/pages/docs/building-modules/list-of-modules.mdx rename to docs/md/building-modules/list-of-modules.mdx diff --git a/docs/web/pages/docs/building-precompiles/_meta.json b/docs/md/building-precompiles/_meta.json similarity index 100% rename from docs/web/pages/docs/building-precompiles/_meta.json rename to docs/md/building-precompiles/_meta.json diff --git a/docs/web/pages/docs/building-precompiles/creating-custom-precompiles.mdx b/docs/md/building-precompiles/creating-custom-precompiles.mdx similarity index 100% rename from docs/web/pages/docs/building-precompiles/creating-custom-precompiles.mdx rename to docs/md/building-precompiles/creating-custom-precompiles.mdx diff --git a/docs/web/pages/docs/building-precompiles/intro-to-precompiles.mdx b/docs/md/building-precompiles/intro-to-precompiles.mdx similarity index 100% rename from docs/web/pages/docs/building-precompiles/intro-to-precompiles.mdx rename to docs/md/building-precompiles/intro-to-precompiles.mdx diff --git a/docs/web/pages/docs/building-precompiles/precompile-performance.mdx b/docs/md/building-precompiles/precompile-performance.mdx similarity index 100% rename from docs/web/pages/docs/building-precompiles/precompile-performance.mdx rename to docs/md/building-precompiles/precompile-performance.mdx diff --git a/docs/web/pages/docs/contributing.mdx b/docs/md/contributing.mdx similarity index 100% rename from docs/web/pages/docs/contributing.mdx rename to docs/md/contributing.mdx diff --git a/docs/web/pages/docs/erc20-middleware.mdx b/docs/md/erc20-middleware.mdx similarity index 100% rename from docs/web/pages/docs/erc20-middleware.mdx rename to docs/md/erc20-middleware.mdx diff --git a/docs/web/pages/docs/evm-on-polaris.mdx b/docs/md/evm-on-polaris.mdx similarity index 100% rename from docs/web/pages/docs/evm-on-polaris.mdx rename to docs/md/evm-on-polaris.mdx diff --git a/docs/web/pages/docs/for-frontend-devs/_meta.json b/docs/md/for-frontend-devs/_meta.json similarity index 100% rename from docs/web/pages/docs/for-frontend-devs/_meta.json rename to docs/md/for-frontend-devs/_meta.json diff --git a/docs/web/pages/docs/for-frontend-devs/available-tools.mdx b/docs/md/for-frontend-devs/available-tools.mdx similarity index 100% rename from docs/web/pages/docs/for-frontend-devs/available-tools.mdx rename to docs/md/for-frontend-devs/available-tools.mdx diff --git a/docs/web/pages/docs/for-frontend-devs/chain-config.mdx b/docs/md/for-frontend-devs/chain-config.mdx similarity index 100% rename from docs/web/pages/docs/for-frontend-devs/chain-config.mdx rename to docs/md/for-frontend-devs/chain-config.mdx diff --git a/docs/web/pages/docs/for-frontend-devs/staking-example.mdx b/docs/md/for-frontend-devs/staking-example.mdx similarity index 100% rename from docs/web/pages/docs/for-frontend-devs/staking-example.mdx rename to docs/md/for-frontend-devs/staking-example.mdx diff --git a/docs/web/pages/docs/for-solidity-devs/_meta.json b/docs/md/for-solidity-devs/_meta.json similarity index 100% rename from docs/web/pages/docs/for-solidity-devs/_meta.json rename to docs/md/for-solidity-devs/_meta.json diff --git a/docs/web/pages/docs/for-solidity-devs/dev-tools/_meta.json b/docs/md/for-solidity-devs/dev-tools/_meta.json similarity index 100% rename from docs/web/pages/docs/for-solidity-devs/dev-tools/_meta.json rename to docs/md/for-solidity-devs/dev-tools/_meta.json diff --git a/docs/web/pages/docs/for-solidity-devs/dev-tools/available-tools.mdx b/docs/md/for-solidity-devs/dev-tools/available-tools.mdx similarity index 100% rename from docs/web/pages/docs/for-solidity-devs/dev-tools/available-tools.mdx rename to docs/md/for-solidity-devs/dev-tools/available-tools.mdx diff --git a/docs/web/pages/docs/for-solidity-devs/dev-tools/foundry-polaris.mdx b/docs/md/for-solidity-devs/dev-tools/foundry-polaris.mdx similarity index 100% rename from docs/web/pages/docs/for-solidity-devs/dev-tools/foundry-polaris.mdx rename to docs/md/for-solidity-devs/dev-tools/foundry-polaris.mdx diff --git a/docs/web/pages/docs/for-solidity-devs/developer-overview.mdx b/docs/md/for-solidity-devs/developer-overview.mdx similarity index 100% rename from docs/web/pages/docs/for-solidity-devs/developer-overview.mdx rename to docs/md/for-solidity-devs/developer-overview.mdx diff --git a/docs/web/pages/docs/index.mdx b/docs/md/index.mdx similarity index 100% rename from docs/web/pages/docs/index.mdx rename to docs/md/index.mdx diff --git a/docs/web/pages/docs/interacting-with-node/_meta.json b/docs/md/interacting-with-node/_meta.json similarity index 100% rename from docs/web/pages/docs/interacting-with-node/_meta.json rename to docs/md/interacting-with-node/_meta.json diff --git a/docs/web/pages/docs/interacting-with-node/gen-brod-sign.mdx b/docs/md/interacting-with-node/gen-brod-sign.mdx similarity index 100% rename from docs/web/pages/docs/interacting-with-node/gen-brod-sign.mdx rename to docs/md/interacting-with-node/gen-brod-sign.mdx diff --git a/docs/web/pages/docs/interacting-with-node/querying-cli.mdx b/docs/md/interacting-with-node/querying-cli.mdx similarity index 100% rename from docs/web/pages/docs/interacting-with-node/querying-cli.mdx rename to docs/md/interacting-with-node/querying-cli.mdx diff --git a/docs/web/pages/docs/interacting-with-node/querying-grpc.mdx b/docs/md/interacting-with-node/querying-grpc.mdx similarity index 100% rename from docs/web/pages/docs/interacting-with-node/querying-grpc.mdx rename to docs/md/interacting-with-node/querying-grpc.mdx diff --git a/docs/web/pages/docs/interacting-with-node/querying-json-rpc.mdx b/docs/md/interacting-with-node/querying-json-rpc.mdx similarity index 100% rename from docs/web/pages/docs/interacting-with-node/querying-json-rpc.mdx rename to docs/md/interacting-with-node/querying-json-rpc.mdx diff --git a/docs/web/pages/docs/interacting-with-node/querying-rest.mdx b/docs/md/interacting-with-node/querying-rest.mdx similarity index 100% rename from docs/web/pages/docs/interacting-with-node/querying-rest.mdx rename to docs/md/interacting-with-node/querying-rest.mdx diff --git a/docs/web/pages/docs/introduction.mdx b/docs/md/introduction.mdx similarity index 100% rename from docs/web/pages/docs/introduction.mdx rename to docs/md/introduction.mdx diff --git a/docs/web/pages/docs/json-rpc-cosmos.mdx b/docs/md/json-rpc-cosmos.mdx similarity index 100% rename from docs/web/pages/docs/json-rpc-cosmos.mdx rename to docs/md/json-rpc-cosmos.mdx diff --git a/docs/web/pages/docs/json-rpc.mdx b/docs/md/json-rpc.mdx similarity index 100% rename from docs/web/pages/docs/json-rpc.mdx rename to docs/md/json-rpc.mdx diff --git a/docs/web/pages/docs/key-management.mdx b/docs/md/key-management.mdx similarity index 100% rename from docs/web/pages/docs/key-management.mdx rename to docs/md/key-management.mdx diff --git a/docs/web/pages/docs/opcodes.mdx b/docs/md/opcodes.mdx similarity index 100% rename from docs/web/pages/docs/opcodes.mdx rename to docs/md/opcodes.mdx diff --git a/docs/web/pages/docs/precompile-cosmos-overview.mdx b/docs/md/precompile-cosmos-overview.mdx similarity index 100% rename from docs/web/pages/docs/precompile-cosmos-overview.mdx rename to docs/md/precompile-cosmos-overview.mdx diff --git a/docs/web/pages/docs/precompile-overview.mdx b/docs/md/precompile-overview.mdx similarity index 100% rename from docs/web/pages/docs/precompile-overview.mdx rename to docs/md/precompile-overview.mdx diff --git a/docs/web/pages/docs/running-a-node/_meta.json b/docs/md/running-a-node/_meta.json similarity index 100% rename from docs/web/pages/docs/running-a-node/_meta.json rename to docs/md/running-a-node/_meta.json diff --git a/docs/web/pages/docs/running-a-node/running-locally-docker.mdx b/docs/md/running-a-node/running-locally-docker.mdx similarity index 100% rename from docs/web/pages/docs/running-a-node/running-locally-docker.mdx rename to docs/md/running-a-node/running-locally-docker.mdx diff --git a/docs/web/pages/docs/running-a-node/running-locally.mdx b/docs/md/running-a-node/running-locally.mdx similarity index 100% rename from docs/web/pages/docs/running-a-node/running-locally.mdx rename to docs/md/running-a-node/running-locally.mdx diff --git a/docs/web/pages/docs/running-a-node/running-on-aws.mdx b/docs/md/running-a-node/running-on-aws.mdx similarity index 100% rename from docs/web/pages/docs/running-a-node/running-on-aws.mdx rename to docs/md/running-a-node/running-on-aws.mdx diff --git a/docs/web/pages/docs/running-a-node/running-on-azure.mdx b/docs/md/running-a-node/running-on-azure.mdx similarity index 100% rename from docs/web/pages/docs/running-a-node/running-on-azure.mdx rename to docs/md/running-a-node/running-on-azure.mdx diff --git a/docs/web/pages/docs/running-a-node/running-on-gcp.mdx b/docs/md/running-a-node/running-on-gcp.mdx similarity index 100% rename from docs/web/pages/docs/running-a-node/running-on-gcp.mdx rename to docs/md/running-a-node/running-on-gcp.mdx diff --git a/docs/web/pages/docs/system-config.mdx b/docs/md/system-config.mdx similarity index 100% rename from docs/web/pages/docs/system-config.mdx rename to docs/md/system-config.mdx diff --git a/docs/web/pages/docs/tracing.mdx b/docs/md/tracing.mdx similarity index 100% rename from docs/web/pages/docs/tracing.mdx rename to docs/md/tracing.mdx diff --git a/docs/web/pages/docs/using-metamask.mdx b/docs/md/using-metamask.mdx similarity index 100% rename from docs/web/pages/docs/using-metamask.mdx rename to docs/md/using-metamask.mdx diff --git a/docs/web/README.md b/docs/web/README.md deleted file mode 100644 index 7bae4d3aec..0000000000 --- a/docs/web/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# polaris-docs - -gm welcome to docs - -`yarn install && yarn dev` - -to build - -`yarn build && yarn start` diff --git a/docs/web/components/add-chain-btn/chainInfo.ts b/docs/web/components/add-chain-btn/chainInfo.ts deleted file mode 100644 index 9d70d5e507..0000000000 --- a/docs/web/components/add-chain-btn/chainInfo.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { ChainInfo, BIP44 } from '@keplr-wallet/types'; -import { Bech32Address } from '@keplr-wallet/cosmos'; - -const coinType60 = 60 - -const gazerBip44: BIP44 = { - coinType: coinType60, -}; - -const GAZER = { - coinDenom: 'gazer', - coinMinimalDenom: 'agazer', - coinDecimals: 18, -}; - -const LOCAL_CHAIN_INFO: ChainInfo = { - coinType: coinType60, - rpc: 'http://localhost:26657', - rest: 'http://localhost:1317', - chainId: 'polaris-2061', - chainName: 'polaris', - stakeCurrency: GAZER, - bip44: gazerBip44, - bech32Config: Bech32Address.defaultBech32Config('polaris'), - currencies: [GAZER], - feeCurrencies: [{ - ...GAZER, - gasPriceStep: { - low: 10000000000, - average: 25000000000, - high: 40000000000, - }, - }], - features: ['ibc-transfer', 'ibc-go', 'eth-address-gen', 'eth-key-sign'], -}; - -export default LOCAL_CHAIN_INFO; \ No newline at end of file diff --git a/docs/web/components/add-chain-btn/index.tsx b/docs/web/components/add-chain-btn/index.tsx deleted file mode 100644 index 81f0ba0f13..0000000000 --- a/docs/web/components/add-chain-btn/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import LOCAL_CHAIN_INFO from './chainInfo' -import styles from './style.module.css' - -const addNetwork = async () => { - if(!window.keplr) { - alert('Please install keplr') - return - } - try { - await window.keplr.experimentalSuggestChain(LOCAL_CHAIN_INFO); - } catch(e) { - return - } - return -} -export function AddKeplrBtn() { - return ( - {await addNetwork()}} className={styles.cta}> - Add Local Network - - ) -} diff --git a/docs/web/components/add-chain-btn/style.module.css b/docs/web/components/add-chain-btn/style.module.css deleted file mode 100644 index 2fc57b1141..0000000000 --- a/docs/web/components/add-chain-btn/style.module.css +++ /dev/null @@ -1,37 +0,0 @@ -a.cta { - - display: inline-block; - background: linear-gradient(to bottom, #238aff, #0077ff); - text-decoration: none; - border-radius: 9999px; - color: white; - padding: 0.75rem 1.5rem; - margin-top: 20px; - text-shadow: 0 1px 1px #00387838; - box-shadow: 0 1px 2px #00295738; - transition: all 0.2s ease; - -webkit-user-drag: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} -a.cta:hover span { - transform: translateX(3px); -} -a.cta:hover { - box-shadow: 0 5px 30px -10px #0078ffab; - filter: brightness(1.05); -} -a.cta:active { - box-shadow: 0 1px 3px #00295738; - filter: brightness(0.95); -} -a.cta:active span { - transform: translateX(5px); -} -a.cta:focus-visible { - outline: 2px solid hsl(var(--nextra-primary-hue) 100% 77%); - outline-offset: 2px; -} -a.cta:focus-visible span { - transform: translateX(3px); -} diff --git a/docs/web/components/animation/SVG curve (1).svg b/docs/web/components/animation/SVG curve (1).svg deleted file mode 100644 index 5e9125505a..0000000000 --- a/docs/web/components/animation/SVG curve (1).svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/web/components/animation/index.tsx b/docs/web/components/animation/index.tsx deleted file mode 100644 index ec28ac217f..0000000000 --- a/docs/web/components/animation/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from "react"; -import { motion } from "framer-motion"; -const transition = { duration: 15, ease: "easeInOut" }; - -const Wave = () => { - return ( - // background-image: linear-gradient(135deg, #567189, #6ad56c, #fad6a5); - - - - - - - - - - - ); -}; - -export default Wave; \ No newline at end of file diff --git a/docs/web/components/card/index.tsx b/docs/web/components/card/index.tsx deleted file mode 100644 index 02d31387ca..0000000000 --- a/docs/web/components/card/index.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import cn from 'clsx' -import Link from 'next/link' - -import styles from './style.module.css' - -export function Card({ - children, - title, - icon, - image, - arrow, - href, - ...props -}) { - const animatedArrow = arrow ? ( - - → - - ) : null - - if (image) { - return ( - - {children} - - {icon} - - {title} - {animatedArrow} - - - - ) - } - - return ( - - - {icon} - {title} - {animatedArrow} - - - ) -} - -export function Cards({ children, num, ...props }) { - return ( -
- {children} -
- ) -} diff --git a/docs/web/components/card/style.module.css b/docs/web/components/card/style.module.css deleted file mode 100644 index 228e1d0ed6..0000000000 --- a/docs/web/components/card/style.module.css +++ /dev/null @@ -1,39 +0,0 @@ -.cards { - display: grid; - --rows: 3; - grid-template-columns: repeat( - auto-fill, - minmax(max(250px, calc((100% - 1rem * 2) / var(--rows))), 1fr) - ); -} - -.card img { - -webkit-user-drag: none; -} - -.card:hover svg { - color: currentColor; -} - -.card svg { - width: 1.5rem; - color: #00000033; - transition: color 0.3s ease; -} - -.card p { - margin-top: 0.5rem; -} - -.card .title { - display: flex; - font-weight: 600; - align-items: flex-start; -} - -:global(.dark) .card svg { - color: #ffffff66; -} -:global(.dark) .card:hover svg { - color: currentColor; -} diff --git a/docs/web/components/features/index.tsx b/docs/web/components/features/index.tsx deleted file mode 100644 index dd859e3a46..0000000000 --- a/docs/web/components/features/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import Link from 'next/link' -import cn from 'clsx' -import { motion } from 'framer-motion' - -import styles from './style.module.css' - -export function Feature({ - large, - centered, - children, - lightOnly, - className, - href, - index, - ...props -}) { - return ( - - {children} - {href ? ( - - - - - - ) : null} - - ) -} - -export function Features({ children }) { - return
{children}
-} diff --git a/docs/web/components/features/style.module.css b/docs/web/components/features/style.module.css deleted file mode 100644 index cb90e7767c..0000000000 --- a/docs/web/components/features/style.module.css +++ /dev/null @@ -1,127 +0,0 @@ -.feature { - position: relative; - padding: 1.5rem 1.75rem; - color: #000; - background-color: white; - overflow: hidden; - border-radius: 1.78em; -} -.feature.large { - grid-column: span 2; -} -.feature.centered { - text-align: center; -} -.feature h3 { - position: relative; - font-size: 34px; - font-size: min(34px, max(4vw, 24px)); - font-weight: 600; - line-height: 1.25; - letter-spacing: -0.02rem; - z-index: 2; -} -:global(.dark) .feature:not(.light-only) { - color: #fff; - background-color: #202020; -} -.feature { - box-shadow: 0 8px 16px rgb(0 0 0 / 8%), 0 1px 2px rgb(0 0 0 / 4%), - 0 0 0 1px rgb(0 0 0 / 3%); - transition: box-shadow 0.3s ease; -} -:global(.dark) .feature { - box-shadow: 0 0 0 1px rgb(82 82 82 / 60%); -} -.feature .link { - position: absolute; - right: 1em; - bottom: 1em; - z-index: 2; - width: 2.5em; - height: 2.5em; - background-color: rgb(0 0 0 / 39%); - backdrop-filter: blur(10px); - border-radius: 50%; - display: flex; - justify-content: center; - align-items: center; - color: rgba(255, 255, 255, 0.9); - box-shadow: 0 0 0 2px rgb(154 154 154 / 56%), 0 0 30px rgb(0 0 0 / 10%); - transition: all 0.2s ease; - -webkit-user-drag: none; -} -@media (hover: hover) { - .feature .link { - opacity: 0; - } - .feature:hover .link { - opacity: 1; - } - .feature .link:hover { - transform: scale(1.05); - color: rgba(255, 255, 255, 1); - background-color: rgba(64, 64, 64, 0.39); - box-shadow: 0 0 0 2px rgba(220, 220, 220, 0.56), 0 0 30px rgb(0 0 0 / 10%); - } - .feature .link:active { - transform: scale(1); - color: rgba(255, 255, 255, 0.8); - background-color: rgba(22, 22, 22, 0.39); - box-shadow: 0 0 0 2px rgba(178, 178, 178, 0.56), 0 0 30px rgb(0 0 0 / 10%); - } -} - -.features { - display: grid; - grid-template-columns: repeat(3, 1fr); - grid-gap: 2em; - font-feature-settings: initial; -} - -.feature :global(.show-on-mobile) { - display: none; -} - -@media screen and (max-width: 1024px) { - .feature { - max-width: 80vw; - width: 100%; - } - .feature.large { - grid-column: span 1; - } - .features { - grid-template-columns: 1fr; - grid-gap: 3em; - justify-items: center; - } - .feature h3 { - font-size: 28px; - font-size: min(28px, max(4vw, 22px)); - text-align: center; - } -} - -@media screen and (max-width: 640px) { - .feature { - max-width: 460px; - width: 100%; - } - .feature.large { - grid-column: span 1; - } - .features { - grid-template-columns: 1fr; - grid-gap: 3em; - justify-items: center; - } - .feature h3 { - font-size: 34px; - font-size: min(34px, max(4vw, 22px)); - text-align: center; - } - .feature :global(.show-on-mobile) { - display: block; - } -} diff --git a/docs/web/components/features/themes-animation.tsx b/docs/web/components/features/themes-animation.tsx deleted file mode 100644 index 7f2d36610e..0000000000 --- a/docs/web/components/features/themes-animation.tsx +++ /dev/null @@ -1,120 +0,0 @@ -export function ThemesAnimation(props) { - return ( - - - - - - - - - - - - - - ) -} diff --git a/docs/web/components/file-tree/index.tsx b/docs/web/components/file-tree/index.tsx deleted file mode 100644 index a061ec7af7..0000000000 --- a/docs/web/components/file-tree/index.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import React, { useState, useCallback, createContext, useContext } from 'react' -import cn from 'clsx' -import type { ReactElement } from 'react' - -const ctx = createContext(0) - -export const { Provider, Consumer } = ctx - -export function useIndent() { - return useContext(ctx) || 0 -} - -export default ctx - -interface FolderProps { - name: string - label?: ReactElement - open?: boolean - defaultOpen?: boolean - onToggle?: (open: boolean) => void - children: ReactElement | ReactElement[] -} - -interface FileProps { - name: string - label?: ReactElement - active?: boolean - children: ReactElement | ReactElement[] -} - -const Tree: React.FC<{ - children: ReactElement | ReactElement[] -}> = ({ children }) => ( -
-
- {children} -
-
-) - -function Ident() { - const indent = useIndent() - - return ( - <> - {[...Array(indent)].map((_, i) => ( - - ))} - - ) -} - -const Folder: React.FC = React.memo( - ({ label, name, open, children, defaultOpen, onToggle }) => { - const indent = useIndent() - - const [isOpen, setIsOpen] = useState(defaultOpen || false) - - const toggle = useCallback(() => { - onToggle?.(!isOpen) - setIsOpen(!isOpen) - }, [isOpen, onToggle]) - - const isFolderOpen = open === undefined ? isOpen : open - - return ( -
  • - - - - {isFolderOpen ? ( - - - - ) : ( - - - - )} - - {label ?? name} - - {isFolderOpen ? ( -
      - {children} -
    - ) : null} -
  • - ) - } -) - -Folder.displayName = 'Folder' - -const File: React.FC = React.memo( - ({ label, name, active, ...props }) => { - return ( -
  • - - - - - - - - {label ?? name} - -
  • - ) - } -) - -File.displayName = 'File' - -export { Tree, Folder, File } diff --git a/docs/web/components/icons/globe.tsx b/docs/web/components/icons/globe.tsx deleted file mode 100644 index 019edce3e9..0000000000 --- a/docs/web/components/icons/globe.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export default ( - - - -) diff --git a/docs/web/components/icons/markdown.tsx b/docs/web/components/icons/markdown.tsx deleted file mode 100644 index b405add289..0000000000 --- a/docs/web/components/icons/markdown.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export default ( - - - -) diff --git a/docs/web/components/icons/switch.tsx b/docs/web/components/icons/switch.tsx deleted file mode 100644 index 15a3844136..0000000000 --- a/docs/web/components/icons/switch.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export default ( - - - -) diff --git a/docs/web/components/screenshot/index.jsx b/docs/web/components/screenshot/index.jsx deleted file mode 100644 index 8e2f8a0d7c..0000000000 --- a/docs/web/components/screenshot/index.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import cn from 'clsx' -import Image from 'next/image' - -export function Screenshot({ src, alt, full }) { - return ( -
    - {alt} -
    - ) -} diff --git a/docs/web/components/table/index.tsx b/docs/web/components/table/index.tsx deleted file mode 100644 index 8130bfcdfb..0000000000 --- a/docs/web/components/table/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import styles from './style.module.css' - -export function OptionTable({ options }: { options: [string, string, any] }) { - return ( -
    - - - - - - - - - - {options.map(([option, type, description]) => ( - - - - - - ))} - -
    OptionTypeDescription
    - {option} - - {type} - {description}
    -
    - ) -} diff --git a/docs/web/components/table/style.module.css b/docs/web/components/table/style.module.css deleted file mode 100644 index 736d0a6c17..0000000000 --- a/docs/web/components/table/style.module.css +++ /dev/null @@ -1,13 +0,0 @@ -.container { - mask-image: linear-gradient( - to right, - transparent 0.8em, - white 1.5em, - white calc(100% - 1.5em), - transparent calc(100% - 0.8em) - ); -} - -.container::-webkit-scrollbar { - appearance: none; -} diff --git a/docs/web/components/text/index.tsx b/docs/web/components/text/index.tsx deleted file mode 100644 index cd0dfc10a4..0000000000 --- a/docs/web/components/text/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from "react"; -import styles from './style.module.css' -import TextTransition, { presets } from "react-text-transition"; - -const TEXTS = [ - "Cosmos", - "Berachain", - "Anything", -]; - -const Text = () => { - const [index, setIndex] = React.useState(0); - - React.useEffect(() => { - const intervalId = setInterval(() => - setIndex(index => index + 1), - 2000 // every 3 seconds - ); - return () => clearTimeout(intervalId); - }, []); - - return ( - -

    - The New Standard of EVM on - - {TEXTS[index % TEXTS.length]} - -

    - - ); -}; - -export default Text; \ No newline at end of file diff --git a/docs/web/components/text/style.module.css b/docs/web/components/text/style.module.css deleted file mode 100644 index a701cdcab5..0000000000 --- a/docs/web/components/text/style.module.css +++ /dev/null @@ -1,25 +0,0 @@ -@media only screen and (min-width: 0px) { - .subheader { - font-size: 16px; - } -} -@media only screen and (min-width: 600px) { - .subheader { - font-size: 18px; - } -} -@media only screen and (min-width: 900px) { - .subheader { - font-size: 20px; - } -} -@media only screen and (min-width: 1200px) { - .subheader { - font-size: 20px; - } -} -@media only screen and (min-width: 1536px) { - .subheader { - font-size: 20px; - } -} \ No newline at end of file diff --git a/docs/web/components/utils/shadow.jsx b/docs/web/components/utils/shadow.jsx deleted file mode 100644 index e3acc56abe..0000000000 --- a/docs/web/components/utils/shadow.jsx +++ /dev/null @@ -1,22 +0,0 @@ -// https://gist.github.com/janily/04d7fb0861e053d4679b38743ffc05a7 - -import { Component } from 'react' -import { createPortal } from 'react-dom' - -export class Shadow extends Component { - componentDidMount() { - if (this.shadowAttached) return - this.shadowAttached = true - this.shadowRoot = this.node.attachShadow({ mode: this.props.mode }) - this.forceUpdate() - } - - render() { - const { children, ...rest } = this.props - return ( -
    (this.node = node)}> - {this.shadowRoot && createPortal(children, this.shadowRoot)} -
    - ) - } -} diff --git a/docs/web/components/video/index.jsx b/docs/web/components/video/index.jsx deleted file mode 100644 index d7c0df9d27..0000000000 --- a/docs/web/components/video/index.jsx +++ /dev/null @@ -1,14 +0,0 @@ -export default function Video({ src }) { - return ( - - ) -} diff --git a/docs/web/next.config.js b/docs/web/next.config.js deleted file mode 100644 index ccc48134eb..0000000000 --- a/docs/web/next.config.js +++ /dev/null @@ -1,23 +0,0 @@ -const withNextra = require('nextra')({ - theme: 'nextra-theme-docs', - themeConfig: './theme.config.jsx', - defaultShowCopyCode: true, - latex: true, - -}) - -/** @type {import('next').NextConfig} */ -const config = { - reactStrictMode: true, - images: { - unoptimized: true - }, - typescript: { - // Disable type checking since eslint handles this - ignoreBuildErrors: true, - }, -}; -module.exports = withNextra(config) - -// If you have other Next.js configurations, you can pass them as the parameter: -// module.exports = withNextra({ /* other next.js config */ }) \ No newline at end of file diff --git a/docs/web/package.json b/docs/web/package.json deleted file mode 100644 index 92d2b91c34..0000000000 --- a/docs/web/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "docs", - "private": true, - "scripts": { - "dev": "next", - "start": "next start", - "build": "next build", - "export": "next export", - "export:deploy": "next build && next export && touch out/.nojekyll", - "deploy": "gh-pages -d out -t true" - }, - "author": "@DevLobster", - "license": "MIT", - "dependencies": { - "@keplr-wallet/cosmos": "^0.11.23", - "@keplr-wallet/types": "^0.11.26", - "cobe": "^0.6.3", - "framer-motion": "^10.0.1", - "gh-pages": "^5.0.0", - "highlight.js": "^11.7.0", - "next": "^13.1.2", - "nextra": "^2.2.3", - "nextra-theme-docs": "^2.2.3", - "prismjs": "^1.29.0", - "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-code-blocks": "^0.0.9-0", - "react-dom": "^18.2.0", - "react-prism": "^4.3.2", - "react-spring": "^9.7.1", - "react-text-transition": "^3.0.2", - "sharp": "^0.31.3" - }, - "devDependencies": { - "@types/node": "18.13.0", - "typescript": "4.9.5" - } -} diff --git a/docs/web/pages/_app.tsx b/docs/web/pages/_app.tsx deleted file mode 100644 index 6e78ccf936..0000000000 --- a/docs/web/pages/_app.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import './styles.css' -import 'nextra-theme-docs/style.css' -import Head from 'next/head' - -export default function Nextra({ Component, pageProps }) { - const getLayout = Component.getLayout || ((page) => page) - return getLayout( - <> - - - - - - ) -} diff --git a/docs/web/pages/_meta.json b/docs/web/pages/_meta.json deleted file mode 100644 index 1dbec18d2c..0000000000 --- a/docs/web/pages/_meta.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "index": { - "title": "Polaris Ethereum", - "type": "page", - "display": "hidden" - }, - "docs": { - "title": "Documentation", - "type": "page" - } -} \ No newline at end of file diff --git a/docs/web/pages/index.mdx b/docs/web/pages/index.mdx deleted file mode 100644 index 873619c20e..0000000000 --- a/docs/web/pages/index.mdx +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: Polaris Ethereum ---- - -import createGlobe from "cobe"; -import { useEffect, useRef } from "react"; -import { useSpring } from "react-spring"; -import Text from '../components/text' - -export function Cobe() { - const canvasRef = useRef(); - const pointerInteracting = useRef(null); - const pointerInteractionMovement = useRef(0); - const [{ r }, api] = useSpring(() => ({ - r: 0, - config: { - mass: 1, - tension: 280, - friction: 40, - precision: 0.001, - }, - })); - useEffect(() => { - let phi = 0; - let width = 0; - let dir = 0; // 0 is smaller, 1 is larger. - let mm = 5000; - let i = 0; - let flip = 0; - const onResize = () => - canvasRef.current && (width = canvasRef.current.offsetWidth); - window.addEventListener("resize", onResize); - onResize(); - const globe = createGlobe(canvasRef.current, { - devicePixelRatio: 2, - width: width * 2, - height: width * 2, - phi: 6.28, - theta: -1.5, - dark: 1, - diffuse: 5, - mapSamples: 0.0, - mapBrightness: 4.0, - mapBaseBrightness: 1, - baseColor: [87 / 255, 190 / 255, 229 / 255], - markerColor: [87 / 255, 190 / 255, 229 / 255], // 87 190 229 - glowColor: [87 / 255, 190 / 255, 229 / 255], - markers: [], - opacity: 0, - onRender: (state) => { - // Called on every animation frame. - // `state` will be an empty object, return updated params. - state.phi = phi + r.get(); - phi += 0.005; - state.width = width * 2; - state.height = width * 2; - state.mapSamples = mm * (i ** (6 / 5) / 25000); - state.diffuse = 6; - if (dir === 0) { - i--; - if (i <= 0) { - dir = 1; - } - } else { - i++; - if (i >= 1200) { - dir = 0; - } - } - }, - }); - setTimeout(() => (canvasRef.current.style.opacity = "1")); - return () => globe.destroy(); - -}, []); -return ( - -
    -
    -

    - POLARIS -

    - - - -
    - { - pointerInteracting.current = - e.clientX - pointerInteractionMovement.current; - canvasRef.current.style.cursor = "grabbing"; - }} - onPointerUp={() => { - pointerInteracting.current = null; - canvasRef.current.style.cursor = "grab"; - }} - onPointerOut={() => { - pointerInteracting.current = null; - canvasRef.current.style.cursor = "grab"; - }} - onMouseMove={(e) => { - if (pointerInteracting.current !== null) { - const delta = e.clientX - pointerInteracting.current; - pointerInteractionMovement.current = delta; - api.start({ - r: delta / 200, - }); - } - }} - onTouchMove={(e) => { - if (pointerInteracting.current !== null && e.touches[0]) { - const delta = e.touches[0].clientX - pointerInteracting.current; - pointerInteractionMovement.current = delta; - api.start({ - r: delta / 100, - }); - } - }} - style={{ - width: "100%", - height: "100%", - }} - /> -
    -); } - - - -import Link from "next/link"; - -
    -
    - - Get Started - - - Github - -
    -
    - - Polaris Ethereum is currently licensed under BUSL-1.1 → - -
    - - diff --git a/docs/web/pages/index.module.css b/docs/web/pages/index.module.css deleted file mode 100644 index 5f97c85383..0000000000 --- a/docs/web/pages/index.module.css +++ /dev/null @@ -1,80 +0,0 @@ -.file { - display: inline-block; - font-size: 0.9em; - padding: 1px 6px; - border-radius: 0.375rem; - border: 1px solid #0077ff; - color: #0077ff; - font-weight: 600; - cursor: default; - user-select: none; -} -.file.active { - background-color: #0077ff; - color: white; -} - -.comparison { - display: flex; - justify-content: space-evenly; - align-items: center; -} -.comparison > svg { - opacity: 0.3; -} - -.optimization { - display: flex; - justify-content: center; - margin: 0; - padding: 1.5rem 1rem; - background: linear-gradient(27deg, #3d3d3d, #000000); - color: #e3e3e3; - border-radius: 0.375rem; - font-weight: 300; -} - -:global(.dark) .optimization { - background: linear-gradient(27deg, #3d3d3d, #252525); -} - -a.cta { - display: inline-block; - background: linear-gradient(to bottom, #238aff, #0077ff); - text-decoration: none; - border-radius: 9999px; - color: white; - padding: 0.75rem 1.5rem; - margin-top: 0.5rem; - text-shadow: 0 1px 1px #00387838; - box-shadow: 0 1px 2px #00295738; - transition: all 0.2s ease; - -webkit-user-drag: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} -a.cta span { - display: inline-block; - transition: all 0.2s ease; -} -a.cta:hover span { - transform: translateX(3px); -} -a.cta:hover { - box-shadow: 0 5px 30px -10px #0078ffab; - filter: brightness(1.05); -} -a.cta:active { - box-shadow: 0 1px 3px #00295738; - filter: brightness(0.95); -} -a.cta:active span { - transform: translateX(5px); -} -a.cta:focus-visible { - outline: 2px solid hsl(var(--nextra-primary-hue) 100% 77%); - outline-offset: 2px; -} -a.cta:focus-visible span { - transform: translateX(3px); -} diff --git a/docs/web/pages/styles.css b/docs/web/pages/styles.css deleted file mode 100644 index 2b01afdf71..0000000000 --- a/docs/web/pages/styles.css +++ /dev/null @@ -1,105 +0,0 @@ -body { - font-family: 'IBM Plex Sans', sans-serif; -} - -.nextra-body { - width: 100%; -} - -a { - color: black; -} - -.cta { - color: #333; - font-size: 1.2rem; - font-weight: 700; - padding: 0.4rem 1rem; - border-radius: 7px; - text-decoration: none; - user-select: none; - box-shadow: 0 5px 50px rgba(0, 0, 0, 0); - transition: all 0.4s ease; - outline: none !important; -} -.cta-container { - display: inline-flex; - justify-content: center; -} -.cta-container:hover .cta { - color: #999; -} -.cta-container .cta:hover { - color: #000; - box-shadow: 0 0 0 #efefef, 0 0 100px #efefef inset; - outline: none; -} -.cta-container .cta:active { - color: #000; - box-shadow: 0 0 0 #efefef, 0 0 100px #ddd inset; - outline: none; -} - -.dark .title { - color: #fff; -} -.title { - color: #fff; -} -.dark .cta { - color: #ccc; -} -.dark .cta-container:hover .cta { - color: #777; -} -.dark .cta-container .cta:hover { - color: #fff; - box-shadow: 0 0 0 #333, 0 0 100px #333 inset; -} -.dark .cta-container .cta:active { - color: #fff; - box-shadow: 0 0 0 #333, 0 0 100px #444 inset; -} - -article code { - font-family: 'IBM Plex Mono', monospace; -} - -.steps-container { - margin-left: 1rem; - padding-left: 1.5rem; - counter-reset: step; - border-left: 1px solid; - border-color: rgb(229 231 235/1); - margin-bottom: 3rem; -} -.steps-container h3 { - counter-increment: step; -} -.steps-container h3:before { - content: counter(step); - display: inline-block; - position: absolute; - margin-top: 3px; - margin-left: -41px; - width: 33px; - height: 33px; - text-align: center; - text-indent: -1px; - color: #999; - border-radius: 100%; - border: 4px solid #fff; - background: #f3f3f3; - line-height: 1.5rem; - font-size: 1rem; - font-weight: 400; -} - -.dark .steps-container { - border-color: #2e2e2e; -} -.dark .steps-container h3:before { - color: #999; - border: 4px solid rgba(17, 17, 17, var(--tw-bg-opacity)); - background: #2e2e2e; -} \ No newline at end of file diff --git a/docs/web/pnpm-lock.yaml b/docs/web/pnpm-lock.yaml deleted file mode 100644 index 66b3d6c68f..0000000000 --- a/docs/web/pnpm-lock.yaml +++ /dev/null @@ -1,8156 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@keplr-wallet/cosmos': - specifier: ^0.11.23 - version: 0.11.44 - '@keplr-wallet/types': - specifier: ^0.11.26 - version: 0.11.44 - cobe: - specifier: ^0.6.3 - version: 0.6.3 - framer-motion: - specifier: ^10.0.1 - version: 10.0.2(react-dom@18.2.0)(react@18.2.0) - gh-pages: - specifier: ^5.0.0 - version: 5.0.0 - highlight.js: - specifier: ^11.7.0 - version: 11.7.0 - next: - specifier: ^13.1.2 - version: 13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0) - nextra: - specifier: ^2.2.3 - version: 2.2.17(next@13.2.3)(react-dom@18.2.0)(react@18.2.0) - nextra-theme-docs: - specifier: ^2.2.3 - version: 2.2.17(next@13.2.3)(nextra@2.2.17)(react-dom@18.2.0)(react@18.2.0) - prismjs: - specifier: ^1.29.0 - version: 1.29.0 - prop-types: - specifier: ^15.8.1 - version: 15.8.1 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-code-blocks: - specifier: ^0.0.9-0 - version: 0.0.9-0(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-prism: - specifier: ^4.3.2 - version: 4.3.2(prop-types@15.8.1)(react@18.2.0) - react-spring: - specifier: ^9.7.1 - version: 9.7.1(@react-three/fiber@8.13.6)(konva@9.2.0)(react-dom@18.2.0)(react-konva@18.2.10)(react-native@0.72.4)(react-zdog@1.2.1)(react@18.2.0)(three@0.155.0)(zdog@1.1.3) - react-text-transition: - specifier: ^3.0.2 - version: 3.1.0(react-dom@18.2.0)(react@18.2.0) - sharp: - specifier: ^0.31.3 - version: 0.31.3 - -devDependencies: - '@types/node': - specifier: 18.13.0 - version: 18.13.0 - typescript: - specifier: 4.9.5 - version: 4.9.5 - -packages: - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - dev: false - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - dev: false - - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/core@7.22.10: - resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helpers': 7.22.10 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2(supports-color@5.5.0) - '@babel/types': 7.23.0 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/generator@7.23.0: - resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: false - - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 - dev: false - - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: - resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false - - /@babel/helper-create-class-features-plugin@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: false - - /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: false - - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.10): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@5.5.0) - lodash.debounce: 4.0.8 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 - dev: false - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.10 - dev: false - - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: false - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-wrap-function@7.22.10: - resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - dev: false - - /@babel/helpers@7.22.10: - resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2(supports-color@5.5.0) - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: false - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - dev: false - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.10): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-proposal-export-default-from@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.10): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.10): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - dev: false - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.10): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.10): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-async-generator-functions@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.10): - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: false - - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: false - - /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-optional-chaining@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/types': 7.23.0 - dev: false - - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: false - - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-runtime@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.10) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.10) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-typescript@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) - dev: false - - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/preset-env@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-async-generator-functions': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.10) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.10) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.10) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.10) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.10) - core-js-compat: 3.32.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/preset-flow@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.10) - dev: false - - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.10): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 - esutils: 2.0.3 - dev: false - - /@babel/preset-typescript@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-typescript': 7.22.10(@babel/core@7.22.10) - dev: false - - /@babel/register@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 - dev: false - - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: false - - /@babel/runtime@7.21.0: - resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: false - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: false - - /@babel/traverse@7.23.2(supports-color@5.5.0): - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/types@7.22.10: - resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: false - - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: false - - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true - dependencies: - '@emotion/memoize': 0.7.4 - dev: false - optional: true - - /@emotion/is-prop-valid@1.2.0: - resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} - dependencies: - '@emotion/memoize': 0.8.0 - dev: false - - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true - dev: false - optional: true - - /@emotion/memoize@0.8.0: - resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} - dev: false - - /@emotion/stylis@0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: false - - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: false - - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - dev: false - - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - dev: false - - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - dev: false - - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: false - - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: false - - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: false - - /@headlessui/react@1.7.13(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9n+EQKRtD9266xIHXdY5MfiXPDfYwl7zBM7KOx2Ae3Gdgxy8QML1FkCMjq6AsOf0l6N9uvI4HcFtuFlenaldKg==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - dependencies: - client-only: 0.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@jest/create-cache-key-function@29.6.2: - resolution: {integrity: sha512-oGVRMr8na9h1vUiem1E/Uoxb/NR9BdfKb7IBZ+pNWxJQmTYSbDF0dsVBAGqNU7MBQwYJDyRx0H7H/0itiqAgQg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - dev: false - - /@jest/environment@29.6.2: - resolution: {integrity: sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 18.13.0 - jest-mock: 29.6.2 - dev: false - - /@jest/fake-timers@29.6.2: - resolution: {integrity: sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.13.0 - jest-message-util: 29.6.2 - jest-mock: 29.6.2 - jest-util: 29.6.2 - dev: false - - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: false - - /@jest/types@26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.13.0 - '@types/yargs': 15.0.15 - chalk: 4.1.2 - dev: false - - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.13.0 - '@types/yargs': 16.0.5 - chalk: 4.1.2 - dev: false - - /@jest/types@29.6.1: - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.13.0 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: false - - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 - dev: false - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - dev: false - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: false - - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - - /@keplr-wallet/common@0.11.44: - resolution: {integrity: sha512-GBaan7SHLwlJxL8qDzpYaywPlAMZA8XoY4igNbiXeCDIKjh+up8qsYofVlxv1HxRnLSuKbefkDekdMfU0PnQ+g==} - dependencies: - '@keplr-wallet/crypto': 0.11.44 - buffer: 6.0.3 - delay: 4.4.1 - dev: false - - /@keplr-wallet/cosmos@0.11.44: - resolution: {integrity: sha512-k9nD+eIpupuwu4hpocFEgGDM3aZKfAl6biidpRquSYH+2mL+6on9UDs00Us8B1nZA81p4NTe2xju5ZKC2+/zDw==} - dependencies: - '@ethersproject/address': 5.7.0 - '@keplr-wallet/common': 0.11.44 - '@keplr-wallet/crypto': 0.11.44 - '@keplr-wallet/proto-types': 0.11.44 - '@keplr-wallet/types': 0.11.44 - '@keplr-wallet/unit': 0.11.44 - axios: 0.27.2 - bech32: 1.1.4 - buffer: 6.0.3 - long: 4.0.0 - protobufjs: 6.11.4 - transitivePeerDependencies: - - debug - dev: false - - /@keplr-wallet/crypto@0.11.44: - resolution: {integrity: sha512-RNI59Tex/dnuBLC2TdhjkcgYeOqJYoxC3YZQMiM13u7G7OT48h11hJG6eXik/D7AlXxY+Fj/DhDZ75ywS/DOKA==} - dependencies: - '@ethersproject/keccak256': 5.7.0 - bip32: 2.0.6 - bip39: 3.1.0 - bs58check: 2.1.2 - buffer: 6.0.3 - crypto-js: 4.1.1 - elliptic: 6.5.4 - sha.js: 2.4.11 - dev: false - - /@keplr-wallet/proto-types@0.11.44: - resolution: {integrity: sha512-qwq+VJ0nwU1OCyM70jqebWHvl6XlHB6kXRlBeNnL+FPdyYGzQFgsJeNK9fveY2wFE/gqcPc4oQjHuU0fifvipQ==} - dependencies: - long: 4.0.0 - protobufjs: 6.11.4 - dev: false - - /@keplr-wallet/types@0.11.44: - resolution: {integrity: sha512-QR7oh3r2yFP7vBHVh3MnTt+E+sFV4tATD8b6rnO7ym6B3Novm69TQgo4EM9uqh0LUSnWHPQFN9unyTKtnNvApw==} - dependencies: - axios: 0.27.2 - long: 4.0.0 - transitivePeerDependencies: - - debug - dev: false - - /@keplr-wallet/unit@0.11.44: - resolution: {integrity: sha512-gRUDzg/qXaEhQ+fp45RGOMGLrH+5gNlFvSH/9/vFhqlaKKHAhq4Aj8pEZfeZBocpqbrgNca+nv1XnvPgWtzNHw==} - dependencies: - '@keplr-wallet/types': 0.11.44 - big-integer: 1.6.51 - utility-types: 3.10.0 - transitivePeerDependencies: - - debug - dev: false - - /@mdx-js/mdx@2.3.0: - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/mdx': 2.0.3 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 - estree-util-to-js: 1.2.0 - estree-walker: 3.0.3 - hast-util-to-estree: 2.3.2 - markdown-extensions: 1.1.1 - periscopic: 3.1.0 - remark-mdx: 2.3.0 - remark-parse: 10.0.1 - remark-rehype: 10.1.0 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - transitivePeerDependencies: - - supports-color - dev: false - - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' - dependencies: - '@types/mdx': 2.0.3 - '@types/react': 18.0.28 - react: 18.2.0 - dev: false - - /@napi-rs/simple-git-android-arm-eabi@0.1.8: - resolution: {integrity: sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-android-arm64@0.1.8: - resolution: {integrity: sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-darwin-arm64@0.1.8: - resolution: {integrity: sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-darwin-x64@0.1.8: - resolution: {integrity: sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8: - resolution: {integrity: sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-arm64-gnu@0.1.8: - resolution: {integrity: sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-arm64-musl@0.1.8: - resolution: {integrity: sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-x64-gnu@0.1.8: - resolution: {integrity: sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-x64-musl@0.1.8: - resolution: {integrity: sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-win32-arm64-msvc@0.1.8: - resolution: {integrity: sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-win32-x64-msvc@0.1.8: - resolution: {integrity: sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git@0.1.8: - resolution: {integrity: sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==} - engines: {node: '>= 10'} - optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.8 - '@napi-rs/simple-git-android-arm64': 0.1.8 - '@napi-rs/simple-git-darwin-arm64': 0.1.8 - '@napi-rs/simple-git-darwin-x64': 0.1.8 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.8 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.8 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.8 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.8 - '@napi-rs/simple-git-linux-x64-musl': 0.1.8 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.8 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.8 - dev: false - - /@next/env@13.2.3: - resolution: {integrity: sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow==} - dev: false - - /@next/swc-android-arm-eabi@13.2.3: - resolution: {integrity: sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@next/swc-android-arm64@13.2.3: - resolution: {integrity: sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-arm64@13.2.3: - resolution: {integrity: sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-x64@13.2.3: - resolution: {integrity: sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-freebsd-x64@13.2.3: - resolution: {integrity: sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm-gnueabihf@13.2.3: - resolution: {integrity: sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-gnu@13.2.3: - resolution: {integrity: sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-musl@13.2.3: - resolution: {integrity: sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-gnu@13.2.3: - resolution: {integrity: sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-musl@13.2.3: - resolution: {integrity: sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-arm64-msvc@13.2.3: - resolution: {integrity: sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-ia32-msvc@13.2.3: - resolution: {integrity: sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-x64-msvc@13.2.3: - resolution: {integrity: sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@noble/hashes@1.2.0: - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - dev: false - - /@popperjs/core@2.11.6: - resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} - dev: false - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - - /@react-native-community/cli-clean@11.3.6: - resolution: {integrity: sha512-jOOaeG5ebSXTHweq1NznVJVAFKtTFWL4lWgUXl845bCGX7t1lL8xQNWHKwT8Oh1pGR2CI3cKmRjY4hBg+pEI9g==} - dependencies: - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - execa: 5.1.1 - prompts: 2.4.2 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-config@11.3.6: - resolution: {integrity: sha512-edy7fwllSFLan/6BG6/rznOBCLPrjmJAE10FzkEqNLHowi0bckiAPg1+1jlgQ2qqAxV5kuk+c9eajVfQvPLYDA==} - dependencies: - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - cosmiconfig: 5.2.1 - deepmerge: 4.3.1 - glob: 7.2.3 - joi: 17.9.2 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-debugger-ui@11.3.6: - resolution: {integrity: sha512-jhMOSN/iOlid9jn/A2/uf7HbC3u7+lGktpeGSLnHNw21iahFBzcpuO71ekEdlmTZ4zC/WyxBXw9j2ka33T358w==} - dependencies: - serve-static: 1.15.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@react-native-community/cli-doctor@11.3.6: - resolution: {integrity: sha512-UT/Tt6omVPi1j6JEX+CObc85eVFghSZwy4GR9JFMsO7gNg2Tvcu1RGWlUkrbmWMAMHw127LUu6TGK66Ugu1NLA==} - dependencies: - '@react-native-community/cli-config': 11.3.6 - '@react-native-community/cli-platform-android': 11.3.6 - '@react-native-community/cli-platform-ios': 11.3.6 - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - command-exists: 1.2.9 - envinfo: 7.10.0 - execa: 5.1.1 - hermes-profile-transformer: 0.0.6 - ip: 1.1.8 - node-stream-zip: 1.15.0 - ora: 5.4.1 - prompts: 2.4.2 - semver: 7.5.4 - strip-ansi: 5.2.0 - sudo-prompt: 9.2.1 - wcwidth: 1.0.1 - yaml: 2.3.1 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-hermes@11.3.6: - resolution: {integrity: sha512-O55YAYGZ3XynpUdePPVvNuUPGPY0IJdctLAOHme73OvS80gNwfntHDXfmY70TGHWIfkK2zBhA0B+2v8s5aTyTA==} - dependencies: - '@react-native-community/cli-platform-android': 11.3.6 - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - hermes-profile-transformer: 0.0.6 - ip: 1.1.8 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-platform-android@11.3.6: - resolution: {integrity: sha512-ZARrpLv5tn3rmhZc//IuDM1LSAdYnjUmjrp58RynlvjLDI4ZEjBAGCQmgysRgXAsK7ekMrfkZgemUczfn9td2A==} - dependencies: - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - execa: 5.1.1 - glob: 7.2.3 - logkitty: 0.7.1 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-platform-ios@11.3.6: - resolution: {integrity: sha512-tZ9VbXWiRW+F+fbZzpLMZlj93g3Q96HpuMsS6DRhrTiG+vMQ3o6oPWSEEmMGOvJSYU7+y68Dc9ms2liC7VD6cw==} - dependencies: - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - execa: 5.1.1 - fast-xml-parser: 4.2.7 - glob: 7.2.3 - ora: 5.4.1 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-plugin-metro@11.3.6(@babel/core@7.22.10): - resolution: {integrity: sha512-D97racrPX3069ibyabJNKw9aJpVcaZrkYiEzsEnx50uauQtPDoQ1ELb/5c6CtMhAEGKoZ0B5MS23BbsSZcLs2g==} - dependencies: - '@react-native-community/cli-server-api': 11.3.6 - '@react-native-community/cli-tools': 11.3.6 - chalk: 4.1.2 - execa: 5.1.1 - metro: 0.76.7 - metro-config: 0.76.7 - metro-core: 0.76.7 - metro-react-native-babel-transformer: 0.76.7(@babel/core@7.22.10) - metro-resolver: 0.76.7 - metro-runtime: 0.76.7 - readline: 1.3.0 - transitivePeerDependencies: - - '@babel/core' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /@react-native-community/cli-server-api@11.3.6: - resolution: {integrity: sha512-8GUKodPnURGtJ9JKg8yOHIRtWepPciI3ssXVw5jik7+dZ43yN8P5BqCoDaq8e1H1yRer27iiOfT7XVnwk8Dueg==} - dependencies: - '@react-native-community/cli-debugger-ui': 11.3.6 - '@react-native-community/cli-tools': 11.3.6 - compression: 1.7.4 - connect: 3.7.0 - errorhandler: 1.5.1 - nocache: 3.0.4 - pretty-format: 26.6.2 - serve-static: 1.15.0 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /@react-native-community/cli-tools@11.3.6: - resolution: {integrity: sha512-JpmUTcDwAGiTzLsfMlIAYpCMSJ9w2Qlf7PU7mZIRyEu61UzEawyw83DkqfbzDPBuRwRnaeN44JX2CP/yTO3ThQ==} - dependencies: - appdirsjs: 1.2.7 - chalk: 4.1.2 - find-up: 5.0.0 - mime: 2.6.0 - node-fetch: 2.6.12 - open: 6.4.0 - ora: 5.4.1 - semver: 7.5.4 - shell-quote: 1.8.1 - transitivePeerDependencies: - - encoding - dev: false - - /@react-native-community/cli-types@11.3.6: - resolution: {integrity: sha512-6DxjrMKx5x68N/tCJYVYRKAtlRHbtUVBZrnAvkxbRWFD9v4vhNgsPM0RQm8i2vRugeksnao5mbnRGpS6c0awCw==} - dependencies: - joi: 17.9.2 - dev: false - - /@react-native-community/cli@11.3.6(@babel/core@7.22.10): - resolution: {integrity: sha512-bdwOIYTBVQ9VK34dsf6t3u6vOUU5lfdhKaAxiAVArjsr7Je88Bgs4sAbsOYsNK3tkE8G77U6wLpekknXcanlww==} - engines: {node: '>=16'} - hasBin: true - dependencies: - '@react-native-community/cli-clean': 11.3.6 - '@react-native-community/cli-config': 11.3.6 - '@react-native-community/cli-debugger-ui': 11.3.6 - '@react-native-community/cli-doctor': 11.3.6 - '@react-native-community/cli-hermes': 11.3.6 - '@react-native-community/cli-plugin-metro': 11.3.6(@babel/core@7.22.10) - '@react-native-community/cli-server-api': 11.3.6 - '@react-native-community/cli-tools': 11.3.6 - '@react-native-community/cli-types': 11.3.6 - chalk: 4.1.2 - commander: 9.5.0 - execa: 5.1.1 - find-up: 4.1.0 - fs-extra: 8.1.0 - graceful-fs: 4.2.10 - prompts: 2.4.2 - semver: 7.5.4 - transitivePeerDependencies: - - '@babel/core' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /@react-native/assets-registry@0.72.0: - resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} - dev: false - - /@react-native/codegen@0.72.6(@babel/preset-env@7.22.10): - resolution: {integrity: sha512-idTVI1es/oopN0jJT/0jB6nKdvTUKE3757zA5+NPXZTeB46CIRbmmos4XBiAec8ufu9/DigLPbHTYAaMNZJ6Ig==} - peerDependencies: - '@babel/preset-env': ^7.1.6 - dependencies: - '@babel/parser': 7.23.0 - '@babel/preset-env': 7.22.10(@babel/core@7.22.10) - flow-parser: 0.206.0 - jscodeshift: 0.14.0(@babel/preset-env@7.22.10) - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@react-native/gradle-plugin@0.72.11: - resolution: {integrity: sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==} - dev: false - - /@react-native/js-polyfills@0.72.1: - resolution: {integrity: sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==} - dev: false - - /@react-native/normalize-colors@0.72.0: - resolution: {integrity: sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==} - dev: false - - /@react-native/virtualized-lists@0.72.8(react-native@0.72.4): - resolution: {integrity: sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==} - peerDependencies: - react-native: '*' - dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react-native: 0.72.4(@babel/core@7.22.10)(@babel/preset-env@7.22.10)(react@18.2.0) - dev: false - - /@react-spring/animated@9.7.1(react@18.2.0): - resolution: {integrity: sha512-EX5KAD9y7sD43TnLeTNG1MgUVpuRO1YaSJRPawHNRgUWYfILge3s85anny4S4eTJGpdp5OoFV2kx9fsfeo0qsw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - react: 18.2.0 - dev: false - - /@react-spring/animated@9.7.3(react@18.2.0): - resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/shared': 9.7.3(react@18.2.0) - '@react-spring/types': 9.7.3 - react: 18.2.0 - dev: false - - /@react-spring/core@9.7.1(react@18.2.0): - resolution: {integrity: sha512-8K9/FaRn5VvMa24mbwYxwkALnAAyMRdmQXrARZLcBW2vxLJ6uw9Cy3d06Z8M12kEqF2bDlccaCSDsn2bSz+Q4A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/animated': 9.7.1(react@18.2.0) - '@react-spring/rafz': 9.7.1 - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - react: 18.2.0 - dev: false - - /@react-spring/core@9.7.3(react@18.2.0): - resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/animated': 9.7.3(react@18.2.0) - '@react-spring/shared': 9.7.3(react@18.2.0) - '@react-spring/types': 9.7.3 - react: 18.2.0 - dev: false - - /@react-spring/konva@9.7.1(konva@9.2.0)(react-konva@18.2.10)(react@18.2.0): - resolution: {integrity: sha512-74svXHtUJi6Tvk9mNLUV1/1WfU8MdWsTK6JUpvmJr/rUr8r3FdOokk22icbgEg6AjxCkIf5e2WFovCCHUSyS0w==} - peerDependencies: - konva: '>=2.6' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-konva: ^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0 - dependencies: - '@react-spring/animated': 9.7.1(react@18.2.0) - '@react-spring/core': 9.7.1(react@18.2.0) - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - konva: 9.2.0 - react: 18.2.0 - react-konva: 18.2.10(konva@9.2.0)(react-dom@18.2.0)(react@18.2.0) - dev: false - - /@react-spring/native@9.7.1(react-native@0.72.4)(react@18.2.0): - resolution: {integrity: sha512-dHWeH0UuE+Rxc3YZFLp8Aq0RBP07sdOgI7pLVG46OzkMRs2RtJeWJxB6UXIWAgcYDqWDk2REAPhLD3ItDl0tDQ==} - peerDependencies: - react: ^16.8.0 || >=17.0.0 || >=18.0.0 - react-native: '>=0.58' - dependencies: - '@react-spring/animated': 9.7.1(react@18.2.0) - '@react-spring/core': 9.7.1(react@18.2.0) - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - react: 18.2.0 - react-native: 0.72.4(@babel/core@7.22.10)(@babel/preset-env@7.22.10)(react@18.2.0) - dev: false - - /@react-spring/rafz@9.7.1: - resolution: {integrity: sha512-JSsrRfbEJvuE3w/uvU3mCTuWwpQcBXkwoW14lBgzK9XJhuxmscGo59AgJUpFkGOiGAVXFBGB+nEXtSinFsopgw==} - dev: false - - /@react-spring/shared@9.7.1(react@18.2.0): - resolution: {integrity: sha512-R2kZ+VOO6IBeIAYTIA3C1XZ0ZVg/dDP5FKtWaY8k5akMer9iqf5H9BU0jyt3Qtxn0qQY7whQdf6MTcWtKeaawg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/rafz': 9.7.1 - '@react-spring/types': 9.7.1 - react: 18.2.0 - dev: false - - /@react-spring/shared@9.7.3(react@18.2.0): - resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/types': 9.7.3 - react: 18.2.0 - dev: false - - /@react-spring/three@9.7.1(@react-three/fiber@8.13.6)(react@18.2.0)(three@0.155.0): - resolution: {integrity: sha512-5leUe0PDwIIw1M3GN3788zwTY4Ykyy+kNvQmg9+Hqs1DN3T8J1ovRTGwqWfGAu4ApTta9p5BH7SWNxxt3NO59Q==} - peerDependencies: - '@react-three/fiber': '>=6.0' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - three: '>=0.126' - dependencies: - '@react-spring/animated': 9.7.1(react@18.2.0) - '@react-spring/core': 9.7.1(react@18.2.0) - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - '@react-three/fiber': 8.13.6(react-dom@18.2.0)(react-native@0.72.4)(react@18.2.0)(three@0.155.0) - react: 18.2.0 - three: 0.155.0 - dev: false - - /@react-spring/types@9.7.1: - resolution: {integrity: sha512-yBcyfKUeZv9wf/ZFrQszvhSPuDx6Py6yMJzpMnS+zxcZmhXPeOCKZSHwqrUz1WxvuRckUhlgb7eNI/x5e1e8CA==} - dev: false - - /@react-spring/types@9.7.3: - resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} - dev: false - - /@react-spring/web@9.7.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6uUE5MyKqdrJnIJqlDN/AXf3i8PjOQzUuT26nkpsYxUGOk7c+vZVPcfrExLSoKzTb9kF0i66DcqzO5fXz/Z1AA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/animated': 9.7.1(react@18.2.0) - '@react-spring/core': 9.7.1(react@18.2.0) - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@react-spring/web@9.7.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/animated': 9.7.3(react@18.2.0) - '@react-spring/core': 9.7.3(react@18.2.0) - '@react-spring/shared': 9.7.3(react@18.2.0) - '@react-spring/types': 9.7.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@react-spring/zdog@9.7.1(react-dom@18.2.0)(react-zdog@1.2.1)(react@18.2.0)(zdog@1.1.3): - resolution: {integrity: sha512-FeDws+7ZSoi91TUjxKnq3xmdOW6fthmqky6zSPIZq1NomeyO7+xwbxjtu15IqoWG4DJ9pouVZDijvBQXUNl0Mw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-zdog: '>=1.0' - zdog: '>=1.0' - dependencies: - '@react-spring/animated': 9.7.1(react@18.2.0) - '@react-spring/core': 9.7.1(react@18.2.0) - '@react-spring/shared': 9.7.1(react@18.2.0) - '@react-spring/types': 9.7.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-zdog: 1.2.1(react-dom@18.2.0)(react@18.2.0)(zdog@1.1.3) - zdog: 1.1.3 - dev: false - - /@react-three/fiber@8.13.6(react-dom@18.2.0)(react-native@0.72.4)(react@18.2.0)(three@0.155.0): - resolution: {integrity: sha512-V49lldHcbsC7PMnnf4aYrMpHPQe8R7hJYL0AEFjqwioY0nkwga9A+Jx6lCLVG02DF03xwCfJZv5cjZCChffsWg==} - peerDependencies: - expo: '>=43.0' - expo-asset: '>=8.4' - expo-gl: '>=11.0' - react: '>=18.0' - react-dom: '>=18.0' - react-native: '>=0.64' - three: '>=0.133' - peerDependenciesMeta: - expo: - optional: true - expo-asset: - optional: true - expo-gl: - optional: true - react-dom: - optional: true - react-native: - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react-reconciler': 0.26.7 - its-fine: 1.1.1(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-native: 0.72.4(@babel/core@7.22.10)(@babel/preset-env@7.22.10)(react@18.2.0) - react-reconciler: 0.27.0(react@18.2.0) - react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) - scheduler: 0.21.0 - suspend-react: 0.1.3(react@18.2.0) - three: 0.155.0 - zustand: 3.7.2(react@18.2.0) - dev: false - - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: false - - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - dev: false - - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: false - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: false - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: false - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: false - - /@swc/helpers@0.4.14: - resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} - dependencies: - tslib: 2.5.0 - dev: false - - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - dependencies: - '@types/ms': 0.7.31 - dev: false - - /@types/estree-jsx@1.0.0: - resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /@types/estree@1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: false - - /@types/hast@2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: false - - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: false - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: false - - /@types/js-yaml@4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: false - - /@types/katex@0.11.1: - resolution: {integrity: sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==} - dev: false - - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false - - /@types/mdast@3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /@types/mdx@2.0.3: - resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==} - dev: false - - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: false - - /@types/node@10.12.18: - resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} - dev: false - - /@types/node@18.13.0: - resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} - - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false - - /@types/react-reconciler@0.26.7: - resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} - dependencies: - '@types/react': 18.0.28 - dev: false - - /@types/react-reconciler@0.28.2: - resolution: {integrity: sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw==} - dependencies: - '@types/react': 18.0.28 - dev: false - - /@types/react@18.0.28: - resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - dev: false - - /@types/scheduler@0.16.2: - resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - dev: false - - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: false - - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: false - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: false - - /@types/yargs@15.0.15: - resolution: {integrity: sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: false - - /@types/yargs@16.0.5: - resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: false - - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: false - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: false - - /acorn-jsx@5.3.2(acorn@8.8.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.2 - dev: false - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /anser@1.4.10: - resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} - dev: false - - /ansi-fragments@0.2.1: - resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} - dependencies: - colorette: 1.4.0 - slice-ansi: 2.1.0 - strip-ansi: 5.2.0 - dev: false - - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false - - /ansi-sequence-parser@1.1.0: - resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} - dev: false - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: false - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - - /appdirsjs@1.2.7: - resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} - dev: false - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false - - /arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - dev: false - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false - - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - dev: false - - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: false - - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false - - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} - dependencies: - tslib: 2.5.0 - dev: false - - /astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - dev: false - - /astring@1.8.4: - resolution: {integrity: sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==} - hasBin: true - dev: false - - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: false - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: false - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - transitivePeerDependencies: - - debug - dev: false - - /babel-core@7.0.0-bridge.0(@babel/core@7.22.10): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - dev: false - - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.10): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.10) - core-js-compat: 3.32.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.10): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.10) - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-styled-components@2.0.7(styled-components@5.3.8): - resolution: {integrity: sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==} - peerDependencies: - styled-components: '>= 2' - dependencies: - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 - babel-plugin-syntax-jsx: 6.18.0 - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.8(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - dev: false - - /babel-plugin-syntax-jsx@6.18.0: - resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} - dev: false - - /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: - resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - dev: false - - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.22.10): - resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} - dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) - transitivePeerDependencies: - - '@babel/core' - dev: false - - /babel-preset-fbjs@3.4.0(@babel/core@7.22.10): - resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.10) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.10) - babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - dev: false - - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - dev: false - - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: false - - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bip32@2.0.6: - resolution: {integrity: sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==} - engines: {node: '>=6.0.0'} - dependencies: - '@types/node': 10.12.18 - bs58check: 2.1.2 - create-hash: 1.2.0 - create-hmac: 1.1.7 - tiny-secp256k1: 1.1.6 - typeforce: 1.18.0 - wif: 2.0.6 - dev: false - - /bip39@3.1.0: - resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} - dependencies: - '@noble/hashes': 1.2.0 - dev: false - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.1 - dev: false - - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: false - - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: false - - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: false - - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001520 - electron-to-chromium: 1.4.492 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: false - - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - dependencies: - base-x: 3.0.9 - dev: false - - /bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - dev: false - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: false - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: false - - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 - dev: false - - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 - dev: false - - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - dev: false - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: false - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: false - - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false - - /caniuse-lite@1.0.30001460: - resolution: {integrity: sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==} - dev: false - - /caniuse-lite@1.0.30001520: - resolution: {integrity: sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==} - dev: false - - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false - - /chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 4.5.0 - dev: false - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false - - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: false - - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false - - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: false - - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false - - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: false - - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: false - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: false - - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: false - - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: false - - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - dev: false - - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false - - /clipboard@2.0.11: - resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} - requiresBuild: true - dependencies: - good-listener: 1.2.2 - select: 1.1.2 - tiny-emitter: 2.1.0 - dev: false - optional: true - - /clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} - dependencies: - arch: 2.2.0 - execa: 0.8.0 - dev: false - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: false - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: false - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: false - - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false - - /cobe@0.6.3: - resolution: {integrity: sha512-WHr7X4o1ym94GZ96h7b1pNemZJacbOzd02dZtnVwuC4oWBaLg96PBmp2rIS1SAhUDhhC/QyS9WEqkpZIs/ZBTg==} - dependencies: - phenomenon: 1.6.0 - dev: false - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - - /colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - dev: false - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - dev: false - - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false - - /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - dev: false - - /commander@2.13.0: - resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} - dev: false - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false - - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: false - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: false - - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /compute-scroll-into-view@3.0.0: - resolution: {integrity: sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ==} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false - - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - - /core-js-compat@3.32.0: - resolution: {integrity: sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==} - dependencies: - browserslist: 4.21.10 - dev: false - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - dev: false - - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - dev: false - - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: false - - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: false - - /crypto-js@4.1.1: - resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} - dev: false - - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false - - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - dev: false - - /csstype@3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: false - - /dayjs@1.11.9: - resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} - dev: false - - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: false - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - - /debug@4.3.4(supports-color@5.5.0): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 5.5.0 - dev: false - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: false - - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: false - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: false - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: false - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: false - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: false - - /delay@4.4.1: - resolution: {integrity: sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==} - engines: {node: '>=6'} - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /delegate@3.2.0: - resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} - requiresBuild: true - dev: false - optional: true - - /denodeify@1.2.1: - resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} - dev: false - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false - - /deprecated-react-native-prop-types@4.1.0: - resolution: {integrity: sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==} - dependencies: - '@react-native/normalize-colors': 0.72.0 - invariant: 2.2.4 - prop-types: 15.8.1 - dev: false - - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: false - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: false - - /electron-to-chromium@1.4.492: - resolution: {integrity: sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==} - dev: false - - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: false - - /email-addresses@5.0.0: - resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /envinfo@7.10.0: - resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: false - - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 - dev: false - - /errorhandler@1.5.1: - resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.3.8 - escape-html: 1.0.3 - dev: false - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: false - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: false - - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} - dependencies: - '@types/estree-jsx': 1.0.0 - estree-util-is-identifier-name: 2.1.0 - estree-walker: 3.0.3 - dev: false - - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - dev: false - - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} - dependencies: - '@types/estree-jsx': 1.0.0 - astring: 1.8.4 - source-map: 0.7.4 - dev: false - - /estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - dependencies: - is-plain-obj: 3.0.0 - dev: false - - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/unist': 2.0.6 - dev: false - - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: false - - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: false - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - - /execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false - - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: false - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /fast-xml-parser@4.2.7: - resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - - /fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - dependencies: - format: 0.2.2 - dev: false - - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: false - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false - - /filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} - dev: false - - /filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} - dependencies: - filename-reserved-regex: 2.0.0 - strip-outer: 1.0.1 - trim-repeated: 1.0.0 - dev: false - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: false - - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - dev: false - - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: false - - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - dev: false - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: false - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: false - - /flexsearch@0.7.31: - resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} - dev: false - - /flow-enums-runtime@0.0.5: - resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} - dev: false - - /flow-parser@0.206.0: - resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} - engines: {node: '>=0.4.0'} - dev: false - - /focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - dev: false - - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: false - - /framer-motion@10.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1k8y1e6DMRQ/r6or4TBxRhE1cXlDE5bm+SFeWLeh7ng0sfSbpROC2Qd1OEHq6lLXNARar/KKoj/EQ6eIvn60Uw==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.5.0 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - dev: false - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: false - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: false - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: false - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: false - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false - - /gh-pages@5.0.0: - resolution: {integrity: sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 3.2.4 - commander: 2.20.3 - email-addresses: 5.0.0 - filenamify: 4.3.0 - find-cache-dir: 3.3.2 - fs-extra: 8.1.0 - globby: 6.1.0 - dev: false - - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: false - - /git-url-parse@13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} - dependencies: - git-up: 7.0.0 - dev: false - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false - - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false - - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: false - - /good-listener@1.2.2: - resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} - requiresBuild: true - dependencies: - delegate: 3.2.0 - dev: false - optional: true - - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: false - - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - dev: false - - /has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - dev: false - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: false - - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.1 - safe-buffer: 5.2.1 - dev: false - - /hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - dependencies: - is-obj: 3.0.0 - sort-keys: 5.0.0 - type-fest: 1.4.0 - dev: false - - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: false - - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} - dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - hastscript: 7.2.0 - property-information: 6.2.0 - vfile: 5.3.7 - vfile-location: 4.1.0 - web-namespaces: 2.0.1 - dev: false - - /hast-util-is-element@2.1.3: - resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} - dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - dev: false - - /hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - dev: false - - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} - dependencies: - '@types/hast': 2.3.4 - dev: false - - /hast-util-to-estree@2.3.2: - resolution: {integrity: sha512-YYDwATNdnvZi3Qi84iatPIl1lWpXba1MeNrNbDfJfVzEBZL8uUmtR7mt7bxKBC8kuAuvb0bkojXYZzsNHyHCLg==} - dependencies: - '@types/estree': 1.0.0 - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.1 - unist-util-position: 4.0.4 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /hast-util-to-text@3.1.2: - resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} - dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - hast-util-is-element: 2.1.3 - unist-util-find-after: 4.0.1 - dev: false - - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false - - /hastscript@5.1.2: - resolution: {integrity: sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==} - dependencies: - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - dev: false - - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - dependencies: - '@types/hast': 2.3.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - dev: false - - /hermes-estree@0.12.0: - resolution: {integrity: sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==} - dev: false - - /hermes-parser@0.12.0: - resolution: {integrity: sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==} - dependencies: - hermes-estree: 0.12.0 - dev: false - - /hermes-profile-transformer@0.0.6: - resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} - engines: {node: '>=8'} - dependencies: - source-map: 0.7.4 - dev: false - - /highlight.js@11.7.0: - resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} - engines: {node: '>=12.0.0'} - dev: false - - /highlight.js@9.15.10: - resolution: {integrity: sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==} - deprecated: Version no longer supported. Upgrade to @latest - dev: false - - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: false - - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /image-size@1.0.2: - resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - queue: 6.0.2 - dev: false - - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 - dev: false - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: false - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: false - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false - - /intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - dev: false - - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: false - - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: false - - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: false - - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - dev: false - - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: false - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false - - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.3 - dev: false - - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: false - - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: false - - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - dev: false - - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: false - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false - - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: false - - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: false - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: false - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false - - /is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - dev: false - - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: false - - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: false - - /is-reference@3.0.1: - resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - dependencies: - protocols: 2.0.1 - dev: false - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: false - - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: false - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: false - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: false - - /its-fine@1.1.1(react@18.2.0): - resolution: {integrity: sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==} - peerDependencies: - react: '>=18.0' - dependencies: - '@types/react-reconciler': 0.28.2 - react: 18.2.0 - dev: false - - /jest-environment-node@29.6.2: - resolution: {integrity: sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.2 - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 18.13.0 - jest-mock: 29.6.2 - jest-util: 29.6.2 - dev: false - - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: false - - /jest-message-util@29.6.2: - resolution: {integrity: sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.6.2 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: false - - /jest-mock@29.6.2: - resolution: {integrity: sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 18.13.0 - jest-util: 29.6.2 - dev: false - - /jest-regex-util@27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false - - /jest-util@27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.13.0 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: false - - /jest-util@29.6.2: - resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 18.13.0 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: false - - /jest-validate@29.6.2: - resolution: {integrity: sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.6.2 - dev: false - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 18.13.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: false - - /joi@17.9.2: - resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - dev: false - - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: false - - /jsc-android@250231.0.0: - resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} - dev: false - - /jsc-safe-url@0.2.4: - resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - dev: false - - /jscodeshift@0.14.0(@babel/preset-env@7.22.10): - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - dependencies: - '@babel/core': 7.22.10 - '@babel/parser': 7.23.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) - '@babel/preset-env': 7.22.10(@babel/core@7.22.10) - '@babel/preset-flow': 7.22.5(@babel/core@7.22.10) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.10) - '@babel/register': 7.22.5(@babel/core@7.22.10) - babel-core: 7.0.0-bridge.0(@babel/core@7.22.10) - chalk: 4.1.2 - flow-parser: 0.206.0 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.21.5 - temp: 0.8.4 - write-file-atomic: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: false - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: false - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.10 - dev: false - - /katex@0.13.24: - resolution: {integrity: sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - - /katex@0.15.6: - resolution: {integrity: sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - - /katex@0.16.4: - resolution: {integrity: sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: false - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: false - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false - - /konva@9.2.0: - resolution: {integrity: sha512-+woI76Sk+VFVl9z7zPkuTnN2zFpEYg27YWz8BCdQXpt5IS3pdnSPAPQVPPMidcbDi9/G5b/IOIp35/KqMGiYPA==} - dev: false - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: false - - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: false - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: false - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: false - - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false - - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: false - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: false - - /logkitty@0.7.1: - resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} - hasBin: true - dependencies: - ansi-fragments: 0.2.1 - dayjs: 1.11.9 - yargs: 15.4.1 - dev: false - - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lowlight@1.12.1: - resolution: {integrity: sha512-OqaVxMGIESnawn+TU/QMV5BJLbUghUfjDWPAtFqDYDmDtr4FnB+op8xM+pR7nKlauHNUHXGt0VgWatFB8voS5w==} - dependencies: - fault: 1.0.4 - highlight.js: 9.15.10 - dev: false - - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: false - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: false - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: false - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: false - - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - dev: false - - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false - - /match-sorter@6.3.1: - resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} - dependencies: - '@babel/runtime': 7.21.0 - remove-accents: 0.4.2 - dev: false - - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.10 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /mdast-util-from-markdown@1.3.0: - resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.1.1 - micromark: 3.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-decode-string: 1.0.2 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - dependencies: - '@types/mdast': 3.0.10 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.1.0 - dev: false - - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.0.0 - dev: false - - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.5.0 - dev: false - - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - dependencies: - '@types/mdast': 3.0.10 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.5.0 - dev: false - - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - dependencies: - mdast-util-from-markdown: 1.3.0 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - dependencies: - '@types/mdast': 3.0.10 - longest-streak: 3.1.0 - mdast-util-to-markdown: 1.5.0 - dev: false - - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-mdx-jsx@2.1.2: - resolution: {integrity: sha512-o9vBCYQK5ZLGEj3tCGISJGjvafyHRVJlZmfJzSE7xjiogSzIeph/Z4zMY65q4WGRMezQBeAwPlrdymDYYYx0tA==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - ccount: 2.0.1 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} - dependencies: - mdast-util-from-markdown: 1.3.0 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.2 - mdast-util-mdxjs-esm: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - dependencies: - '@types/mdast': 3.0.10 - unist-util-is: 5.2.1 - dev: false - - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.1.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.1.1 - micromark-util-decode-string: 1.0.2 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-string@3.1.1: - resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==} - dependencies: - '@types/mdast': 3.0.10 - dev: false - - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - - /metro-babel-transformer@0.76.7: - resolution: {integrity: sha512-bgr2OFn0J4r0qoZcHrwEvccF7g9k3wdgTOgk6gmGHrtlZ1Jn3oCpklW/DfZ9PzHfjY2mQammKTc19g/EFGyOJw==} - engines: {node: '>=16'} - dependencies: - '@babel/core': 7.22.10 - hermes-parser: 0.12.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-cache-key@0.76.7: - resolution: {integrity: sha512-0pecoIzwsD/Whn/Qfa+SDMX2YyasV0ndbcgUFx7w1Ct2sLHClujdhQ4ik6mvQmsaOcnGkIyN0zcceMDjC2+BFQ==} - engines: {node: '>=16'} - dev: false - - /metro-cache@0.76.7: - resolution: {integrity: sha512-nWBMztrs5RuSxZRI7hgFgob5PhYDmxICh9FF8anm9/ito0u0vpPvRxt7sRu8fyeD2AHdXqE7kX32rWY0LiXgeg==} - engines: {node: '>=16'} - dependencies: - metro-core: 0.76.7 - rimraf: 3.0.2 - dev: false - - /metro-config@0.76.7: - resolution: {integrity: sha512-CFDyNb9bqxZemiChC/gNdXZ7OQkIwmXzkrEXivcXGbgzlt/b2juCv555GWJHyZSlorwnwJfY3uzAFu4A9iRVfg==} - engines: {node: '>=16'} - dependencies: - connect: 3.7.0 - cosmiconfig: 5.2.1 - jest-validate: 29.6.2 - metro: 0.76.7 - metro-cache: 0.76.7 - metro-core: 0.76.7 - metro-runtime: 0.76.7 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /metro-core@0.76.7: - resolution: {integrity: sha512-0b8KfrwPmwCMW+1V7ZQPkTy2tsEKZjYG9Pu1PTsu463Z9fxX7WaR0fcHFshv+J1CnQSUTwIGGjbNvj1teKe+pw==} - engines: {node: '>=16'} - dependencies: - lodash.throttle: 4.1.1 - metro-resolver: 0.76.7 - dev: false - - /metro-file-map@0.76.7: - resolution: {integrity: sha512-s+zEkTcJ4mOJTgEE2ht4jIo1DZfeWreQR3tpT3gDV/Y/0UQ8aJBTv62dE775z0GLsWZApiblAYZsj7ZE8P06nw==} - engines: {node: '>=16'} - dependencies: - anymatch: 3.1.3 - debug: 2.6.9 - fb-watchman: 2.0.2 - graceful-fs: 4.2.10 - invariant: 2.2.4 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - micromatch: 4.0.5 - node-abort-controller: 3.1.1 - nullthrows: 1.1.1 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-inspector-proxy@0.76.7: - resolution: {integrity: sha512-rNZ/6edTl/1qUekAhAbaFjczMphM50/UjtxiKulo6vqvgn/Mjd9hVqDvVYfAMZXqPvlusD88n38UjVYPkruLSg==} - engines: {node: '>=16'} - hasBin: true - dependencies: - connect: 3.7.0 - debug: 2.6.9 - node-fetch: 2.6.12 - ws: 7.5.9 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /metro-minify-terser@0.76.7: - resolution: {integrity: sha512-FQiZGhIxCzhDwK4LxyPMLlq0Tsmla10X7BfNGlYFK0A5IsaVKNJbETyTzhpIwc+YFRT4GkFFwgo0V2N5vxO5HA==} - engines: {node: '>=16'} - dependencies: - terser: 5.19.2 - dev: false - - /metro-minify-uglify@0.76.7: - resolution: {integrity: sha512-FuXIU3j2uNcSvQtPrAJjYWHruPiQ+EpE++J9Z+VznQKEHcIxMMoQZAfIF2IpZSrZYfLOjVFyGMvj41jQMxV1Vw==} - engines: {node: '>=16'} - dependencies: - uglify-es: 3.3.9 - dev: false - - /metro-react-native-babel-preset@0.76.7(@babel/core@7.22.10): - resolution: {integrity: sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw==} - engines: {node: '>=16'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.10) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-export-default-from': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.10) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.10) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-runtime': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-typescript': 7.22.10(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.10) - '@babel/template': 7.22.15 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.22.10) - react-refresh: 0.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-react-native-babel-transformer@0.76.7(@babel/core@7.22.10): - resolution: {integrity: sha512-W6lW3J7y/05ph3c2p3KKJNhH0IdyxdOCbQ5it7aM2MAl0SM4wgKjaV6EYv9b3rHklpV6K3qMH37UKVcjMooWiA==} - engines: {node: '>=16'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.22.10 - babel-preset-fbjs: 3.4.0(@babel/core@7.22.10) - hermes-parser: 0.12.0 - metro-react-native-babel-preset: 0.76.7(@babel/core@7.22.10) - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-resolver@0.76.7: - resolution: {integrity: sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA==} - engines: {node: '>=16'} - dev: false - - /metro-runtime@0.76.7: - resolution: {integrity: sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==} - engines: {node: '>=16'} - dependencies: - '@babel/runtime': 7.21.0 - react-refresh: 0.4.3 - dev: false - - /metro-runtime@0.76.8: - resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} - engines: {node: '>=16'} - dependencies: - '@babel/runtime': 7.21.0 - react-refresh: 0.4.3 - dev: false - - /metro-source-map@0.76.7: - resolution: {integrity: sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==} - engines: {node: '>=16'} - dependencies: - '@babel/traverse': 7.23.2(supports-color@5.5.0) - '@babel/types': 7.23.0 - invariant: 2.2.4 - metro-symbolicate: 0.76.7 - nullthrows: 1.1.1 - ob1: 0.76.7 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-source-map@0.76.8: - resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} - engines: {node: '>=16'} - dependencies: - '@babel/traverse': 7.23.2(supports-color@5.5.0) - '@babel/types': 7.23.0 - invariant: 2.2.4 - metro-symbolicate: 0.76.8 - nullthrows: 1.1.1 - ob1: 0.76.8 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-symbolicate@0.76.7: - resolution: {integrity: sha512-p0zWEME5qLSL1bJb93iq+zt5fz3sfVn9xFYzca1TJIpY5MommEaS64Va87lp56O0sfEIvh4307Oaf/ZzRjuLiQ==} - engines: {node: '>=16'} - hasBin: true - dependencies: - invariant: 2.2.4 - metro-source-map: 0.76.7 - nullthrows: 1.1.1 - source-map: 0.5.7 - through2: 2.0.5 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-symbolicate@0.76.8: - resolution: {integrity: sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==} - engines: {node: '>=16'} - hasBin: true - dependencies: - invariant: 2.2.4 - metro-source-map: 0.76.8 - nullthrows: 1.1.1 - source-map: 0.5.7 - through2: 2.0.5 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-transform-plugins@0.76.7: - resolution: {integrity: sha512-iSmnjVApbdivjuzb88Orb0JHvcEt5veVyFAzxiS5h0QB+zV79w6JCSqZlHCrbNOkOKBED//LqtKbFVakxllnNg==} - engines: {node: '>=16'} - dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2(supports-color@5.5.0) - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /metro-transform-worker@0.76.7: - resolution: {integrity: sha512-cGvELqFMVk9XTC15CMVzrCzcO6sO1lURfcbgjuuPdzaWuD11eEyocvkTX0DPiRjsvgAmicz4XYxVzgYl3MykDw==} - engines: {node: '>=16'} - dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.22.10) - metro: 0.76.7 - metro-babel-transformer: 0.76.7 - metro-cache: 0.76.7 - metro-cache-key: 0.76.7 - metro-source-map: 0.76.7 - metro-transform-plugins: 0.76.7 - nullthrows: 1.1.1 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /metro@0.76.7: - resolution: {integrity: sha512-67ZGwDeumEPnrHI+pEDSKH2cx+C81Gx8Mn5qOtmGUPm/Up9Y4I1H2dJZ5n17MWzejNo0XAvPh0QL0CrlJEODVQ==} - engines: {node: '>=16'} - hasBin: true - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/core': 7.22.10 - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2(supports-color@5.5.0) - '@babel/types': 7.23.0 - accepts: 1.3.8 - async: 3.2.4 - chalk: 4.1.2 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 2.6.9 - denodeify: 1.2.1 - error-stack-parser: 2.1.4 - graceful-fs: 4.2.10 - hermes-parser: 0.12.0 - image-size: 1.0.2 - invariant: 2.2.4 - jest-worker: 27.5.1 - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.76.7 - metro-cache: 0.76.7 - metro-cache-key: 0.76.7 - metro-config: 0.76.7 - metro-core: 0.76.7 - metro-file-map: 0.76.7 - metro-inspector-proxy: 0.76.7 - metro-minify-terser: 0.76.7 - metro-minify-uglify: 0.76.7 - metro-react-native-babel-preset: 0.76.7(@babel/core@7.22.10) - metro-resolver: 0.76.7 - metro-runtime: 0.76.7 - metro-source-map: 0.76.7 - metro-symbolicate: 0.76.7 - metro-transform-plugins: 0.76.7 - metro-transform-worker: 0.76.7 - mime-types: 2.1.35 - node-fetch: 2.6.12 - nullthrows: 1.1.1 - rimraf: 3.0.2 - serialize-error: 2.1.0 - source-map: 0.5.7 - strip-ansi: 6.0.1 - throat: 5.0.0 - ws: 7.5.9 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /micromark-core-commonmark@1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.0.0 - micromark-factory-label: 1.0.2 - micromark-factory-space: 1.0.0 - micromark-factory-title: 1.0.2 - micromark-factory-whitespace: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-html-tag-name: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-footnote@1.0.4: - resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} - dependencies: - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-strikethrough@1.0.4: - resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-table@1.0.5: - resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-tagfilter@1.0.1: - resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-gfm-task-list-item@1.0.3: - resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm@2.0.1: - resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.3 - micromark-extension-gfm-footnote: 1.0.4 - micromark-extension-gfm-strikethrough: 1.0.4 - micromark-extension-gfm-table: 1.0.5 - micromark-extension-gfm-tagfilter: 1.0.1 - micromark-extension-gfm-task-list-item: 1.0.3 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-math@2.0.2: - resolution: {integrity: sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==} - dependencies: - '@types/katex': 0.11.1 - katex: 0.13.24 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-mdx-expression@1.0.4: - resolution: {integrity: sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw==} - dependencies: - micromark-factory-mdx-expression: 1.0.7 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-mdx-jsx@1.0.3: - resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} - dependencies: - '@types/acorn': 4.0.6 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.7 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false - - /micromark-extension-mdx-md@1.0.0: - resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-mdxjs-esm@1.0.3: - resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} - dependencies: - micromark-core-commonmark: 1.0.6 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false - - /micromark-extension-mdxjs@1.0.0: - resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - micromark-extension-mdx-expression: 1.0.4 - micromark-extension-mdx-jsx: 1.0.3 - micromark-extension-mdx-md: 1.0.0 - micromark-extension-mdxjs-esm: 1.0.3 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-destination@1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-label@1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-factory-mdx-expression@1.0.7: - resolution: {integrity: sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false - - /micromark-factory-space@1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-title@1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-factory-whitespace@1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-character@1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} - dependencies: - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-chunked@1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-classify-character@1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-combine-extensions@1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-decode-numeric-character-reference@1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-decode-string@1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-encode@1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} - dev: false - - /micromark-util-events-to-acorn@1.2.1: - resolution: {integrity: sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg==} - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.0 - estree-util-visit: 1.2.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - vfile-location: 4.1.0 - vfile-message: 3.1.4 - dev: false - - /micromark-util-html-tag-name@1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} - dev: false - - /micromark-util-normalize-identifier@1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-resolve-all@1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-sanitize-uri@1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-encode: 1.0.1 - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-subtokenize@1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-util-symbol@1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} - dev: false - - /micromark-util-types@1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} - dev: false - - /micromark@3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} - dependencies: - '@types/debug': 4.1.7 - debug: 4.3.4(supports-color@5.5.0) - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-combine-extensions: 1.0.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-encode: 1.0.1 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: false - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false - - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - - /nan@2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} - dev: false - - /nanoid@3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false - - /next-mdx-remote@4.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' - dependencies: - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - vfile: 5.3.7 - vfile-matter: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /next-seo@5.15.0(next@13.2.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - next: 13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /next-themes@0.2.1(next@13.2.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - dependencies: - next: 13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /next@13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==} - engines: {node: '>=14.6.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.4.0 - fibers: '>= 3.1.0' - node-sass: ^6.0.0 || ^7.0.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - dependencies: - '@next/env': 13.2.3 - '@swc/helpers': 0.4.14 - caniuse-lite: 1.0.30001460 - postcss: 8.4.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.22.10)(react@18.2.0) - optionalDependencies: - '@next/swc-android-arm-eabi': 13.2.3 - '@next/swc-android-arm64': 13.2.3 - '@next/swc-darwin-arm64': 13.2.3 - '@next/swc-darwin-x64': 13.2.3 - '@next/swc-freebsd-x64': 13.2.3 - '@next/swc-linux-arm-gnueabihf': 13.2.3 - '@next/swc-linux-arm64-gnu': 13.2.3 - '@next/swc-linux-arm64-musl': 13.2.3 - '@next/swc-linux-x64-gnu': 13.2.3 - '@next/swc-linux-x64-musl': 13.2.3 - '@next/swc-win32-arm64-msvc': 13.2.3 - '@next/swc-win32-ia32-msvc': 13.2.3 - '@next/swc-win32-x64-msvc': 13.2.3 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - - /nextra-theme-docs@2.2.17(next@13.2.3)(nextra@2.2.17)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-GTTie4YtTjiBdh3PqSYX5xtOQaCcLWoHWrubR2ikmBMq0GYxM2AX26J6O3gZ/xzzJje+vWmZGOilop/bG2RCog==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.2.17 - react: '>=16.13.1' - react-dom: '>=16.13.1' - dependencies: - '@headlessui/react': 1.7.13(react-dom@18.2.0)(react@18.2.0) - '@popperjs/core': 2.11.6 - clsx: 1.2.1 - flexsearch: 0.7.31 - focus-visible: 5.2.0 - git-url-parse: 13.1.0 - intersection-observer: 0.12.2 - match-sorter: 6.3.1 - next: 13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0) - next-seo: 5.15.0(next@13.2.3)(react-dom@18.2.0)(react@18.2.0) - next-themes: 0.2.1(next@13.2.3)(react-dom@18.2.0)(react@18.2.0) - nextra: 2.2.17(next@13.2.3)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - scroll-into-view-if-needed: 3.0.6 - zod: 3.22.3 - dev: false - - /nextra@2.2.17(next@13.2.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-IRfvDfUut6YgbivBVP8cG2DkxEBvODWQFiv7rqHD1tR9lBjiDKugyCi64zl1CiOlW5awc8xmbPDrzYak9l+A/w==} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' - dependencies: - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@napi-rs/simple-git': 0.1.8 - github-slugger: 2.0.0 - graceful-fs: 4.2.10 - gray-matter: 4.0.3 - katex: 0.16.4 - lodash.get: 4.4.2 - next: 13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0) - next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) - p-limit: 3.1.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rehype-katex: 6.0.2 - rehype-pretty-code: 0.9.3(shiki@0.14.1) - remark-gfm: 3.0.1 - remark-math: 5.1.1 - remark-reading-time: 2.0.1 - shiki: 0.14.1 - slash: 3.0.0 - title: 3.5.3 - unist-util-remove: 3.1.1 - unist-util-visit: 4.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /nocache@3.0.4: - resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} - engines: {node: '>=12.0.0'} - dev: false - - /node-abi@3.46.0: - resolution: {integrity: sha512-LXvP3AqTIrtvH/jllXjkNVbYifpRbt9ThTtymSMSuHmhugQLAWr99QQFTm+ZRht9ziUvdGOgB+esme1C6iE6Lg==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: false - - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: false - - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} - dependencies: - minimatch: 3.1.2 - dev: false - - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: false - - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: false - - /node-stream-zip@1.15.0: - resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} - engines: {node: '>=0.12.0'} - dev: false - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false - - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: false - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: false - - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: false - - /ob1@0.76.7: - resolution: {integrity: sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==} - engines: {node: '>=16'} - dev: false - - /ob1@0.76.8: - resolution: {integrity: sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==} - engines: {node: '>=16'} - dev: false - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: false - - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: false - - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: false - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: false - - /open@6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} - dependencies: - is-wsl: 1.1.0 - dev: false - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: false - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: false - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: false - - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 - dev: false - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: false - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: false - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: false - - /parse-entities@1.2.2: - resolution: {integrity: sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==} - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - dev: false - - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - dependencies: - '@types/unist': 2.0.6 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: false - - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: false - - /parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - dev: false - - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - dependencies: - protocols: 2.0.1 - dev: false - - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - dependencies: - parse-path: 7.0.0 - dev: false - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: false - - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: false - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: false - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false - - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - dependencies: - '@types/estree': 1.0.0 - estree-walker: 3.0.3 - is-reference: 3.0.1 - dev: false - - /phenomenon@1.6.0: - resolution: {integrity: sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==} - dev: false - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: false - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: false - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false - - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - dev: false - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: false - - /pointer-events-polyfill@0.4.4-pre: - resolution: {integrity: sha512-t7iitVY5jW9mGOFZEHphJOzB8eMhoYaE6I5HqsUX14rjsPa9F6OlMOCj3EpqDzNb/8XtMk2BxMpOyePPyuefHw==} - dev: false - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false - - /postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.46.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - - /pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} - dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 - dev: false - - /pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: false - - /prismjs@1.17.1: - resolution: {integrity: sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==} - optionalDependencies: - clipboard: 2.0.11 - dev: false - - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: false - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false - - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - dependencies: - asap: 2.0.6 - dev: false - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: false - - /property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - dependencies: - xtend: 4.0.2 - dev: false - - /property-information@6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - dev: false - - /protobufjs@6.11.4: - resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} - hasBin: true - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/long': 4.0.2 - '@types/node': 18.13.0 - long: 4.0.0 - dev: false - - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: false - - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - - /queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - dependencies: - inherits: 2.0.4 - dev: false - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: false - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /react-code-blocks@0.0.9-0(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-jdYJVZwGtsr6WIUaqILy5fkF1acf57YV5s0V3+w5o9v3omYnqBeO6EuZi1Vf2x1hahkYGEedsp46+ofdkYlqyw==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16' - dependencies: - '@babel/runtime': 7.21.0 - react: 18.2.0 - react-syntax-highlighter: 12.2.1(react@18.2.0) - styled-components: 5.3.8(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - tslib: 2.5.0 - transitivePeerDependencies: - - react-dom - - react-is - dev: false - - /react-devtools-core@4.28.0: - resolution: {integrity: sha512-E3C3X1skWBdBzwpOUbmXG8SgH6BtsluSMe+s6rRcujNKG1DGi8uIfhdhszkgDpAsMoE55hwqRUzeXCmETDBpTg==} - dependencies: - shell-quote: 1.8.1 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false - - /react-konva@18.2.10(konva@9.2.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==} - peerDependencies: - konva: ^8.0.1 || ^7.2.5 || ^9.0.0 - react: '>=18.0.0' - react-dom: '>=18.0.0' - dependencies: - '@types/react-reconciler': 0.28.2 - its-fine: 1.1.1(react@18.2.0) - konva: 9.2.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-reconciler: 0.29.0(react@18.2.0) - scheduler: 0.23.0 - dev: false - - /react-native@0.72.4(@babel/core@7.22.10)(@babel/preset-env@7.22.10)(react@18.2.0): - resolution: {integrity: sha512-+vrObi0wZR+NeqL09KihAAdVlQ9IdplwznJWtYrjnQ4UbCW6rkzZJebRsugwUneSOKNFaHFEo1uKU89HsgtYBg==} - engines: {node: '>=16'} - hasBin: true - peerDependencies: - react: 18.2.0 - dependencies: - '@jest/create-cache-key-function': 29.6.2 - '@react-native-community/cli': 11.3.6(@babel/core@7.22.10) - '@react-native-community/cli-platform-android': 11.3.6 - '@react-native-community/cli-platform-ios': 11.3.6 - '@react-native/assets-registry': 0.72.0 - '@react-native/codegen': 0.72.6(@babel/preset-env@7.22.10) - '@react-native/gradle-plugin': 0.72.11 - '@react-native/js-polyfills': 0.72.1 - '@react-native/normalize-colors': 0.72.0 - '@react-native/virtualized-lists': 0.72.8(react-native@0.72.4) - abort-controller: 3.0.0 - anser: 1.4.10 - base64-js: 1.5.1 - deprecated-react-native-prop-types: 4.1.0 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.5 - invariant: 2.2.4 - jest-environment-node: 29.6.2 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.76.8 - metro-source-map: 0.76.8 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.2.0 - react-devtools-core: 4.28.0 - react-refresh: 0.4.3 - react-shallow-renderer: 16.15.0(react@18.2.0) - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 - use-sync-external-store: 1.2.0(react@18.2.0) - whatwg-fetch: 3.6.17 - ws: 6.2.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /react-prism@4.3.2(prop-types@15.8.1)(react@18.2.0): - resolution: {integrity: sha512-Z8BzDfWxzhngDtnZFjYj4RgHo7uqiWB4cOCpp//GFEpWbtINbCqHLIpL+q/f8ah5Aokw/uXkBkoLgvYIGgtm4A==} - peerDependencies: - prop-types: ^15.5.0 - react: ^15.5.0 || ^16.0.0 - dependencies: - prop-types: 15.8.1 - react: 18.2.0 - dev: false - - /react-reconciler@0.20.4(react@18.2.0): - resolution: {integrity: sha512-kxERc4H32zV2lXMg/iMiwQHOtyqf15qojvkcZ5Ja2CPkjVohHw9k70pdDBwrnQhLVetUJBSYyqU3yqrlVTOajA==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^16.0.0 - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - prop-types: 15.8.1 - react: 18.2.0 - scheduler: 0.13.6 - dev: false - - /react-reconciler@0.27.0(react@18.2.0): - resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.0.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.21.0 - dev: false - - /react-reconciler@0.29.0(react@18.2.0): - resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react-refresh@0.4.3: - resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} - engines: {node: '>=0.10.0'} - dev: false - - /react-shallow-renderer@16.15.0(react@18.2.0): - resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - object-assign: 4.1.1 - react: 18.2.0 - react-is: 18.2.0 - dev: false - - /react-spring@9.7.1(@react-three/fiber@8.13.6)(konva@9.2.0)(react-dom@18.2.0)(react-konva@18.2.10)(react-native@0.72.4)(react-zdog@1.2.1)(react@18.2.0)(three@0.155.0)(zdog@1.1.3): - resolution: {integrity: sha512-o2+r2DNQDVEuefiz33ZF76DPd/gLq3kbdObJmllGF2IUfv2W6x+ZP0gR97QYCSR4QLbmOl1mPKUBbI+FJdys2Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@react-spring/core': 9.7.1(react@18.2.0) - '@react-spring/konva': 9.7.1(konva@9.2.0)(react-konva@18.2.10)(react@18.2.0) - '@react-spring/native': 9.7.1(react-native@0.72.4)(react@18.2.0) - '@react-spring/three': 9.7.1(@react-three/fiber@8.13.6)(react@18.2.0)(three@0.155.0) - '@react-spring/web': 9.7.1(react-dom@18.2.0)(react@18.2.0) - '@react-spring/zdog': 9.7.1(react-dom@18.2.0)(react-zdog@1.2.1)(react@18.2.0)(zdog@1.1.3) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@react-three/fiber' - - konva - - react-konva - - react-native - - react-zdog - - three - - zdog - dev: false - - /react-syntax-highlighter@12.2.1(react@18.2.0): - resolution: {integrity: sha512-CTsp0ZWijwKRYFg9xhkWD4DSpQqE4vb2NKVMdPAkomnILSmsNBHE0n5GuI5zB+PU3ySVvXvdt9jo+ViD9XibCA==} - peerDependencies: - react: '>= 0.14.0' - dependencies: - '@babel/runtime': 7.21.0 - highlight.js: 9.15.10 - lowlight: 1.12.1 - prismjs: 1.29.0 - react: 18.2.0 - refractor: 2.10.1 - dev: false - - /react-text-transition@3.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NtXEVAXvSh78+8JAnrVjpbftzD4kPowacv4GB2Nyq9C/8ko6fSm6M/XvKWQLCaZi68i9F28b++Sp8uVThlzLyg==} - peerDependencies: - react: '>=18.0.0' - dependencies: - '@react-spring/web': 9.7.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - dev: false - - /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} - peerDependencies: - react: '>=16.13' - react-dom: '>=16.13' - dependencies: - debounce: 1.2.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /react-zdog@1.2.1(react-dom@18.2.0)(react@18.2.0)(zdog@1.1.3): - resolution: {integrity: sha512-dY5u6v64SsXUlsjCQKCF0Bnly2XJuUOG+yigN+7nCwAGoWKAdB4OoBpxa4X4ee7NVnpXWXdas41AZiLiA5u2yw==} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - zdog: '>=1.1' - dependencies: - '@babel/runtime': 7.21.0 - lodash-es: 4.17.21 - pointer-events-polyfill: 0.4.4-pre - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-reconciler: 0.20.4(react@18.2.0) - resize-observer-polyfill: 1.5.1 - scheduler: 0.13.3 - zdog: 1.1.3 - dev: false - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - - /readable-stream@3.6.1: - resolution: {integrity: sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - dev: false - - /readline@1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - dev: false - - /recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} - dependencies: - ast-types: 0.15.2 - esprima: 4.0.1 - source-map: 0.6.1 - tslib: 2.5.0 - dev: false - - /refractor@2.10.1: - resolution: {integrity: sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw==} - dependencies: - hastscript: 5.1.2 - parse-entities: 1.2.2 - prismjs: 1.17.1 - dev: false - - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - dev: false - - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: false - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false - - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.21.0 - dev: false - - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: false - - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: false - - /rehype-katex@6.0.2: - resolution: {integrity: sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg==} - dependencies: - '@types/hast': 2.3.4 - '@types/katex': 0.11.1 - hast-util-to-text: 3.1.2 - katex: 0.15.6 - rehype-parse: 8.0.4 - unified: 10.1.2 - unist-util-remove-position: 4.0.2 - unist-util-visit: 4.1.2 - dev: false - - /rehype-parse@8.0.4: - resolution: {integrity: sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==} - dependencies: - '@types/hast': 2.3.4 - hast-util-from-parse5: 7.1.2 - parse5: 6.0.1 - unified: 10.1.2 - dev: false - - /rehype-pretty-code@0.9.3(shiki@0.14.1): - resolution: {integrity: sha512-57i+ifrttqpeQxub0NZ2pRw0aiUPYeBpr234NLWfZ4BfbEaP+29+iCXB1rUMkzoPi6IBC4w4I93mUPgw36IajQ==} - engines: {node: ^12.16.0 || >=13.2.0} - peerDependencies: - shiki: '*' - dependencies: - hash-obj: 4.0.0 - parse-numeric-range: 1.3.0 - shiki: 0.14.1 - dev: false - - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-math: 2.0.2 - micromark-extension-math: 2.0.2 - unified: 10.1.2 - dev: false - - /remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} - dependencies: - mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-parse@10.0.1: - resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.3.0 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} - dependencies: - estree-util-is-identifier-name: 2.1.0 - estree-util-value-to-estree: 1.3.0 - reading-time: 1.5.0 - unist-util-visit: 3.1.0 - dev: false - - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - dev: false - - /remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} - dev: false - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: false - - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false - - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: false - - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false - - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - dev: false - - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: false - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /scheduler@0.13.3: - resolution: {integrity: sha512-UxN5QRYWtpR1egNWzJcVLk8jlegxAugswQc984lD3kU7NuobsO37/sRfbpTdBjtnD5TBNFA2Q2oLV5+UmPSmEQ==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - - /scheduler@0.13.6: - resolution: {integrity: sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - - /scheduler@0.21.0: - resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /scheduler@0.24.0-canary-efb381bbf-20230505: - resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /scroll-into-view-if-needed@3.0.6: - resolution: {integrity: sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA==} - dependencies: - compute-scroll-into-view: 3.0.0 - dev: false - - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - dev: false - - /select@1.1.2: - resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} - requiresBuild: true - dev: false - optional: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: false - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: false - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /serialize-error@2.1.0: - resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} - engines: {node: '>=0.10.0'} - dev: false - - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: false - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: false - - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false - - /sharp@0.31.3: - resolution: {integrity: sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==} - engines: {node: '>=14.15.0'} - requiresBuild: true - dependencies: - color: 4.2.3 - detect-libc: 2.0.2 - node-addon-api: 5.1.0 - prebuild-install: 7.1.1 - semver: 7.5.4 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: false - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: false - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: false - - /shiki@0.14.1: - resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} - dependencies: - ansi-sequence-parser: 1.1.0 - jsonc-parser: 3.2.0 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - dev: false - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false - - /slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - dev: false - - /sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - dependencies: - is-plain-obj: 4.1.0 - dev: false - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: false - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false - - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - dev: false - - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: false - - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: false - - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} - dependencies: - type-fest: 0.7.1 - dev: false - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: false - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - dev: false - - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false - - /style-to-object@0.4.1: - resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} - dependencies: - inline-style-parser: 0.1.1 - dev: false - - /styled-components@5.3.8(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg==} - engines: {node: '>=10'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' - dependencies: - '@babel/helper-module-imports': 7.18.6 - '@babel/traverse': 7.23.2(supports-color@5.5.0) - '@emotion/is-prop-valid': 1.2.0 - '@emotion/stylis': 0.8.5 - '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.0.7(styled-components@5.3.8) - css-to-react-native: 3.2.0 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 18.2.0 - shallowequal: 1.1.0 - supports-color: 5.5.0 - dev: false - - /styled-jsx@5.1.1(@babel/core@7.22.10)(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - '@babel/core': 7.22.10 - client-only: 0.0.1 - react: 18.2.0 - dev: false - - /sudo-prompt@9.2.1: - resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - dev: false - - /supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - dependencies: - has-flag: 2.0.0 - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: false - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: false - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false - - /suspend-react@0.1.3(react@18.2.0): - resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} - peerDependencies: - react: '>=17.0' - dependencies: - react: 18.2.0 - dev: false - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.1 - dev: false - - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} - dependencies: - rimraf: 2.6.3 - dev: false - - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.8.2 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: false - - /three@0.155.0: - resolution: {integrity: sha512-sNgCYmDijnIqkD/bMfk+1pHg3YzsxW7V2ChpuP6HCQ8NiZr3RufsXQr8M3SSUMjW4hG+sUk7YbyuY0DncaDTJQ==} - dev: false - - /throat@5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - dev: false - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: false - - /tiny-emitter@2.1.0: - resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} - requiresBuild: true - dev: false - optional: true - - /tiny-secp256k1@1.1.6: - resolution: {integrity: sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==} - engines: {node: '>=6.0.0'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - bn.js: 4.12.0 - create-hmac: 1.1.7 - elliptic: 6.5.4 - nan: 2.17.0 - dev: false - - /title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true - dependencies: - arg: 1.0.0 - chalk: 2.3.0 - clipboardy: 1.2.2 - titleize: 1.0.0 - dev: false - - /titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} - dev: false - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: false - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: false - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false - - /trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - dev: false - - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false - - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: false - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: false - - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - dev: false - - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: false - - /typeforce@1.18.0: - resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} - dev: false - - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /uglify-es@3.3.9: - resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} - engines: {node: '>=0.8.0'} - deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 - hasBin: true - dependencies: - commander: 2.13.0 - source-map: 0.6.1 - dev: false - - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: false - - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: false - - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: false - - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: false - - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.6 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: false - - /unist-util-find-after@4.0.1: - resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - dev: false - - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: false - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} - dependencies: - '@types/unist': 2.0.6 - unist-util-visit: 4.1.2 - dev: false - - /unist-util-remove@3.1.1: - resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - dev: false - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - dev: false - - /unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - unist-util-visit-parents: 4.1.1 - dev: false - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false - - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: false - - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: false - - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /utility-types@3.10.0: - resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} - engines: {node: '>= 4'} - dev: false - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: false - - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: false - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: false - - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - dependencies: - '@types/unist': 2.0.6 - vfile: 5.3.7 - dev: false - - /vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} - dependencies: - '@types/js-yaml': 4.0.5 - is-buffer: 2.0.5 - js-yaml: 4.1.0 - dev: false - - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-stringify-position: 3.0.3 - dev: false - - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.6 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - - /vlq@1.0.1: - resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} - dev: false - - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false - - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: false - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: false - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: false - - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - - /whatwg-fetch@3.6.17: - resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: false - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /wif@2.0.6: - resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} - dependencies: - bs58check: 2.1.2 - dev: false - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false - - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.10 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: false - - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - dev: false - - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false - - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: false - - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: false - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: false - - /zdog@1.1.3: - resolution: {integrity: sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==} - dev: false - - /zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - dev: false - - /zustand@3.7.2(react@18.2.0): - resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - dependencies: - react: 18.2.0 - dev: false - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false diff --git a/docs/web/style.css b/docs/web/style.css deleted file mode 100644 index 9d4fb053c9..0000000000 --- a/docs/web/style.css +++ /dev/null @@ -1,107 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - - -body { - font-feature-settings: 'rlig' 1, 'calt' 1; - overflow:'hidden'; -} - -.box { - width: 200px; - height: 200px; - background: red; -} -.home-content p { - margin-top: 1.5em; - line-height: 1.75em; -} - -.home-content a { - --tw-ring-color: hsl(var(--nextra-primary-hue) 100% 50%/0.3); - --tw-text-opacity: 1; - text-underline-position: under; - text-decoration-line: underline; - text-decoration-thickness: from-font; - color: hsl(var(--nextra-primary-hue) 100% 50% / var(--tw-text-opacity)); -} - -figcaption { - font-size: 0.85rem; - line-height: 1.5rem; - display: block; - text-align: center; - margin-top: 0.5rem; -} - -code.text-\[\.9em\] { - font-size: 14px; -} - -@media screen and (max-width: 1200px) { - .home-content .hide-medium { - display: none; - } -} - -@media screen and (max-width: 720px) { - .home-content p { - font-size: 0.9rem; - } - .home-content .hide-small { - display: none; - } -} - -.steps-container { - margin-left: 1rem; - padding-left: 1.5rem; - counter-reset: step; - border-left: 1px solid; - border-color: rgb(229 231 235/1); - margin-bottom: 3rem; -} -.steps-container h3 { - counter-increment: step; -} -.steps-container h3:before { - content: counter(step); - display: inline-block; - position: absolute; - margin-top: 3px; - margin-left: -41px; - width: 33px; - height: 33px; - text-align: center; - text-indent: -1px; - color: #999; - border-radius: 100%; - border: 4px solid #fff; - background: #f3f3f3; - line-height: 1.5rem; - font-size: 1rem; - font-weight: 400; -} - -.dark .steps-container { - border-color: #2e2e2e; -} -.dark .steps-container h3:before { - color: #999; - border: 4px solid rgba(17, 17, 17, var(--tw-bg-opacity)); - background: #2e2e2e; -} - -.container { - position: relative; - overflow: hidden; - width: 100vw; -} - -#__next { - display: flex; - flex-direction: column; - min-height: 100%; - overflow: hidden; -} \ No newline at end of file diff --git a/docs/web/theme.config.jsx b/docs/web/theme.config.jsx deleted file mode 100644 index eb537093af..0000000000 --- a/docs/web/theme.config.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import { useConfig } from 'nextra-theme-docs' -import { useRouter } from 'next/router' - -export default { - logo: Polaris, - logoLink: '/', - project: { - link: 'https://github.com/berachain/polaris', - }, - docsRepositoryBase: "https://github.com/berachain/polaris", - banner: { - key: '2.0-release', - text: - 🎉 Introducing Polaris Ethereum! - , - }, - useNextSeoProps() { - const { route } = useRouter() - if (route !== '/') { - return { - titleTemplate: '%s – Polaris Ethereum Docs' - } - } - }, - head: function useHead() { - const { title } = useConfig() - const socialCard = '/header.png' - return ( - <> - - - - - - - - - - - - - - - - - - - - ) - }, - editLink: false, - feedback: false, - sidebar: { - titleComponent({ title, type }) { - if (type === 'separator') { - return {title} - } - return <>{title} - }, - defaultMenuCollapseLevel: 1, - toggleButton: true, - }, - footer: { - text: ( -
    -

    - © {new Date().getFullYear()} Berachain Foundation. -

    -
    - ) - }, - gitTimestamp: false, -} \ No newline at end of file diff --git a/docs/web/tsconfig.json b/docs/web/tsconfig.json deleted file mode 100644 index 4e224ad41b..0000000000 --- a/docs/web/tsconfig.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "incremental": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve" - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/docs/web/window.d.ts b/docs/web/window.d.ts deleted file mode 100644 index 4f421ba2ca..0000000000 --- a/docs/web/window.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Window as KeplrWindow } from '@keplr-wallet/types'; - -declare global { - // eslint-disable-next-line - interface Window extends KeplrWindow {} -} diff --git a/docs/web/yarn-error.log b/docs/web/yarn-error.log deleted file mode 100644 index 95652ade59..0000000000 --- a/docs/web/yarn-error.log +++ /dev/null @@ -1,2858 +0,0 @@ -Arguments: - /Users/garrettparris/.nvm/versions/node/v14.15.1/bin/node /opt/homebrew/bin/yarn add @keplr-wallet - -PATH: - /Users/garrettparris/.nvm/versions/node/v14.15.1/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/garrettparris/.nvm/versions/node/v14.15.1/bin:/opt/homebrew/Caskroom/miniconda/base/bin:/opt/homebrew/Caskroom/miniconda/base/condabin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/garrettparris/Library/Application Support/JetBrains/Toolbox/scripts:/Users/garrettparris/.foundry/bin:/Users/garrettparris/Library/Application Support/JetBrains/Toolbox/scripts:/Users/garrettparris/.foundry/bin - -Yarn version: - 1.22.19 - -Node version: - 14.15.1 - -Platform: - darwin x64 - -Trace: - Error: https://registry.yarnpkg.com/@keplr-wallet: Request "https://registry.yarnpkg.com/@keplr-wallet" returned a 405 - at Request.params.callback [as _callback] (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:66154:18) - at Request.self.callback (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:140890:22) - at Request.emit (events.js:315:20) - at Request. (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:141862:10) - at Request.emit (events.js:315:20) - at IncomingMessage. (/opt/homebrew/lib/node_modules/yarn/lib/cli.js:141784:12) - at Object.onceWrapper (events.js:421:28) - at IncomingMessage.emit (events.js:327:22) - at endReadableNT (_stream_readable.js:1327:12) - at processTicksAndRejections (internal/process/task_queues.js:80:21) - -npm manifest: - { - "name": "docs", - "private": true, - "scripts": { - "dev": "next", - "start": "next start", - "build": "next build" - }, - "author": "@DevLobster", - "license": "MIT", - "dependencies": { - "framer-motion": "^9.0.2", - "highlight.js": "^11.7.0", - "next": "^13.1.2", - "nextra": "^2.2.3", - "nextra-theme-docs": "^2.2.3", - "prismjs": "^1.29.0", - "react": "^18.2.0", - "react-code-blocks": "^0.0.9-0", - "react-dom": "^18.2.0", - "react-prism": "^4.3.2", - "react-three-fiber": "^6.0.13", - "three": "^0.149.0" - }, - "devDependencies": { - "@types/node": "18.13.0", - "typescript": "4.9.5" - } - } - -yarn manifest: - No manifest - -Lockfile: - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. - # yarn lockfile v1 - - - "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - - "@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - - "@babel/helper-annotate-as-pure@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - - "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - - "@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - - "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - - "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - - "@babel/parser@^7.20.7", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== - - "@babel/runtime@^7.10.4", "@babel/runtime@^7.3.1": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - - "@babel/runtime@^7.12.5": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" - integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== - dependencies: - regenerator-runtime "^0.13.11" - - "@babel/runtime@^7.17.8": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== - dependencies: - regenerator-runtime "^0.13.11" - - "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - - "@babel/traverse@^7.4.5": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - - "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - - "@emotion/is-prop-valid@^0.8.2": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - - "@emotion/is-prop-valid@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== - dependencies: - "@emotion/memoize" "^0.8.0" - - "@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - - "@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - - "@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - - "@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - - "@headlessui/react@^1.7.7": - version "1.7.7" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.7.tgz#d6f8708d8943ae8ebb1a6929108234e4515ac7e8" - integrity sha512-BqDOd/tB9u2tA0T3Z0fn18ktw+KbVwMnkxxsGPIH2hzssrQhKB5n/6StZOyvLYP/FsYtvuXfi9I0YowKPv2c1w== - dependencies: - client-only "^0.0.1" - - "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - - "@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - - "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - - "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - - "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - - "@mdx-js/mdx@^2.1.5", "@mdx-js/mdx@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.2.1.tgz#611af1b68135c94eb467eb07e006fa1d8eebe029" - integrity sha512-hZ3ex7exYLJn6FfReq8yTvA6TE53uW9UHJQM9IlSauOuS55J9y8RtA7W+dzp6Yrzr00/U1sd7q+Wf61q6SfiTQ== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/mdx" "^2.0.0" - estree-util-build-jsx "^2.0.0" - estree-util-is-identifier-name "^2.0.0" - estree-util-to-js "^1.1.0" - estree-walker "^3.0.0" - hast-util-to-estree "^2.0.0" - markdown-extensions "^1.0.0" - periscopic "^3.0.0" - remark-mdx "^2.0.0" - remark-parse "^10.0.0" - remark-rehype "^10.0.0" - unified "^10.0.0" - unist-util-position-from-estree "^1.0.0" - unist-util-stringify-position "^3.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" - - "@mdx-js/react@^2.1.5", "@mdx-js/react@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.2.1.tgz#5a70592418d52b1b01538c37e795034601c96ec5" - integrity sha512-YdXcMcEnqZhzql98RNrqYo9cEhTTesBiCclEtoiQUbJwx87q9453GTapYU6kJ8ZZ2ek1Vp25SiAXEFy5O/eAPw== - dependencies: - "@types/mdx" "^2.0.0" - "@types/react" ">=16" - - "@motionone/animation@^10.15.1": - version "10.15.1" - resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807" - integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ== - dependencies: - "@motionone/easing" "^10.15.1" - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" - tslib "^2.3.1" - - "@motionone/dom@^10.15.3": - version "10.15.5" - resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.15.5.tgz#4af18f8136d85c2fc997cac98121c969f6731802" - integrity sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA== - dependencies: - "@motionone/animation" "^10.15.1" - "@motionone/generators" "^10.15.1" - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" - hey-listen "^1.0.8" - tslib "^2.3.1" - - "@motionone/easing@^10.15.1": - version "10.15.1" - resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.15.1.tgz#95cf3adaef34da6deebb83940d8143ede3deb693" - integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw== - dependencies: - "@motionone/utils" "^10.15.1" - tslib "^2.3.1" - - "@motionone/generators@^10.15.1": - version "10.15.1" - resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.15.1.tgz#dc6abb11139d1bafe758a41c134d4c753a9b871c" - integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ== - dependencies: - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" - tslib "^2.3.1" - - "@motionone/types@^10.15.1": - version "10.15.1" - resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.15.1.tgz#89441b54285012795cbba8612cbaa0fa420db3eb" - integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA== - - "@motionone/utils@^10.15.1": - version "10.15.1" - resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.15.1.tgz#6b5f51bde75be88b5411e084310299050368a438" - integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw== - dependencies: - "@motionone/types" "^10.15.1" - hey-listen "^1.0.8" - tslib "^2.3.1" - - "@napi-rs/simple-git-android-arm-eabi@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz#303bea1ec00db24466e3b3ba13de337d87c5371b" - integrity sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g== - - "@napi-rs/simple-git-android-arm64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz#42c8d04287364fd1619002629fa52183dcf462ee" - integrity sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g== - - "@napi-rs/simple-git-darwin-arm64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz#e210808e6d646d6efecea84c67ced8eb44a8f821" - integrity sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ== - - "@napi-rs/simple-git-darwin-x64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz#d717525c33e0dfd8a6d6215da2fcbc0ad40011e1" - integrity sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA== - - "@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz#03e7b2dd299c10e61bbf29f405ea74f6571cf6a1" - integrity sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ== - - "@napi-rs/simple-git-linux-arm64-gnu@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz#945123f75c9a36fd0364e789ce06cd29a74a43cc" - integrity sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA== - - "@napi-rs/simple-git-linux-arm64-musl@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz#2c20a0bff7c08f60b033ed7056dcb07bbbff8310" - integrity sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow== - - "@napi-rs/simple-git-linux-x64-gnu@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz#980e22b7376252a0767298ec801d374d97553da1" - integrity sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw== - - "@napi-rs/simple-git-linux-x64-musl@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz#edca3b2833dc5d3fc9151f5b931f7b14478ccca4" - integrity sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ== - - "@napi-rs/simple-git-win32-arm64-msvc@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz#3ac4c7fe816a2cdafabd091ded76161d1ba1fe88" - integrity sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA== - - "@napi-rs/simple-git-win32-x64-msvc@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz#3b825bc2cb1c7ff535a3ca03768142d68bbf5c19" - integrity sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew== - - "@napi-rs/simple-git@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.8.tgz#391cb58436d50bd32d924611d45bdc41f5e7607a" - integrity sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA== - optionalDependencies: - "@napi-rs/simple-git-android-arm-eabi" "0.1.8" - "@napi-rs/simple-git-android-arm64" "0.1.8" - "@napi-rs/simple-git-darwin-arm64" "0.1.8" - "@napi-rs/simple-git-darwin-x64" "0.1.8" - "@napi-rs/simple-git-linux-arm-gnueabihf" "0.1.8" - "@napi-rs/simple-git-linux-arm64-gnu" "0.1.8" - "@napi-rs/simple-git-linux-arm64-musl" "0.1.8" - "@napi-rs/simple-git-linux-x64-gnu" "0.1.8" - "@napi-rs/simple-git-linux-x64-musl" "0.1.8" - "@napi-rs/simple-git-win32-arm64-msvc" "0.1.8" - "@napi-rs/simple-git-win32-x64-msvc" "0.1.8" - - "@next/env@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.2.tgz#4f13e3e9d44bb17fdc1d4543827459097035f10f" - integrity sha512-PpT4UZIX66VMTqXt4HKEJ+/PwbS+tWmmhZlazaws1a+dbUA5pPdjntQ46Jvj616i3ZKN9doS9LHx3y50RLjAWg== - - "@next/swc-android-arm-eabi@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.2.tgz#eacc7757b480a8150c1aea748bf7892a4fc62f64" - integrity sha512-7mRz1owoGsbfIcdOJA3kk7KEwPZ+OvVT1z9DkR/yru4QdVLF69h/1SHy0vlUNQMxDRllabhxCfkoZCB34GOGAg== - - "@next/swc-android-arm64@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.2.tgz#f3d41339b4f15852a589fe11820408572a512a27" - integrity sha512-mgjZ2eJSayovQm1LcE54BLSI4jjnnnLtq5GY5g+DdPuUiCT644gKtjZ/w2BQvuIecCqqBO+Ph9yzo/wUTq7NLg== - - "@next/swc-darwin-arm64@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.2.tgz#1a20a2262aa7a250517c9a7f2efd6ac6273f8c63" - integrity sha512-RikoQqy109r2222UJlyGs4dZw2BibkfPqpeFdW5JEGv+L2PStlHID8DwyVYbmHfQ0VIBGvbf/NAUtFakAWlhwg== - - "@next/swc-darwin-x64@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.2.tgz#242bb321676bd88f4cffa7eae3283215cd1185ce" - integrity sha512-JbDZjaTvL8gyPC5TAH6OnD4jmXPkyUxRYPvu08ZmhT/XAFBb/Cso0BdXyDax/BPCG70mimP9d3hXNKNq+A0VtQ== - - "@next/swc-freebsd-x64@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.2.tgz#9589f7f2bebfa43a744c9e41654e743b38a318b1" - integrity sha512-ax4j8VrdFQ/xc3W7Om0u1vnDxVApQHKsChBbAMynCrnycZmpbqK4MZu4ZkycT+mx2eccCiqZROpbzDbEdPosEw== - - "@next/swc-linux-arm-gnueabihf@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.2.tgz#8935b0c8f232e36c3d88cd1e1023afa8d51f7260" - integrity sha512-NcRHTesnCxnUvSJa637PQJffBBkmqi5XS/xVWGY7dI6nyJ+pC96Oj7kd+mcjnFUQI5lHKbg39qBWKtOzbezc4w== - - "@next/swc-linux-arm64-gnu@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.2.tgz#3482f72e580cdfc4bbec2e55dd55d5a9bdf7038b" - integrity sha512-AxJdjocLtPrsBY4P2COSBIc3crT5bpjgGenNuINoensOlXhBkYM0aRDYZdydwXOhG+kN2ngUvfgitop9pa204w== - - "@next/swc-linux-arm64-musl@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.2.tgz#3b7ca70fd813c77f618ee34a150b977cc15af9a3" - integrity sha512-JmNimDkcCRq7P5zpkdqeaSZ69qKDntEPtyIaMNWqy5M0WUJxGim0Fs6Qzxayiyvuuh9Guxks4woQ/j/ZvX/c8Q== - - "@next/swc-linux-x64-gnu@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.2.tgz#51a7a889e88eb87a5ce9658842f9e8422e037ead" - integrity sha512-TsLsjZwUlgmvI42neTuIoD6K9RlXCUzqPtvIClgXxVO0um0DiZwK+M+0zX/uVXhMVphfPY2c5YeR1zFSIONY4A== - - "@next/swc-linux-x64-musl@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.2.tgz#4c0dd08a6f8a7e4881c3551de29259b3cfe86e27" - integrity sha512-eSkyXgCXydEFPTkcncQOGepafedPte6JT/OofB9uvruucrrMVBagCASOuPxodWEMrlfEKSXVnExMKIlfmQMD7A== - - "@next/swc-win32-arm64-msvc@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.2.tgz#589fcce82f9f7224d2399d8d7bcba9097bb50dad" - integrity sha512-DmXFaRTgt2KrV9dmRLifDJE+cYiutHVFIw5/C9BtnwXH39uf3YbPxeD98vNrtqqqZVVLXY/1ySaSIwzYnqeY9g== - - "@next/swc-win32-ia32-msvc@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.2.tgz#9be05202730530631b51d7753d447dfe86095c9f" - integrity sha512-3+nBkuFs/wT+lmRVQNH5SyDT7I4vUlNPntosEaEP63FuYQdPLaxz0GvcR66MdFSFh2fsvazpe4wciOwVS4FItQ== - - "@next/swc-win32-x64-msvc@13.1.2": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.2.tgz#c7e75033e8b8f497768c7b462ac642830141bb00" - integrity sha512-avsyveEvcvH42PvKjR4Pb8JlLttuGURr2H3ZhS2b85pHOiZ7yjH3rMUoGnNzuLMApyxYaCvd4MedPrLhnNhkog== - - "@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== - - "@react-three/fiber@latest": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@react-three/fiber/-/fiber-8.11.0.tgz#3ed67cc3a7951c2aed00fe02ee694a95744c50a5" - integrity sha512-n9eM7hVsHbecexKK0isvUOPq1SYMHcLhUTZsMZQSYo5RT1yjbgQbbrVtF9bXN9rQgrD9l3V3Ho3ckPp0cNNs1w== - dependencies: - "@babel/runtime" "^7.17.8" - "@types/react-reconciler" "^0.26.7" - its-fine "^1.0.6" - react-reconciler "^0.27.0" - react-use-measure "^2.1.1" - scheduler "^0.21.0" - suspend-react "^0.0.8" - zustand "^3.7.1" - - "@swc/helpers@0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" - integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== - dependencies: - tslib "^2.4.0" - - "@types/acorn@^4.0.0": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" - integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== - dependencies: - "@types/estree" "*" - - "@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - - "@types/estree-jsx@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.0.tgz#7bfc979ab9f692b492017df42520f7f765e98df1" - integrity sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ== - dependencies: - "@types/estree" "*" - - "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - - "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - - "@types/js-yaml@^4.0.0": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" - integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== - - "@types/katex@^0.11.0": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5" - integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg== - - "@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - - "@types/mdx@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.3.tgz#43fd32414f17fcbeced3578109a6edd877a2d96e" - integrity sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ== - - "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - - "@types/node@18.13.0": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== - - "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - - "@types/react-reconciler@^0.26.7": - version "0.26.7" - resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.26.7.tgz#0c4643f30821ae057e401b0d9037e03e8e9b2a36" - integrity sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ== - dependencies: - "@types/react" "*" - - "@types/react-reconciler@^0.28.0": - version "0.28.2" - resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.2.tgz#f16b0e8cc4748af70ca975eaaace0d79582c71fa" - integrity sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw== - dependencies: - "@types/react" "*" - - "@types/react@*": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - - "@types/react@>=16": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - - "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - - "@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - - acorn-jsx@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - - acorn@^8.0.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - - ansi-styles@^3.1.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - - arch@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - - arg@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" - integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== - - argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - - argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - - astring@^1.8.0: - version "1.8.4" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.4.tgz#6d4c5d8de7be2ead9e4a3cc0e2efb8d759378904" - integrity sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw== - - "babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - - babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== - - bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - - camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - - caniuse-lite@^1.0.30001406: - version "1.0.30001445" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz#cf2d4eb93f2bcdf0310de9dd6d18be271bc0b447" - integrity sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg== - - ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - - chalk@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - - chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - - character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - - character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - - character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - - character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - - character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - - character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - - character-reference-invalid@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" - integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== - - client-only@0.0.1, client-only@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - - clipboard@^2.0.0: - version "2.0.11" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" - integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - - clipboardy@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" - integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== - dependencies: - arch "^2.1.0" - execa "^0.8.0" - - clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - - color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - - color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - - comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - - comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - - commander@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - - compute-scroll-into-view@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-2.0.4.tgz#2b444b2b9e4724819d2531efacb7ac094155fdf6" - integrity sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g== - - cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - - css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - - css-to-react-native@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - - csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - - debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - - debug@^4.0.0, debug@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - - decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - - delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - - dequal@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - - diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - - escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - - escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - - esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - - estree-util-attach-comments@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.0.tgz#47d69900588bcbc6bf58c3798803ec5f1f3008de" - integrity sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw== - dependencies: - "@types/estree" "^1.0.0" - - estree-util-build-jsx@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" - integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== - dependencies: - "@types/estree-jsx" "^1.0.0" - estree-util-is-identifier-name "^2.0.0" - estree-walker "^3.0.0" - - estree-util-is-identifier-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz#cf07867f42705892718d9d89eb2d85eaa8f0fcb5" - integrity sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ== - - estree-util-to-js@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.1.0.tgz#3bd9bb86354063537cc3d81259be2f0d4c3af39f" - integrity sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A== - dependencies: - "@types/estree-jsx" "^1.0.0" - astring "^1.8.0" - source-map "^0.7.0" - - estree-util-value-to-estree@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz#1d3125594b4d6680f666644491e7ac1745a3df49" - integrity sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw== - dependencies: - is-plain-obj "^3.0.0" - - estree-util-visit@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.0.tgz#aa0311a9c2f2aa56e9ae5e8b9d87eac14e4ec8f8" - integrity sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/unist" "^2.0.0" - - estree-walker@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.2.tgz#2d17ff18067683aaf97aed83fe0d300603db9b67" - integrity sha512-C03BvXCQIH/po+PNPONx/zSM9ziPr9weX8xNhYb/IJtdJ9z+L4z9VKPTB+UTHdmhnIopA2kc419ueyVyHVktwA== - - execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - - extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - - extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - - fault@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - - flexsearch@^0.7.21: - version "0.7.31" - resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.31.tgz#065d4110b95083110b9b6c762a71a77cc52e4702" - integrity sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA== - - focus-visible@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" - integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== - - format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - - framer-motion@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-9.0.2.tgz#b599beb987ca1341e32ec5a2a9c667f2143976e9" - integrity sha512-n7ZdIUBrT1xklowQNRQ6/h54+3ysmz422CP0rrhjE1X2tshiJy0WWQ7tv6y/fcOSQd23htNA9vvbUFLYMQ5lEQ== - dependencies: - "@motionone/dom" "^10.15.3" - hey-listen "^1.0.8" - tslib "^2.4.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" - - get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - - git-up@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" - integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== - dependencies: - is-ssh "^1.4.0" - parse-url "^8.1.0" - - git-url-parse@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" - integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== - dependencies: - git-up "^7.0.0" - - github-slugger@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" - integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== - - globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - - good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== - dependencies: - delegate "^3.1.2" - - graceful-fs@^4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - - gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - - has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== - - has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - - hash-obj@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/hash-obj/-/hash-obj-4.0.0.tgz#3fafeb0b5f17994441dbe04efbdee82e26b74c8c" - integrity sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg== - dependencies: - is-obj "^3.0.0" - sort-keys "^5.0.0" - type-fest "^1.0.2" - - hast-util-from-parse5@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.1.tgz#1887b4dd4e19f29d9c48c2e1c8bfeaac13a1f3a0" - integrity sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hastscript "^7.0.0" - property-information "^6.0.0" - vfile "^5.0.0" - vfile-location "^4.0.0" - web-namespaces "^2.0.0" - - hast-util-is-element@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" - integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - - hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - - hast-util-parse-selector@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" - integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== - dependencies: - "@types/hast" "^2.0.0" - - hast-util-to-estree@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.2.0.tgz#33a8a6780e74d550548466030d84e7832a7ab679" - integrity sha512-QFMTJsd3+lr0TKiObJ6PWwpWqFjD+T28dVSazcPAslHjHGMXxs5xFvjLbUf6e6O3/dfHb9iourepMlSh5x7lIA== - dependencies: - "@types/estree" "^1.0.0" - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - estree-util-attach-comments "^2.0.0" - estree-util-is-identifier-name "^2.0.0" - hast-util-whitespace "^2.0.0" - mdast-util-mdx-expression "^1.0.0" - mdast-util-mdxjs-esm "^1.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" - unist-util-position "^4.0.0" - zwitch "^2.0.0" - - hast-util-to-text@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" - integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hast-util-is-element "^2.0.0" - unist-util-find-after "^4.0.0" - - hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - - hastscript@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" - integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== - dependencies: - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - - hastscript@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" - integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^3.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - - hey-listen@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" - integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== - - highlight.js@^11.7.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" - integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== - - highlight.js@~9.15.0, highlight.js@~9.15.1: - version "9.15.10" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.10.tgz#7b18ed75c90348c045eef9ed08ca1319a2219ad2" - integrity sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw== - - hoist-non-react-statics@^3.0.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - - inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - - intersection-observer@^0.12.2: - version "0.12.2" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" - integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== - - is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - - is-alphabetical@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" - integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== - - is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - - is-alphanumerical@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" - integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== - dependencies: - is-alphabetical "^2.0.0" - is-decimal "^2.0.0" - - is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - - is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - - is-decimal@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" - integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== - - is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - - is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - - is-hexadecimal@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" - integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== - - is-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-3.0.0.tgz#b0889f1f9f8cb87e87df53a8d1230a2250f8b9be" - integrity sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ== - - is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - - is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - - is-reference@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" - integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== - dependencies: - "@types/estree" "*" - - is-ssh@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== - dependencies: - protocols "^2.0.1" - - is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - - isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - - its-fine@^1.0.6: - version "1.0.9" - resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.0.9.tgz#f4ca0ad5bdbf896764d35f7cf24c16287b6c6d31" - integrity sha512-Ph+vcp1R100JOM4raXmDx/wCTi4kMkMXiFE108qGzsLdghXFPqad82UJJtqT1jwdyWYkTU6eDpDnol/ZIzW+1g== - dependencies: - "@types/react-reconciler" "^0.28.0" - - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - - js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - - js-yaml@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - - jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - - jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - - katex@^0.13.0: - version "0.13.24" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905" - integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w== - dependencies: - commander "^8.0.0" - - katex@^0.15.0: - version "0.15.6" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.15.6.tgz#c4e2f6ced2ac4de1ef6f737fe7c67d3026baa0e5" - integrity sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA== - dependencies: - commander "^8.0.0" - - katex@^0.16.4: - version "0.16.4" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.4.tgz#87021bc3bbd80586ef715aeb476794cba6a49ad4" - integrity sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw== - dependencies: - commander "^8.0.0" - - kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - - kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - - lodash@^4.17.11: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - - longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - - loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - - lowlight@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.12.1.tgz#014acf8dd73a370e02ff1cc61debcde3bb1681eb" - integrity sha512-OqaVxMGIESnawn+TU/QMV5BJLbUghUfjDWPAtFqDYDmDtr4FnB+op8xM+pR7nKlauHNUHXGt0VgWatFB8voS5w== - dependencies: - fault "^1.0.2" - highlight.js "~9.15.0" - - lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - - markdown-extensions@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" - integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== - - markdown-table@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" - integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== - - match-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" - integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== - dependencies: - "@babel/runtime" "^7.12.5" - remove-accents "0.4.2" - - mdast-util-definitions@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db" - integrity sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - - mdast-util-find-and-replace@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz#249901ef43c5f41d6e8a8d446b3b63b17e592d7c" - integrity sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw== - dependencies: - escape-string-regexp "^5.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - - mdast-util-from-markdown@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268" - integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - - mdast-util-gfm-autolink-literal@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz#4032dcbaddaef7d4f2f3768ed830475bb22d3970" - integrity sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg== - dependencies: - "@types/mdast" "^3.0.0" - ccount "^2.0.0" - mdast-util-find-and-replace "^2.0.0" - micromark-util-character "^1.0.0" - - mdast-util-gfm-footnote@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz#11d2d40a1a673a399c459e467fa85e00223191fe" - integrity sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - micromark-util-normalize-identifier "^1.0.0" - - mdast-util-gfm-strikethrough@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz#6b4fa4ae37d449ccb988192ac0afbb2710ffcefd" - integrity sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - - mdast-util-gfm-table@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz#184e900979fe790745fc3dabf77a4114595fcd7f" - integrity sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag== - dependencies: - "@types/mdast" "^3.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.3.0" - - mdast-util-gfm-task-list-item@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz#6f35f09c6e2bcbe88af62fdea02ac199cc802c5c" - integrity sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - - mdast-util-gfm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz#16fcf70110ae689a06d77e8f4e346223b64a0ea6" - integrity sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ== - dependencies: - mdast-util-from-markdown "^1.0.0" - mdast-util-gfm-autolink-literal "^1.0.0" - mdast-util-gfm-footnote "^1.0.0" - mdast-util-gfm-strikethrough "^1.0.0" - mdast-util-gfm-table "^1.0.0" - mdast-util-gfm-task-list-item "^1.0.0" - mdast-util-to-markdown "^1.0.0" - - mdast-util-math@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-2.0.1.tgz#141b8e7e43731d2a7423c5eb8c0335c05d257ad2" - integrity sha512-ZZtjyRwobsiVg4bY0Q5CzAZztpbjRIA7ZlMMb0PNkwTXOnJTUoHvzBhVG95LIuek5Mlj1l2P+jBvWviqW7G+0A== - dependencies: - "@types/mdast" "^3.0.0" - longest-streak "^3.0.0" - mdast-util-to-markdown "^1.3.0" - - mdast-util-mdx-expression@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz#2224cf0b5b150093704a3c225bd529d2de21f50f" - integrity sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.0.0" - - mdast-util-mdx-jsx@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz#029f5a9c38485dbb5cf482059557ee7d788f1947" - integrity sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - ccount "^2.0.0" - mdast-util-to-markdown "^1.3.0" - parse-entities "^4.0.0" - stringify-entities "^4.0.0" - unist-util-remove-position "^4.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - - mdast-util-mdx@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz#dd4f6c993cf27da32725e50a04874f595b7b63fb" - integrity sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw== - dependencies: - mdast-util-mdx-expression "^1.0.0" - mdast-util-mdx-jsx "^2.0.0" - mdast-util-mdxjs-esm "^1.0.0" - - mdast-util-mdxjs-esm@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz#137345ef827169aeeeb6069277cd3e090830ce9a" - integrity sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.0.0" - - mdast-util-phrasing@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.0.tgz#c44fcf6be61a3cb8da54ab2df22320e61d4537ce" - integrity sha512-S+QYsDRLkGi8U7o5JF1agKa/sdP+CNGXXLqC17pdTVL8FHHgQEiwFGa9yE5aYtUxNiFGYoaDy9V1kC85Sz86Gg== - dependencies: - "@types/mdast" "^3.0.0" - unist-util-is "^5.0.0" - - mdast-util-to-hast@^12.1.0: - version "12.2.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.5.tgz#91532ebd929a7def21585034f7901eb367d2d272" - integrity sha512-EFNhT35ZR/VZ85/EedDdCNTq0oFM+NM/+qBomVGQ0+Lcg0nhI8xIwmdCzNMlVlCJNXRprpobtKP/IUh8cfz6zQ== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-builder "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - - mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" - integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" - zwitch "^2.0.0" - - mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" - integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== - - micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - - micromark-extension-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" - integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-gfm-footnote@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" - integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-gfm-strikethrough@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" - integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-gfm-table@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" - integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-gfm-tagfilter@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" - integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== - dependencies: - micromark-util-types "^1.0.0" - - micromark-extension-gfm-task-list-item@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" - integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-gfm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" - integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== - dependencies: - micromark-extension-gfm-autolink-literal "^1.0.0" - micromark-extension-gfm-footnote "^1.0.0" - micromark-extension-gfm-strikethrough "^1.0.0" - micromark-extension-gfm-table "^1.0.0" - micromark-extension-gfm-tagfilter "^1.0.0" - micromark-extension-gfm-task-list-item "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-extension-math@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz#bb7d28b907b17f1813dd3d0df2a6df6bb1a4d0e1" - integrity sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA== - dependencies: - "@types/katex" "^0.11.0" - katex "^0.13.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-mdx-expression@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz#cd3843573921bf55afcfff4ae0cd2e857a16dcfa" - integrity sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA== - dependencies: - micromark-factory-mdx-expression "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-events-to-acorn "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-extension-mdx-jsx@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz#9f196be5f65eb09d2a49b237a7b3398bba2999be" - integrity sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA== - dependencies: - "@types/acorn" "^4.0.0" - estree-util-is-identifier-name "^2.0.0" - micromark-factory-mdx-expression "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - vfile-message "^3.0.0" - - micromark-extension-mdx-md@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz#382f5df9ee3706dd120b51782a211f31f4760d22" - integrity sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw== - dependencies: - micromark-util-types "^1.0.0" - - micromark-extension-mdxjs-esm@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz#630d9dc9db2c2fd470cac8c1e7a824851267404d" - integrity sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-events-to-acorn "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-position-from-estree "^1.1.0" - uvu "^0.5.0" - vfile-message "^3.0.0" - - micromark-extension-mdxjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz#772644e12fc8299a33e50f59c5aa15727f6689dd" - integrity sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ== - dependencies: - acorn "^8.0.0" - acorn-jsx "^5.0.0" - micromark-extension-mdx-expression "^1.0.0" - micromark-extension-mdx-jsx "^1.0.0" - micromark-extension-mdx-md "^1.0.0" - micromark-extension-mdxjs-esm "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-factory-mdx-expression@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz#917e17d16e6e9c2551f3a862e6a9ebdd22056476" - integrity sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-events-to-acorn "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-position-from-estree "^1.0.0" - uvu "^0.5.0" - vfile-message "^3.0.0" - - micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== - dependencies: - micromark-util-symbol "^1.0.0" - - micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - - micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== - dependencies: - micromark-util-symbol "^1.0.0" - - micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - - micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== - - micromark-util-events-to-acorn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz#65785cb77299d791bfefdc6a5213ab57ceead115" - integrity sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw== - dependencies: - "@types/acorn" "^4.0.0" - "@types/estree" "^1.0.0" - estree-util-visit "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - vfile-location "^4.0.0" - vfile-message "^3.0.0" - - micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== - - micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== - dependencies: - micromark-util-symbol "^1.0.0" - - micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== - dependencies: - micromark-util-types "^1.0.0" - - micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - - micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - - micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== - - micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== - - micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - - mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - - ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - - nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - - nanoid@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.0.tgz#6e144dee117609232c3f415c34b0e550e64999a5" - integrity sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg== - - next-mdx-remote@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.2.1.tgz#1aee0207b029487100ef49740be210595fe04e50" - integrity sha512-PcVF1r5XTBjiNVXw0GyaIcOwQsklHo36+7ycfmtJb52TIkT0nM4Hzv4wgJwNg7+jvTbap99qWsMwdKUYR9WxAA== - dependencies: - "@mdx-js/mdx" "^2.2.1" - "@mdx-js/react" "^2.2.1" - vfile "^5.3.0" - vfile-matter "^3.0.1" - - next-seo@^5.5.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.15.0.tgz#b1a90508599774982909ea44803323c6fb7b50f4" - integrity sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg== - - next-themes@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" - integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== - - next@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/next/-/next-13.1.2.tgz#4105b0cf238bb2f58d5e12dbded8cabb9785f2d9" - integrity sha512-Rdnnb2YH///w78FEOR/IQ6TXga+qpth4OqFSem48ng1PYYKr6XBsIk1XVaRcIGM3o6iiHnun0nJvkJHDf+ICyQ== - dependencies: - "@next/env" "13.1.2" - "@swc/helpers" "0.4.14" - caniuse-lite "^1.0.30001406" - postcss "8.4.14" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-android-arm-eabi" "13.1.2" - "@next/swc-android-arm64" "13.1.2" - "@next/swc-darwin-arm64" "13.1.2" - "@next/swc-darwin-x64" "13.1.2" - "@next/swc-freebsd-x64" "13.1.2" - "@next/swc-linux-arm-gnueabihf" "13.1.2" - "@next/swc-linux-arm64-gnu" "13.1.2" - "@next/swc-linux-arm64-musl" "13.1.2" - "@next/swc-linux-x64-gnu" "13.1.2" - "@next/swc-linux-x64-musl" "13.1.2" - "@next/swc-win32-arm64-msvc" "13.1.2" - "@next/swc-win32-ia32-msvc" "13.1.2" - "@next/swc-win32-x64-msvc" "13.1.2" - - nextra-theme-docs@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.2.3.tgz#b1991fae47d3d040ffbe8024b41d9280f4ba187c" - integrity sha512-KQEhUW89kUVnMMnLubBQKMlnw30gM8e9fVBzyfQ7aTO445EGjQWbm4UF/J7VBBlcPsAP+SiYXUzbQDpQy0jLng== - dependencies: - "@headlessui/react" "^1.7.7" - "@popperjs/core" "^2.11.6" - clsx "^1.2.1" - flexsearch "^0.7.21" - focus-visible "^5.2.0" - git-url-parse "^13.1.0" - github-slugger "^2.0.0" - intersection-observer "^0.12.2" - match-sorter "^6.3.1" - next-seo "^5.5.0" - next-themes "^0.2.1" - scroll-into-view-if-needed "^3.0.0" - zod "^3.20.2" - - nextra@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.2.3.tgz#2187ee56ff2758b469482d771cafc3db63e10450" - integrity sha512-tzI5EWZtrlIy/ErW0Mip0SV2a+6gFBPibnptc7A2HuLS3bezFcfcavUQx9BgQgRF45I49hYHk3a/5cIdgOyu4w== - dependencies: - "@mdx-js/mdx" "^2.1.5" - "@mdx-js/react" "^2.1.5" - "@napi-rs/simple-git" "^0.1.8" - github-slugger "^2.0.0" - graceful-fs "^4.2.10" - gray-matter "^4.0.3" - katex "^0.16.4" - next-mdx-remote "^4.2.0" - p-limit "^3.1.0" - rehype-katex "^6.0.2" - rehype-pretty-code "0.8.1" - remark-gfm "^3.0.1" - remark-math "^5.1.1" - remark-reading-time "^2.0.1" - shiki "^0.12.1" - slash "^3.0.0" - title "^3.5.3" - unist-util-visit "^4.1.1" - - npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - - p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - - p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - - parse-entities@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" - integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - - parse-entities@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.0.tgz#f67c856d4e3fe19b1a445c3fabe78dcdc1053eeb" - integrity sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ== - dependencies: - "@types/unist" "^2.0.0" - character-entities "^2.0.0" - character-entities-legacy "^3.0.0" - character-reference-invalid "^2.0.0" - decode-named-character-reference "^1.0.0" - is-alphanumerical "^2.0.0" - is-decimal "^2.0.0" - is-hexadecimal "^2.0.0" - - parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - - parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== - dependencies: - protocols "^2.0.0" - - parse-url@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" - integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== - dependencies: - parse-path "^7.0.0" - - parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - - path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - - periscopic@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.0.4.tgz#b3fbed0d1bc844976b977173ca2cd4a0ef4fa8d1" - integrity sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg== - dependencies: - estree-walker "^3.0.0" - is-reference "^3.0.0" - - picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - - picomatch@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - - postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - - postcss@8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - - prismjs@^1.29.0, prismjs@^1.8.4: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - - prismjs@~1.17.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" - integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q== - optionalDependencies: - clipboard "^2.0.0" - - property-information@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - - property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== - - protocols@^2.0.0, protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== - - pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - - react-code-blocks@^0.0.9-0: - version "0.0.9-0" - resolved "https://registry.yarnpkg.com/react-code-blocks/-/react-code-blocks-0.0.9-0.tgz#0c6d04d8a40b74cffe95f24f1a8e62a0fda8c014" - integrity sha512-jdYJVZwGtsr6WIUaqILy5fkF1acf57YV5s0V3+w5o9v3omYnqBeO6EuZi1Vf2x1hahkYGEedsp46+ofdkYlqyw== - dependencies: - "@babel/runtime" "^7.10.4" - react-syntax-highlighter "^12.2.1" - styled-components "^5.1.1" - tslib "^2.0.0" - - react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - - react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - - react-prism@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/react-prism/-/react-prism-4.3.2.tgz#5c07609539b3ba6f45eb33e7d6a3588df3270c21" - integrity sha512-Z8BzDfWxzhngDtnZFjYj4RgHo7uqiWB4cOCpp//GFEpWbtINbCqHLIpL+q/f8ah5Aokw/uXkBkoLgvYIGgtm4A== - - react-reconciler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.27.0.tgz#360124fdf2d76447c7491ee5f0e04503ed9acf5b" - integrity sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.21.0" - - react-syntax-highlighter@^12.2.1: - version "12.2.1" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-12.2.1.tgz#14d78352da1c1c3f93c6698b70ec7c706b83493e" - integrity sha512-CTsp0ZWijwKRYFg9xhkWD4DSpQqE4vb2NKVMdPAkomnILSmsNBHE0n5GuI5zB+PU3ySVvXvdt9jo+ViD9XibCA== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "~9.15.1" - lowlight "1.12.1" - prismjs "^1.8.4" - refractor "^2.4.1" - - react-three-fiber@^6.0.13: - version "6.0.13" - resolved "https://registry.yarnpkg.com/react-three-fiber/-/react-three-fiber-6.0.13.tgz#6dbbc5d8d5fe94c49986e9c71024af7eaf68a441" - integrity sha512-uShQnkMVLvnzwf3YzY9mnzCnpmLpvTQkc0ycrtwk8fyjXmZt2695tLn3tufPF6uxq06UKJRKJcjCVCMXyUcEPQ== - dependencies: - "@react-three/fiber" latest - - react-use-measure@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba" - integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== - dependencies: - debounce "^1.2.1" - - react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - - reading-time@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - - refractor@^2.4.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e" - integrity sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw== - dependencies: - hastscript "^5.0.0" - parse-entities "^1.1.2" - prismjs "~1.17.0" - - regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - - rehype-katex@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.2.tgz#20197bbc10bdf79f6b999bffa6689d7f17226c35" - integrity sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg== - dependencies: - "@types/hast" "^2.0.0" - "@types/katex" "^0.11.0" - hast-util-to-text "^3.1.0" - katex "^0.15.0" - rehype-parse "^8.0.0" - unified "^10.0.0" - unist-util-remove-position "^4.0.0" - unist-util-visit "^4.0.0" - - rehype-parse@^8.0.0: - version "8.0.4" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688" - integrity sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^7.0.0" - parse5 "^6.0.0" - unified "^10.0.0" - - rehype-pretty-code@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.8.1.tgz#9d92727115f2acae897ecb5d99624ddd63e31b54" - integrity sha512-sjjHeMAQEHutAKaTfc0gN99/msbFKZoZqMGG9FTkIUnX50mHRgRJsK0WIBKyx+1SxX89KshOWgv0+RZOeDhdEQ== - dependencies: - hash-obj "^4.0.0" - nanoid "^4.0.0" - parse-numeric-range "^1.3.0" - - remark-gfm@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" - integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-gfm "^2.0.0" - micromark-extension-gfm "^2.0.0" - unified "^10.0.0" - - remark-math@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-5.1.1.tgz#459e798d978d4ca032e745af0bac81ddcdf94964" - integrity sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-math "^2.0.0" - micromark-extension-math "^2.0.0" - unified "^10.0.0" - - remark-mdx@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.2.1.tgz#0d006436acf039b526c3b6b47ea4a44b3d544db7" - integrity sha512-R9wcN+/THRXTKyRBp6Npo/mcbGA2iT3N4G8qUqLA5pOEg7kBidHv8K2hHidCMYZ6DXmwK18umu0K4cicgA2PPQ== - dependencies: - mdast-util-mdx "^2.0.0" - micromark-extension-mdxjs "^1.0.0" - - remark-parse@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - - remark-reading-time@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/remark-reading-time/-/remark-reading-time-2.0.1.tgz#fe8bb8e420db7678dc749385167adb4fc99318f7" - integrity sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw== - dependencies: - estree-util-is-identifier-name "^2.0.0" - estree-util-value-to-estree "^1.3.0" - reading-time "^1.3.0" - unist-util-visit "^3.1.0" - - remark-rehype@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" - - remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== - - sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - - scheduler@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" - integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== - dependencies: - loose-envify "^1.1.0" - - scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - - scroll-into-view-if-needed@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.4.tgz#4b3101712f0ac8ec982c0a7ab4d071e393241e21" - integrity sha512-s+/F50jwTOUt+u5oEIAzum9MN2lUQNvWBe/zfEsVQcbaERjGkKLq1s+2wCHkahMLC8nMLbzMVKivx9JhunXaZg== - dependencies: - compute-scroll-into-view "^2.0.4" - - section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - - select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== - - shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - - shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - - shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - - shiki@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.12.1.tgz#26fce51da12d055f479a091a5307470786f300cd" - integrity sha512-aieaV1m349rZINEBkjxh2QbBvFFQOlgqYTNtCal82hHj4dDZ76oMlQIX+C7ryerBTDiga3e5NfH6smjdJ02BbQ== - dependencies: - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" - - signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - - slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - - sort-keys@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-5.0.0.tgz#5d775f8ae93ecc29bc7312bbf3acac4e36e3c446" - integrity sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw== - dependencies: - is-plain-obj "^4.0.0" - - source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - - source-map@^0.7.0: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - - space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - - space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - - sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - - stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - - strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - - strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - - style-to-object@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.0.tgz#fdcee2ba7f195f96023a44a124683f70d463dd24" - integrity sha512-dAjq2m87tPn/TcYTeqMhXJRhu96WYWcxMFQxs3Y9jfYpq2jG+38u4tj0Lst6DOiYXmDuNxVJ2b1Z2uPC6wTEeg== - dependencies: - inline-style-parser "0.1.1" - - styled-components@^5.1.1: - version "5.3.6" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.6.tgz#27753c8c27c650bee9358e343fc927966bfd00d1" - integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - - styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - - supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== - dependencies: - has-flag "^2.0.0" - - supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - - suspend-react@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.0.8.tgz#b0740c1386b4eb652f17affe4339915ee268bd31" - integrity sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg== - - three@^0.149.0: - version "0.149.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.149.0.tgz#a9cf78b17d02f063ffe6dfca1e300eff2eab2927" - integrity sha512-tohpUxPDht0qExRLDTM8sjRLc5d9STURNrdnK3w9A+V4pxaTBfKWWT/IqtiLfg23Vfc3Z+ImNfvRw1/0CtxrkQ== - - tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - - title@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" - integrity sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q== - dependencies: - arg "1.0.0" - chalk "2.3.0" - clipboardy "1.2.2" - titleize "1.0.0" - - titleize@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" - integrity sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw== - - to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - - trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - - trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - - tslib@^2.0.0, tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - - tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - - type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - - typescript@4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - - unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - - unist-builder@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04" - integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ== - dependencies: - "@types/unist" "^2.0.0" - - unist-util-find-after@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.0.tgz#1101cebf5fed88ae3c6f3fa676e86fd5772a4f32" - integrity sha512-gfpsxKQde7atVF30n5Gff2fQhAc4/HTOV4CvkXpTg9wRfQhZWdXitpyXHWB6YcYgnsxLx+4gGHeVjCTAAp9sjw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - - unist-util-generated@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113" - integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw== - - unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== - - unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz#96f4d543dfb0428edc01ebb928570b602d280c4c" - integrity sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw== - dependencies: - "@types/unist" "^2.0.0" - - unist-util-position@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07" - integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ== - dependencies: - "@types/unist" "^2.0.0" - - unist-util-remove-position@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz#d5b46a7304ac114c8d91990ece085ca7c2c135c8" - integrity sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - - unist-util-stringify-position@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447" - integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg== - dependencies: - "@types/unist" "^2.0.0" - - unist-util-visit-parents@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" - integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - - unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz#868f353e6fce6bf8fa875b251b0f4fec3be709bb" - integrity sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - - unist-util-visit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" - integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^4.0.0" - - unist-util-visit@^4.0.0, unist-util-visit@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.1.tgz#1c4842d70bd3df6cc545276f5164f933390a9aad" - integrity sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - - uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - - vfile-location@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.0.1.tgz#06f2b9244a3565bef91f099359486a08b10d3a95" - integrity sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw== - dependencies: - "@types/unist" "^2.0.0" - vfile "^5.0.0" - - vfile-matter@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-3.0.1.tgz#85e26088e43aa85c04d42ffa3693635fa2bc5624" - integrity sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg== - dependencies: - "@types/js-yaml" "^4.0.0" - is-buffer "^2.0.0" - js-yaml "^4.0.0" - - vfile-message@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.3.tgz#1360c27a99234bebf7bddbbbca67807115e6b0dd" - integrity sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - - vfile@^5.0.0, vfile@^5.3.0: - version "5.3.6" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.6.tgz#61b2e70690cc835a5d0d0fd135beae74e5a39546" - integrity sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - - vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - - vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - - web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - - which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - - xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - - yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - - yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - - zod@^3.20.2: - version "3.20.2" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807" - integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ== - - zustand@^3.7.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" - integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== - - zwitch@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/docs/web/yarn.lock b/docs/web/yarn.lock deleted file mode 100644 index 1e7a1552e6..0000000000 --- a/docs/web/yarn.lock +++ /dev/null @@ -1,3846 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/runtime@^7.10.4", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.4.5": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.6": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@emotion/is-prop-valid@^0.8.2": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/is-prop-valid@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== - dependencies: - "@emotion/memoize" "^0.8.0" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@ethersproject/address@^5.6.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@headlessui/react@^1.7.10": - version "1.7.12" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.12.tgz#9ab2baa3c4f632782631e00937f9531a34033619" - integrity sha512-FhSx5V+Qp0GvbTpaxyS+ymGDDNntCacClWsk/d8Upbr19g3AsPbjfPk4+m2CgJGcuCB5Dz7LpUIOAbvQTyjL2g== - dependencies: - client-only "^0.0.1" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@keplr-wallet/common@0.11.44": - version "0.11.44" - resolved "https://registry.yarnpkg.com/@keplr-wallet/common/-/common-0.11.44.tgz#a861f2791f7ba4e0c79fe43e9dc2b84081184a03" - integrity sha512-GBaan7SHLwlJxL8qDzpYaywPlAMZA8XoY4igNbiXeCDIKjh+up8qsYofVlxv1HxRnLSuKbefkDekdMfU0PnQ+g== - dependencies: - "@keplr-wallet/crypto" "0.11.44" - buffer "^6.0.3" - delay "^4.4.0" - -"@keplr-wallet/cosmos@^0.11.23": - version "0.11.44" - resolved "https://registry.yarnpkg.com/@keplr-wallet/cosmos/-/cosmos-0.11.44.tgz#61da6fea8f10985635e9efc7d04c6dc90ce137f8" - integrity sha512-k9nD+eIpupuwu4hpocFEgGDM3aZKfAl6biidpRquSYH+2mL+6on9UDs00Us8B1nZA81p4NTe2xju5ZKC2+/zDw== - dependencies: - "@ethersproject/address" "^5.6.0" - "@keplr-wallet/common" "0.11.44" - "@keplr-wallet/crypto" "0.11.44" - "@keplr-wallet/proto-types" "0.11.44" - "@keplr-wallet/types" "0.11.44" - "@keplr-wallet/unit" "0.11.44" - axios "^0.27.2" - bech32 "^1.1.4" - buffer "^6.0.3" - long "^4.0.0" - protobufjs "^6.11.2" - -"@keplr-wallet/crypto@0.11.44": - version "0.11.44" - resolved "https://registry.yarnpkg.com/@keplr-wallet/crypto/-/crypto-0.11.44.tgz#c2fba59646d48fbef082926139bddb0773faf2ee" - integrity sha512-RNI59Tex/dnuBLC2TdhjkcgYeOqJYoxC3YZQMiM13u7G7OT48h11hJG6eXik/D7AlXxY+Fj/DhDZ75ywS/DOKA== - dependencies: - "@ethersproject/keccak256" "^5.5.0" - bip32 "^2.0.6" - bip39 "^3.0.3" - bs58check "^2.1.2" - buffer "^6.0.3" - crypto-js "^4.0.0" - elliptic "^6.5.3" - sha.js "^2.4.11" - -"@keplr-wallet/proto-types@0.11.44": - version "0.11.44" - resolved "https://registry.yarnpkg.com/@keplr-wallet/proto-types/-/proto-types-0.11.44.tgz#feca2ee215c957a7391bc66f64d2c36a5f5d3164" - integrity sha512-qwq+VJ0nwU1OCyM70jqebWHvl6XlHB6kXRlBeNnL+FPdyYGzQFgsJeNK9fveY2wFE/gqcPc4oQjHuU0fifvipQ== - dependencies: - long "^4.0.0" - protobufjs "^6.11.2" - -"@keplr-wallet/types@0.11.44", "@keplr-wallet/types@^0.11.26": - version "0.11.44" - resolved "https://registry.yarnpkg.com/@keplr-wallet/types/-/types-0.11.44.tgz#37589ed9c6b20211de8480ecb99edc7b1eaa1e0f" - integrity sha512-QR7oh3r2yFP7vBHVh3MnTt+E+sFV4tATD8b6rnO7ym6B3Novm69TQgo4EM9uqh0LUSnWHPQFN9unyTKtnNvApw== - dependencies: - axios "^0.27.2" - long "^4.0.0" - -"@keplr-wallet/unit@0.11.44": - version "0.11.44" - resolved "https://registry.yarnpkg.com/@keplr-wallet/unit/-/unit-0.11.44.tgz#2fdf9dde9036e7f988d34eb07be4ea03953c55bf" - integrity sha512-gRUDzg/qXaEhQ+fp45RGOMGLrH+5gNlFvSH/9/vFhqlaKKHAhq4Aj8pEZfeZBocpqbrgNca+nv1XnvPgWtzNHw== - dependencies: - "@keplr-wallet/types" "0.11.44" - big-integer "^1.6.48" - utility-types "^3.10.0" - -"@mdx-js/mdx@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" - integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/mdx" "^2.0.0" - estree-util-build-jsx "^2.0.0" - estree-util-is-identifier-name "^2.0.0" - estree-util-to-js "^1.1.0" - estree-walker "^3.0.0" - hast-util-to-estree "^2.0.0" - markdown-extensions "^1.0.0" - periscopic "^3.0.0" - remark-mdx "^2.0.0" - remark-parse "^10.0.0" - remark-rehype "^10.0.0" - unified "^10.0.0" - unist-util-position-from-estree "^1.0.0" - unist-util-stringify-position "^3.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" - -"@mdx-js/react@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" - integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== - dependencies: - "@types/mdx" "^2.0.0" - "@types/react" ">=16" - -"@napi-rs/simple-git-android-arm-eabi@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz#303bea1ec00db24466e3b3ba13de337d87c5371b" - integrity sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g== - -"@napi-rs/simple-git-android-arm64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz#42c8d04287364fd1619002629fa52183dcf462ee" - integrity sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g== - -"@napi-rs/simple-git-darwin-arm64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz#e210808e6d646d6efecea84c67ced8eb44a8f821" - integrity sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ== - -"@napi-rs/simple-git-darwin-x64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz#d717525c33e0dfd8a6d6215da2fcbc0ad40011e1" - integrity sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA== - -"@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz#03e7b2dd299c10e61bbf29f405ea74f6571cf6a1" - integrity sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ== - -"@napi-rs/simple-git-linux-arm64-gnu@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz#945123f75c9a36fd0364e789ce06cd29a74a43cc" - integrity sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA== - -"@napi-rs/simple-git-linux-arm64-musl@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz#2c20a0bff7c08f60b033ed7056dcb07bbbff8310" - integrity sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow== - -"@napi-rs/simple-git-linux-x64-gnu@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz#980e22b7376252a0767298ec801d374d97553da1" - integrity sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw== - -"@napi-rs/simple-git-linux-x64-musl@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz#edca3b2833dc5d3fc9151f5b931f7b14478ccca4" - integrity sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ== - -"@napi-rs/simple-git-win32-arm64-msvc@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz#3ac4c7fe816a2cdafabd091ded76161d1ba1fe88" - integrity sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA== - -"@napi-rs/simple-git-win32-x64-msvc@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz#3b825bc2cb1c7ff535a3ca03768142d68bbf5c19" - integrity sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew== - -"@napi-rs/simple-git@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.8.tgz#391cb58436d50bd32d924611d45bdc41f5e7607a" - integrity sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA== - optionalDependencies: - "@napi-rs/simple-git-android-arm-eabi" "0.1.8" - "@napi-rs/simple-git-android-arm64" "0.1.8" - "@napi-rs/simple-git-darwin-arm64" "0.1.8" - "@napi-rs/simple-git-darwin-x64" "0.1.8" - "@napi-rs/simple-git-linux-arm-gnueabihf" "0.1.8" - "@napi-rs/simple-git-linux-arm64-gnu" "0.1.8" - "@napi-rs/simple-git-linux-arm64-musl" "0.1.8" - "@napi-rs/simple-git-linux-x64-gnu" "0.1.8" - "@napi-rs/simple-git-linux-x64-musl" "0.1.8" - "@napi-rs/simple-git-win32-arm64-msvc" "0.1.8" - "@napi-rs/simple-git-win32-x64-msvc" "0.1.8" - -"@next/env@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.3.tgz#77ca49edb3c1d7c5263bb8f2ebe686080e98279e" - integrity sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow== - -"@next/swc-android-arm-eabi@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.3.tgz#85eed560c87c7996558c868a117be9780778f192" - integrity sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw== - -"@next/swc-android-arm64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.3.tgz#8ac54ca9795a48afc4631b4823a4864bd5db0129" - integrity sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w== - -"@next/swc-darwin-arm64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.3.tgz#f674e3c65aec505b6d218a662ade3fe248ccdbda" - integrity sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w== - -"@next/swc-darwin-x64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.3.tgz#a15ea7fb4c46034a8f5e387906d0cad08387075a" - integrity sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw== - -"@next/swc-freebsd-x64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.3.tgz#f7ac6ae4f7d706ff2431f33e40230a554c8c2cbc" - integrity sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g== - -"@next/swc-linux-arm-gnueabihf@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.3.tgz#84ad9e9679d55542a23b590ad9f2e1e9b2df62f7" - integrity sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA== - -"@next/swc-linux-arm64-gnu@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.3.tgz#56f9175bc632d647c60b9e8bedc0875edf92d8b7" - integrity sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA== - -"@next/swc-linux-arm64-musl@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.3.tgz#7d4cf00e8f1729a3de464da0624773f5d0d14888" - integrity sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g== - -"@next/swc-linux-x64-gnu@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.3.tgz#17de404910c4ebf7a1d366b19334d7e27e126ab0" - integrity sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ== - -"@next/swc-linux-x64-musl@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.3.tgz#07cb7b7f3a3a98034e2533f82638a9b099ba4ab1" - integrity sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA== - -"@next/swc-win32-arm64-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.3.tgz#b9ac98c954c71ec9de45d3497a8585096b873152" - integrity sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ== - -"@next/swc-win32-ia32-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.3.tgz#5ec48653a48fd664e940c69c96bba698fdae92eb" - integrity sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA== - -"@next/swc-win32-x64-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.3.tgz#cd432f280beb8d8de5b7cd2501e9f502e9f3dd72" - integrity sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q== - -"@noble/hashes@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@react-spring/animated@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.1.tgz#0f2d78184ee0cce703acd41abb87ea56765b5713" - integrity sha512-EX5KAD9y7sD43TnLeTNG1MgUVpuRO1YaSJRPawHNRgUWYfILge3s85anny4S4eTJGpdp5OoFV2kx9fsfeo0qsw== - dependencies: - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/core@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.1.tgz#cfe176a48ee0a05545b1af5f2fbae718b50e9a99" - integrity sha512-8K9/FaRn5VvMa24mbwYxwkALnAAyMRdmQXrARZLcBW2vxLJ6uw9Cy3d06Z8M12kEqF2bDlccaCSDsn2bSz+Q4A== - dependencies: - "@react-spring/animated" "~9.7.1" - "@react-spring/rafz" "~9.7.1" - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/konva@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/konva/-/konva-9.7.1.tgz#25640892f88bde06c3ab96c875e5f7408abbce43" - integrity sha512-74svXHtUJi6Tvk9mNLUV1/1WfU8MdWsTK6JUpvmJr/rUr8r3FdOokk22icbgEg6AjxCkIf5e2WFovCCHUSyS0w== - dependencies: - "@react-spring/animated" "~9.7.1" - "@react-spring/core" "~9.7.1" - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/native@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/native/-/native-9.7.1.tgz#3f397f946fc9a7dd4d7d432f8c0a4726d7723751" - integrity sha512-dHWeH0UuE+Rxc3YZFLp8Aq0RBP07sdOgI7pLVG46OzkMRs2RtJeWJxB6UXIWAgcYDqWDk2REAPhLD3ItDl0tDQ== - dependencies: - "@react-spring/animated" "~9.7.1" - "@react-spring/core" "~9.7.1" - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/rafz@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.1.tgz#bdfea463fcb5ddc4e7253a8fa3870dd52ebbc59a" - integrity sha512-JSsrRfbEJvuE3w/uvU3mCTuWwpQcBXkwoW14lBgzK9XJhuxmscGo59AgJUpFkGOiGAVXFBGB+nEXtSinFsopgw== - -"@react-spring/shared@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.1.tgz#29611bb63d0c9e1ac18b6ced7aa4db1d48d136f3" - integrity sha512-R2kZ+VOO6IBeIAYTIA3C1XZ0ZVg/dDP5FKtWaY8k5akMer9iqf5H9BU0jyt3Qtxn0qQY7whQdf6MTcWtKeaawg== - dependencies: - "@react-spring/rafz" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/three@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.7.1.tgz#0dab3b5e96bb6e10db0a1363938e46fc68a861e4" - integrity sha512-5leUe0PDwIIw1M3GN3788zwTY4Ykyy+kNvQmg9+Hqs1DN3T8J1ovRTGwqWfGAu4ApTta9p5BH7SWNxxt3NO59Q== - dependencies: - "@react-spring/animated" "~9.7.1" - "@react-spring/core" "~9.7.1" - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/types@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.1.tgz#b540752a479d210c6fb68d2b1d5ff35556df4308" - integrity sha512-yBcyfKUeZv9wf/ZFrQszvhSPuDx6Py6yMJzpMnS+zxcZmhXPeOCKZSHwqrUz1WxvuRckUhlgb7eNI/x5e1e8CA== - -"@react-spring/web@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.1.tgz#a9ee730d06c686b8432cd20f41683b1acb9b6300" - integrity sha512-6uUE5MyKqdrJnIJqlDN/AXf3i8PjOQzUuT26nkpsYxUGOk7c+vZVPcfrExLSoKzTb9kF0i66DcqzO5fXz/Z1AA== - dependencies: - "@react-spring/animated" "~9.7.1" - "@react-spring/core" "~9.7.1" - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@react-spring/zdog@~9.7.1": - version "9.7.1" - resolved "https://registry.yarnpkg.com/@react-spring/zdog/-/zdog-9.7.1.tgz#474a1366d7b71d623e0dff0e37a243b505e8c1a6" - integrity sha512-FeDws+7ZSoi91TUjxKnq3xmdOW6fthmqky6zSPIZq1NomeyO7+xwbxjtu15IqoWG4DJ9pouVZDijvBQXUNl0Mw== - dependencies: - "@react-spring/animated" "~9.7.1" - "@react-spring/core" "~9.7.1" - "@react-spring/shared" "~9.7.1" - "@react-spring/types" "~9.7.1" - -"@swc/helpers@0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" - integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== - dependencies: - tslib "^2.4.0" - -"@types/acorn@^4.0.0": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" - integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== - dependencies: - "@types/estree" "*" - -"@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - -"@types/estree-jsx@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.0.tgz#7bfc979ab9f692b492017df42520f7f765e98df1" - integrity sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ== - dependencies: - "@types/estree" "*" - -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/js-yaml@^4.0.0": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" - integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== - -"@types/katex@^0.11.0": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5" - integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg== - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - -"@types/mdx@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.3.tgz#43fd32414f17fcbeced3578109a6edd877a2d96e" - integrity sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ== - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node@10.12.18": - version "10.12.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" - integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== - -"@types/node@18.13.0": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== - -"@types/node@>=13.7.0": - version "18.14.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.5.tgz#4a13a6445862159303fc38586598a9396fc408b3" - integrity sha512-CRT4tMK/DHYhw1fcCEBwME9CSaZNclxfzVMe7GsO6ULSwsttbj70wSiX6rZdIjGblu93sTJxLdhNIT85KKI7Qw== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react@>=16": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -acorn-jsx@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.0.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -ansi-sequence-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" - integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== - -ansi-styles@^3.1.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -arch@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -arg@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" - integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -astring@^1.8.0: - version "1.8.4" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.4.tgz#6d4c5d8de7be2ead9e4a3cc0e2efb8d759378904" - integrity sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw== - -async@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bech32@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -big-integer@^1.6.48: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -bindings@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bip32@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134" - integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA== - dependencies: - "@types/node" "10.12.18" - bs58check "^2.1.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - tiny-secp256k1 "^1.1.3" - typeforce "^1.11.5" - wif "^2.0.6" - -bip39@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3" - integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A== - dependencies: - "@noble/hashes" "^1.2.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bn.js@^4.11.8, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-lite@^1.0.30001406: - version "1.0.30001460" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz#31d2e26f0a2309860ed3eff154e03890d9d851a7" - integrity sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ== - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chalk@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -character-reference-invalid@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" - integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -client-only@0.0.1, client-only@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -clipboard@^2.0.0: - version "2.0.11" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" - integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - -clipboardy@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" - integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== - dependencies: - arch "^2.1.0" - execa "^0.8.0" - -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -cobe@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cobe/-/cobe-0.6.3.tgz#9c3d45ae3a328b7bf709eb17b02f9caff41b22f0" - integrity sha512-WHr7X4o1ym94GZ96h7b1pNemZJacbOzd02dZtnVwuC4oWBaLg96PBmp2rIS1SAhUDhhC/QyS9WEqkpZIs/ZBTg== - dependencies: - phenomenon "^1.6.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@^2.18.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compute-scroll-into-view@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.0.tgz#95d2f2f4653e7edda74dd1e38edaaa897918e0f0" - integrity sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-hash@^1.1.0, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-js@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-to-react-native@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -debug@^4.0.0, debug@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -delay@^4.4.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/delay/-/delay-4.4.1.tgz#6e02d02946a1b6ab98b39262ced965acba2ac4d1" - integrity sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - -dequal@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-libc@^2.0.0, detect-libc@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -elliptic@^6.4.0, elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -email-addresses@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" - integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estree-util-attach-comments@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" - integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== - dependencies: - "@types/estree" "^1.0.0" - -estree-util-build-jsx@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" - integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== - dependencies: - "@types/estree-jsx" "^1.0.0" - estree-util-is-identifier-name "^2.0.0" - estree-walker "^3.0.0" - -estree-util-is-identifier-name@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" - integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== - -estree-util-to-js@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" - integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== - dependencies: - "@types/estree-jsx" "^1.0.0" - astring "^1.8.0" - source-map "^0.7.0" - -estree-util-value-to-estree@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz#1d3125594b4d6680f666644491e7ac1745a3df49" - integrity sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw== - dependencies: - is-plain-obj "^3.0.0" - -estree-util-visit@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" - integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/unist" "^2.0.0" - -estree-walker@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fault@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== - -filenamify@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" - integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flexsearch@^0.7.21: - version "0.7.31" - resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.31.tgz#065d4110b95083110b9b6c762a71a77cc52e4702" - integrity sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA== - -focus-visible@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" - integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== - -follow-redirects@^1.14.9: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -framer-motion@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.0.1.tgz#62cadfb9ed80599ac9b1c1699dc4e1164c3133c5" - integrity sha512-/N7gBA9gH8PkStyNQ67P/lx8UhL/7Y8z9Ku7FfgOF77sSG8wu8781kX7I5ZUgflRRtQXo8qH4Rev23004G1zcQ== - dependencies: - tslib "^2.4.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -gh-pages@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-5.0.0.tgz#e0893272a0e33f0453e53a3c017c33b91ddd6394" - integrity sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ== - dependencies: - async "^3.2.4" - commander "^2.18.0" - email-addresses "^5.0.0" - filenamify "^4.3.0" - find-cache-dir "^3.3.1" - fs-extra "^8.1.0" - globby "^6.1.0" - -git-up@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" - integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== - dependencies: - is-ssh "^1.4.0" - parse-url "^8.1.0" - -git-url-parse@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" - integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== - dependencies: - git-up "^7.0.0" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -github-slugger@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" - integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== - -glob@^7.0.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== - dependencies: - delegate "^3.1.2" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-obj@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/hash-obj/-/hash-obj-4.0.0.tgz#3fafeb0b5f17994441dbe04efbdee82e26b74c8c" - integrity sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg== - dependencies: - is-obj "^3.0.0" - sort-keys "^5.0.0" - type-fest "^1.0.2" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hast-util-from-parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" - integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hastscript "^7.0.0" - property-information "^6.0.0" - vfile "^5.0.0" - vfile-location "^4.0.0" - web-namespaces "^2.0.0" - -hast-util-is-element@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" - integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-parse-selector@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" - integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== - dependencies: - "@types/hast" "^2.0.0" - -hast-util-to-estree@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.2.tgz#11ab0cd2e70ecf0305151af56e636b1cdfbba0bf" - integrity sha512-YYDwATNdnvZi3Qi84iatPIl1lWpXba1MeNrNbDfJfVzEBZL8uUmtR7mt7bxKBC8kuAuvb0bkojXYZzsNHyHCLg== - dependencies: - "@types/estree" "^1.0.0" - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - estree-util-attach-comments "^2.0.0" - estree-util-is-identifier-name "^2.0.0" - hast-util-whitespace "^2.0.0" - mdast-util-mdx-expression "^1.0.0" - mdast-util-mdxjs-esm "^1.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.1" - unist-util-position "^4.0.0" - zwitch "^2.0.0" - -hast-util-to-text@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" - integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hast-util-is-element "^2.0.0" - unist-util-find-after "^4.0.0" - -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - -hastscript@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" - integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== - dependencies: - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hastscript@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" - integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^3.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - -highlight.js@^11.7.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" - integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== - -highlight.js@~9.15.0, highlight.js@~9.15.1: - version "9.15.10" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.10.tgz#7b18ed75c90348c045eef9ed08ca1319a2219ad2" - integrity sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.0.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -intersection-observer@^0.12.2: - version "0.12.2" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" - integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphabetical@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" - integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-alphanumerical@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" - integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== - dependencies: - is-alphabetical "^2.0.0" - is-decimal "^2.0.0" - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-decimal@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" - integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-hexadecimal@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" - integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== - -is-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-3.0.0.tgz#b0889f1f9f8cb87e87df53a8d1230a2250f8b9be" - integrity sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-reference@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" - integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== - dependencies: - "@types/estree" "*" - -is-ssh@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== - dependencies: - protocols "^2.0.1" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -katex@^0.13.0: - version "0.13.24" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905" - integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w== - dependencies: - commander "^8.0.0" - -katex@^0.15.0: - version "0.15.6" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.15.6.tgz#c4e2f6ced2ac4de1ef6f737fe7c67d3026baa0e5" - integrity sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA== - dependencies: - commander "^8.0.0" - -katex@^0.16.4: - version "0.16.4" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.4.tgz#87021bc3bbd80586ef715aeb476794cba6a49ad4" - integrity sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw== - dependencies: - commander "^8.0.0" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash@^4.17.11: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowlight@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.12.1.tgz#014acf8dd73a370e02ff1cc61debcde3bb1681eb" - integrity sha512-OqaVxMGIESnawn+TU/QMV5BJLbUghUfjDWPAtFqDYDmDtr4FnB+op8xM+pR7nKlauHNUHXGt0VgWatFB8voS5w== - dependencies: - fault "^1.0.2" - highlight.js "~9.15.0" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -markdown-extensions@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" - integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== - -markdown-table@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" - integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== - -match-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" - integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== - dependencies: - "@babel/runtime" "^7.12.5" - remove-accents "0.4.2" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-find-and-replace@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" - integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== - dependencies: - "@types/mdast" "^3.0.0" - escape-string-regexp "^5.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" - integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" - integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== - dependencies: - "@types/mdast" "^3.0.0" - ccount "^2.0.0" - mdast-util-find-and-replace "^2.0.0" - micromark-util-character "^1.0.0" - -mdast-util-gfm-footnote@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" - integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - micromark-util-normalize-identifier "^1.0.0" - -mdast-util-gfm-strikethrough@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" - integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm-table@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" - integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== - dependencies: - "@types/mdast" "^3.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm-task-list-item@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" - integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" - integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== - dependencies: - mdast-util-from-markdown "^1.0.0" - mdast-util-gfm-autolink-literal "^1.0.0" - mdast-util-gfm-footnote "^1.0.0" - mdast-util-gfm-strikethrough "^1.0.0" - mdast-util-gfm-table "^1.0.0" - mdast-util-gfm-task-list-item "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-math@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-2.0.2.tgz#19a06a81f31643f48cc805e7c31edb7ce739242c" - integrity sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ== - dependencies: - "@types/mdast" "^3.0.0" - longest-streak "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-mdx-expression@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" - integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-mdx-jsx@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.2.tgz#694a46164db10c0e9d674a3772b8748dfddd0817" - integrity sha512-o9vBCYQK5ZLGEj3tCGISJGjvafyHRVJlZmfJzSE7xjiogSzIeph/Z4zMY65q4WGRMezQBeAwPlrdymDYYYx0tA== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - ccount "^2.0.0" - mdast-util-from-markdown "^1.1.0" - mdast-util-to-markdown "^1.3.0" - parse-entities "^4.0.0" - stringify-entities "^4.0.0" - unist-util-remove-position "^4.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -mdast-util-mdx@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" - integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== - dependencies: - mdast-util-from-markdown "^1.0.0" - mdast-util-mdx-expression "^1.0.0" - mdast-util-mdx-jsx "^2.0.0" - mdast-util-mdxjs-esm "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-mdxjs-esm@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" - integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-phrasing@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" - integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== - dependencies: - "@types/mdast" "^3.0.0" - unist-util-is "^5.0.0" - -mdast-util-to-hast@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" - integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" - integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz#db859050d79d48cf9896d294de06f3ede7474d16" - integrity sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA== - dependencies: - "@types/mdast" "^3.0.0" - -micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-extension-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" - integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-footnote@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" - integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-strikethrough@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" - integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-table@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" - integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-tagfilter@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" - integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== - dependencies: - micromark-util-types "^1.0.0" - -micromark-extension-gfm-task-list-item@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" - integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" - integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== - dependencies: - micromark-extension-gfm-autolink-literal "^1.0.0" - micromark-extension-gfm-footnote "^1.0.0" - micromark-extension-gfm-strikethrough "^1.0.0" - micromark-extension-gfm-table "^1.0.0" - micromark-extension-gfm-tagfilter "^1.0.0" - micromark-extension-gfm-task-list-item "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-extension-math@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz#bb7d28b907b17f1813dd3d0df2a6df6bb1a4d0e1" - integrity sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA== - dependencies: - "@types/katex" "^0.11.0" - katex "^0.13.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-mdx-expression@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.4.tgz#33fe2c6ee214738255de175a084281c11894ddda" - integrity sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw== - dependencies: - micromark-factory-mdx-expression "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-events-to-acorn "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-mdx-jsx@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz#9f196be5f65eb09d2a49b237a7b3398bba2999be" - integrity sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA== - dependencies: - "@types/acorn" "^4.0.0" - estree-util-is-identifier-name "^2.0.0" - micromark-factory-mdx-expression "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - vfile-message "^3.0.0" - -micromark-extension-mdx-md@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz#382f5df9ee3706dd120b51782a211f31f4760d22" - integrity sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw== - dependencies: - micromark-util-types "^1.0.0" - -micromark-extension-mdxjs-esm@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz#630d9dc9db2c2fd470cac8c1e7a824851267404d" - integrity sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-events-to-acorn "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-position-from-estree "^1.1.0" - uvu "^0.5.0" - vfile-message "^3.0.0" - -micromark-extension-mdxjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz#772644e12fc8299a33e50f59c5aa15727f6689dd" - integrity sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ== - dependencies: - acorn "^8.0.0" - acorn-jsx "^5.0.0" - micromark-extension-mdx-expression "^1.0.0" - micromark-extension-mdx-jsx "^1.0.0" - micromark-extension-mdx-md "^1.0.0" - micromark-extension-mdxjs-esm "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-mdx-expression@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.7.tgz#e38298dc1f7eaf6ba1d9f210531ceae17155c00f" - integrity sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-events-to-acorn "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-position-from-estree "^1.0.0" - uvu "^0.5.0" - vfile-message "^3.0.0" - -micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== - -micromark-util-events-to-acorn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.1.tgz#d5b9dfbc589ece7917de24de0a57b909c0d36583" - integrity sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg== - dependencies: - "@types/acorn" "^4.0.0" - "@types/estree" "^1.0.0" - estree-util-visit "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - vfile-location "^4.0.0" - vfile-message "^3.0.0" - -micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== - -micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== - -micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.3: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@^2.13.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== - -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -next-mdx-remote@^4.2.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz#96b16e2adc54dbcd0a7f204a9a3c3fd269d41abf" - integrity sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ== - dependencies: - "@mdx-js/mdx" "^2.2.1" - "@mdx-js/react" "^2.2.1" - vfile "^5.3.0" - vfile-matter "^3.0.1" - -next-seo@^5.5.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.15.0.tgz#b1a90508599774982909ea44803323c6fb7b50f4" - integrity sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg== - -next-themes@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" - integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== - -next@^13.1.2: - version "13.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-13.2.3.tgz#92d170e7aca421321f230ff80c35c4751035f42e" - integrity sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w== - dependencies: - "@next/env" "13.2.3" - "@swc/helpers" "0.4.14" - caniuse-lite "^1.0.30001406" - postcss "8.4.14" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-android-arm-eabi" "13.2.3" - "@next/swc-android-arm64" "13.2.3" - "@next/swc-darwin-arm64" "13.2.3" - "@next/swc-darwin-x64" "13.2.3" - "@next/swc-freebsd-x64" "13.2.3" - "@next/swc-linux-arm-gnueabihf" "13.2.3" - "@next/swc-linux-arm64-gnu" "13.2.3" - "@next/swc-linux-arm64-musl" "13.2.3" - "@next/swc-linux-x64-gnu" "13.2.3" - "@next/swc-linux-x64-musl" "13.2.3" - "@next/swc-win32-arm64-msvc" "13.2.3" - "@next/swc-win32-ia32-msvc" "13.2.3" - "@next/swc-win32-x64-msvc" "13.2.3" - -nextra-theme-docs@^2.2.3: - version "2.2.17" - resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.2.17.tgz#84b6677ab186ad99c43e3e6923c7c8ae4057905a" - integrity sha512-GTTie4YtTjiBdh3PqSYX5xtOQaCcLWoHWrubR2ikmBMq0GYxM2AX26J6O3gZ/xzzJje+vWmZGOilop/bG2RCog== - dependencies: - "@headlessui/react" "^1.7.10" - "@popperjs/core" "^2.11.6" - clsx "^1.2.1" - flexsearch "^0.7.21" - focus-visible "^5.2.0" - git-url-parse "^13.1.0" - intersection-observer "^0.12.2" - match-sorter "^6.3.1" - next-seo "^5.5.0" - next-themes "^0.2.1" - scroll-into-view-if-needed "^3.0.0" - zod "^3.20.2" - -nextra@^2.2.3: - version "2.2.17" - resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.2.17.tgz#7b7870d8e570848ee3dc4a9354acbb9827fe7360" - integrity sha512-IRfvDfUut6YgbivBVP8cG2DkxEBvODWQFiv7rqHD1tR9lBjiDKugyCi64zl1CiOlW5awc8xmbPDrzYak9l+A/w== - dependencies: - "@mdx-js/mdx" "^2.2.1" - "@mdx-js/react" "^2.2.1" - "@napi-rs/simple-git" "^0.1.8" - github-slugger "^2.0.0" - graceful-fs "^4.2.10" - gray-matter "^4.0.3" - katex "^0.16.4" - lodash.get "^4.4.2" - next-mdx-remote "^4.2.1" - p-limit "^3.1.0" - rehype-katex "^6.0.2" - rehype-pretty-code "0.9.3" - remark-gfm "^3.0.1" - remark-math "^5.1.1" - remark-reading-time "^2.0.1" - shiki "^0.14.0" - slash "^3.0.0" - title "^3.5.3" - unist-util-remove "^3.1.0" - unist-util-visit "^4.1.1" - -node-abi@^3.3.0: - version "3.33.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.33.0.tgz#8b23a0cec84e1c5f5411836de6a9b84bccf26e7f" - integrity sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog== - dependencies: - semver "^7.3.5" - -node-addon-api@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" - integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-entities@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" - integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-entities@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" - integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== - dependencies: - "@types/unist" "^2.0.0" - character-entities "^2.0.0" - character-entities-legacy "^3.0.0" - character-reference-invalid "^2.0.0" - decode-named-character-reference "^1.0.0" - is-alphanumerical "^2.0.0" - is-decimal "^2.0.0" - is-hexadecimal "^2.0.0" - -parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - -parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== - dependencies: - protocols "^2.0.0" - -parse-url@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" - integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== - dependencies: - parse-path "^7.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -periscopic@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" - integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^3.0.0" - is-reference "^3.0.0" - -phenomenon@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/phenomenon/-/phenomenon-1.6.0.tgz#7b5b7647d0b48152cc0846994da3d92e8f6da677" - integrity sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prebuild-install@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prismjs@^1.29.0, prismjs@^1.8.4: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -prismjs@~1.17.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" - integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q== - optionalDependencies: - clipboard "^2.0.0" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== - -protobufjs@^6.11.2: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -protocols@^2.0.0, protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-code-blocks@^0.0.9-0: - version "0.0.9-0" - resolved "https://registry.yarnpkg.com/react-code-blocks/-/react-code-blocks-0.0.9-0.tgz#0c6d04d8a40b74cffe95f24f1a8e62a0fda8c014" - integrity sha512-jdYJVZwGtsr6WIUaqILy5fkF1acf57YV5s0V3+w5o9v3omYnqBeO6EuZi1Vf2x1hahkYGEedsp46+ofdkYlqyw== - dependencies: - "@babel/runtime" "^7.10.4" - react-syntax-highlighter "^12.2.1" - styled-components "^5.1.1" - tslib "^2.0.0" - -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-prism@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/react-prism/-/react-prism-4.3.2.tgz#5c07609539b3ba6f45eb33e7d6a3588df3270c21" - integrity sha512-Z8BzDfWxzhngDtnZFjYj4RgHo7uqiWB4cOCpp//GFEpWbtINbCqHLIpL+q/f8ah5Aokw/uXkBkoLgvYIGgtm4A== - -react-spring@^9.4.5, react-spring@^9.7.1: - version "9.7.1" - resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-9.7.1.tgz#8acfed700823490a4d9d4cf131c5fea12d1aaa93" - integrity sha512-o2+r2DNQDVEuefiz33ZF76DPd/gLq3kbdObJmllGF2IUfv2W6x+ZP0gR97QYCSR4QLbmOl1mPKUBbI+FJdys2Q== - dependencies: - "@react-spring/core" "~9.7.1" - "@react-spring/konva" "~9.7.1" - "@react-spring/native" "~9.7.1" - "@react-spring/three" "~9.7.1" - "@react-spring/web" "~9.7.1" - "@react-spring/zdog" "~9.7.1" - -react-syntax-highlighter@^12.2.1: - version "12.2.1" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-12.2.1.tgz#14d78352da1c1c3f93c6698b70ec7c706b83493e" - integrity sha512-CTsp0ZWijwKRYFg9xhkWD4DSpQqE4vb2NKVMdPAkomnILSmsNBHE0n5GuI5zB+PU3ySVvXvdt9jo+ViD9XibCA== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "~9.15.1" - lowlight "1.12.1" - prismjs "^1.8.4" - refractor "^2.4.1" - -react-text-transition@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/react-text-transition/-/react-text-transition-3.0.2.tgz#b817990a811f0036e608778b4365599836ce7343" - integrity sha512-FH7mgn/iMbN/ZyTuw/tA4h2XFPVZ2m+4t86C8tEeK/rEpUBjWw1MmdY+WPvofLiA4ZwPRBFLNsv6Q5K127Xb7w== - dependencies: - react-spring "^9.4.5" - -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" - integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -reading-time@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -refractor@^2.4.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e" - integrity sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw== - dependencies: - hastscript "^5.0.0" - parse-entities "^1.1.2" - prismjs "~1.17.0" - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -rehype-katex@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.2.tgz#20197bbc10bdf79f6b999bffa6689d7f17226c35" - integrity sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg== - dependencies: - "@types/hast" "^2.0.0" - "@types/katex" "^0.11.0" - hast-util-to-text "^3.1.0" - katex "^0.15.0" - rehype-parse "^8.0.0" - unified "^10.0.0" - unist-util-remove-position "^4.0.0" - unist-util-visit "^4.0.0" - -rehype-parse@^8.0.0: - version "8.0.4" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688" - integrity sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^7.0.0" - parse5 "^6.0.0" - unified "^10.0.0" - -rehype-pretty-code@0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.9.3.tgz#484f3fefea89abde8914afea2f3ce42995755938" - integrity sha512-57i+ifrttqpeQxub0NZ2pRw0aiUPYeBpr234NLWfZ4BfbEaP+29+iCXB1rUMkzoPi6IBC4w4I93mUPgw36IajQ== - dependencies: - hash-obj "^4.0.0" - parse-numeric-range "^1.3.0" - -remark-gfm@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" - integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-gfm "^2.0.0" - micromark-extension-gfm "^2.0.0" - unified "^10.0.0" - -remark-math@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-5.1.1.tgz#459e798d978d4ca032e745af0bac81ddcdf94964" - integrity sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-math "^2.0.0" - micromark-extension-math "^2.0.0" - unified "^10.0.0" - -remark-mdx@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" - integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== - dependencies: - mdast-util-mdx "^2.0.0" - micromark-extension-mdxjs "^1.0.0" - -remark-parse@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - -remark-reading-time@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/remark-reading-time/-/remark-reading-time-2.0.1.tgz#fe8bb8e420db7678dc749385167adb4fc99318f7" - integrity sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw== - dependencies: - estree-util-is-identifier-name "^2.0.0" - estree-util-value-to-estree "^1.3.0" - reading-time "^1.3.0" - unist-util-visit "^3.1.0" - -remark-rehype@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" - -remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -scroll-into-view-if-needed@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.6.tgz#2c803a509c1036bc4a9c009fecc5c145f87e47cf" - integrity sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA== - dependencies: - compute-scroll-into-view "^3.0.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== - -semver@^6.0.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -sharp@^0.31.3: - version "0.31.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.31.3.tgz#60227edc5c2be90e7378a210466c99aefcf32688" - integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg== - dependencies: - color "^4.2.3" - detect-libc "^2.0.1" - node-addon-api "^5.0.0" - prebuild-install "^7.1.1" - semver "^7.3.8" - simple-get "^4.0.1" - tar-fs "^2.1.1" - tunnel-agent "^0.6.0" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shiki@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.1.tgz#9fbe082d0a8aa2ad63df4fbf2ee11ec924aa7ee1" - integrity sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw== - dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" - -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0, simple-get@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sort-keys@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-5.0.0.tgz#5d775f8ae93ecc29bc7312bbf3acac4e36e3c446" - integrity sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw== - dependencies: - is-plain-obj "^4.0.0" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map@^0.7.0: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -style-to-object@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" - integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== - dependencies: - inline-style-parser "0.1.1" - -styled-components@^5.1.1: - version "5.3.8" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.8.tgz#b92e2d10352dc9ecf3b1bc5d27c7500832dcf870" - integrity sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== - dependencies: - has-flag "^2.0.0" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - -tiny-secp256k1@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" - integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA== - dependencies: - bindings "^1.3.0" - bn.js "^4.11.8" - create-hmac "^1.1.7" - elliptic "^6.4.0" - nan "^2.13.2" - -title@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" - integrity sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q== - dependencies: - arg "1.0.0" - chalk "2.3.0" - clipboardy "1.2.2" - titleize "1.0.0" - -titleize@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" - integrity sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== - dependencies: - escape-string-regexp "^1.0.2" - -trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - -tslib@^2.0.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -typeforce@^1.11.5: - version "1.18.0" - resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" - integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== - -typescript@4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unist-util-find-after@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz#80c69c92b0504033638ce11973f4135f2c822e2d" - integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" - integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-remove-position@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" - integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -unist-util-remove@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-3.1.1.tgz#8bfa181aff916bd32a4ed30b3ed76d0c21c077df" - integrity sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" - integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" - integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^4.0.0" - -unist-util-visit@^4.0.0, unist-util-visit@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - -vfile-location@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" - integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== - dependencies: - "@types/unist" "^2.0.0" - vfile "^5.0.0" - -vfile-matter@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-3.0.1.tgz#85e26088e43aa85c04d42ffa3693635fa2bc5624" - integrity sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg== - dependencies: - "@types/js-yaml" "^4.0.0" - is-buffer "^2.0.0" - js-yaml "^4.0.0" - -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^5.0.0, vfile@^5.3.0: - version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - -web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wif@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" - integrity sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ== - dependencies: - bs58check "<3.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.20.2: - version "3.22.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.3.tgz#2fbc96118b174290d94e8896371c95629e87a060" - integrity sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug== - -zwitch@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/docs/yarn.lock b/docs/yarn.lock deleted file mode 100644 index fb57ccd13a..0000000000 --- a/docs/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - From 2a687a24bce4fb605f912c8c23f0870260eb908a Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 17 Oct 2023 11:49:22 -0400 Subject: [PATCH 096/122] chore(docs): finish migration to `docs-monorepo` --- docs/README.md | 1 - docs/img/bear_banner.png | Bin 1633068 -> 0 bytes docs/img/cosmos-sdk-swagger.png | Bin 172818 -> 0 bytes docs/img/header.png | Bin 49572 -> 0 bytes docs/img/metamask-add-network.png | Bin 45870 -> 0 bytes docs/img/milky-way.ico | Bin 140206 -> 0 bytes docs/img/milky-way.png | Bin 30776 -> 0 bytes docs/img/playground.png | Bin 1890787 -> 0 bytes docs/img/polaris_architecture.png | Bin 63781 -> 0 bytes docs/img/staking-example.png | Bin 335775 -> 0 bytes docs/md/_meta.json | 58 - docs/md/architecture.mdx | 23 - docs/md/building-modules/_meta.json | 5 - .../creating-custom-modules.mdx | 5 - docs/md/building-modules/intro-to-modules.mdx | 6 - docs/md/building-modules/list-of-modules.mdx | 9 - docs/md/building-precompiles/_meta.json | 5 - .../creating-custom-precompiles.mdx | 3 - .../intro-to-precompiles.mdx | 34 - .../precompile-performance.mdx | 3 - docs/md/contributing.mdx | 28 - docs/md/erc20-middleware.mdx | 1 - docs/md/evm-on-polaris.mdx | 29 - docs/md/for-frontend-devs/_meta.json | 5 - docs/md/for-frontend-devs/available-tools.mdx | 23 - docs/md/for-frontend-devs/chain-config.mdx | 60 - docs/md/for-frontend-devs/staking-example.mdx | 1212 ----------------- docs/md/for-solidity-devs/_meta.json | 4 - .../md/for-solidity-devs/dev-tools/_meta.json | 4 - .../dev-tools/available-tools.mdx | 10 - .../dev-tools/foundry-polaris.mdx | 565 -------- .../for-solidity-devs/developer-overview.mdx | 43 - docs/md/index.mdx | 24 - docs/md/interacting-with-node/_meta.json | 7 - .../interacting-with-node/gen-brod-sign.mdx | 11 - .../md/interacting-with-node/querying-cli.mdx | 11 - .../interacting-with-node/querying-grpc.mdx | 5 - .../querying-json-rpc.mdx | 67 - .../interacting-with-node/querying-rest.mdx | 34 - docs/md/introduction.mdx | 7 - docs/md/json-rpc-cosmos.mdx | 13 - docs/md/json-rpc.mdx | 31 - docs/md/key-management.mdx | 93 -- docs/md/opcodes.mdx | 201 --- docs/md/precompile-cosmos-overview.mdx | 25 - docs/md/precompile-overview.mdx | 25 - docs/md/running-a-node/_meta.json | 8 - .../running-a-node/running-locally-docker.mdx | 53 - docs/md/running-a-node/running-locally.mdx | 98 -- docs/md/running-a-node/running-on-aws.mdx | 206 --- docs/md/running-a-node/running-on-azure.mdx | 3 - docs/md/running-a-node/running-on-gcp.mdx | 3 - docs/md/system-config.mdx | 45 - docs/md/tracing.mdx | 59 - docs/md/using-metamask.mdx | 48 - 55 files changed, 3213 deletions(-) delete mode 100644 docs/README.md delete mode 100644 docs/img/bear_banner.png delete mode 100644 docs/img/cosmos-sdk-swagger.png delete mode 100644 docs/img/header.png delete mode 100644 docs/img/metamask-add-network.png delete mode 100644 docs/img/milky-way.ico delete mode 100644 docs/img/milky-way.png delete mode 100644 docs/img/playground.png delete mode 100644 docs/img/polaris_architecture.png delete mode 100644 docs/img/staking-example.png delete mode 100644 docs/md/_meta.json delete mode 100644 docs/md/architecture.mdx delete mode 100644 docs/md/building-modules/_meta.json delete mode 100644 docs/md/building-modules/creating-custom-modules.mdx delete mode 100644 docs/md/building-modules/intro-to-modules.mdx delete mode 100644 docs/md/building-modules/list-of-modules.mdx delete mode 100644 docs/md/building-precompiles/_meta.json delete mode 100644 docs/md/building-precompiles/creating-custom-precompiles.mdx delete mode 100644 docs/md/building-precompiles/intro-to-precompiles.mdx delete mode 100644 docs/md/building-precompiles/precompile-performance.mdx delete mode 100644 docs/md/contributing.mdx delete mode 100644 docs/md/erc20-middleware.mdx delete mode 100644 docs/md/evm-on-polaris.mdx delete mode 100644 docs/md/for-frontend-devs/_meta.json delete mode 100644 docs/md/for-frontend-devs/available-tools.mdx delete mode 100644 docs/md/for-frontend-devs/chain-config.mdx delete mode 100644 docs/md/for-frontend-devs/staking-example.mdx delete mode 100644 docs/md/for-solidity-devs/_meta.json delete mode 100644 docs/md/for-solidity-devs/dev-tools/_meta.json delete mode 100644 docs/md/for-solidity-devs/dev-tools/available-tools.mdx delete mode 100644 docs/md/for-solidity-devs/dev-tools/foundry-polaris.mdx delete mode 100644 docs/md/for-solidity-devs/developer-overview.mdx delete mode 100644 docs/md/index.mdx delete mode 100644 docs/md/interacting-with-node/_meta.json delete mode 100644 docs/md/interacting-with-node/gen-brod-sign.mdx delete mode 100644 docs/md/interacting-with-node/querying-cli.mdx delete mode 100644 docs/md/interacting-with-node/querying-grpc.mdx delete mode 100644 docs/md/interacting-with-node/querying-json-rpc.mdx delete mode 100644 docs/md/interacting-with-node/querying-rest.mdx delete mode 100644 docs/md/introduction.mdx delete mode 100644 docs/md/json-rpc-cosmos.mdx delete mode 100644 docs/md/json-rpc.mdx delete mode 100644 docs/md/key-management.mdx delete mode 100644 docs/md/opcodes.mdx delete mode 100644 docs/md/precompile-cosmos-overview.mdx delete mode 100644 docs/md/precompile-overview.mdx delete mode 100644 docs/md/running-a-node/_meta.json delete mode 100644 docs/md/running-a-node/running-locally-docker.mdx delete mode 100644 docs/md/running-a-node/running-locally.mdx delete mode 100644 docs/md/running-a-node/running-on-aws.mdx delete mode 100644 docs/md/running-a-node/running-on-azure.mdx delete mode 100644 docs/md/running-a-node/running-on-gcp.mdx delete mode 100644 docs/md/system-config.mdx delete mode 100644 docs/md/tracing.mdx delete mode 100644 docs/md/using-metamask.mdx diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index c5463f60a3..0000000000 --- a/docs/README.md +++ /dev/null @@ -1 +0,0 @@ -# @cordoruy pls add a readme and stuff explaining how the docs compiling works diff --git a/docs/img/bear_banner.png b/docs/img/bear_banner.png deleted file mode 100644 index c7aa9f5560a149a1b7b76e2d5418b53549611c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633068 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Ʈ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

    0*NrglNI{4G?lTaPKrukks4!P&@q@le!j1h_JL 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�>61T00<#BjyWCfmj6Ex}dufrm8 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

  • FDZ%;-ZF9du)?Ee(DMdiUWIotcHs>YjIt+ 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

    !IOHU5CHC&p zTv9ms#%sEu=hxokT0Zv0E7njm@BQh`*qJ^W!$kIAU1RYkL_9qYZMM_%x7?81g#)zT z#H-BHgD%+g&0uQK2M@ACurX#v#wMBh*txJEt5ZGMn|GZf7Rk>UHPAO5%PPiztJG5H z7_~LP*9G_M)7~bgU;V(k^Y|34O-@Ka(O}|u3!ge!T$3+ukZdtdzp{U%lB0&30wa$4 zdwFRv%*xgzkTXM@BXuN4wG?XnC+x8+5Czz+qvH&YF0@K%tfzgq(a@kTw=}^#=oY=v4GW4L-;5V`LUaV8yXT&cUVT^)IbKI)Qc=4eL_^6}i z&U$ECKSK3_Ef$=U$Be6)<(zDB^ zpdK&ZJBz3$tRjb}ZCV!dcw2JYo?!$`Z&%;5q&H*%md6I2p?h@{?BU-mOm-690v#T{ zpFG&z?x&Fx`rf=OJ_tz4Dhgtxu%MaY0eI^~F9dI!DLiqWZ|uGAs)GE;Lo^2mOiUpW zH*B+|yvtL1Fv3c6yUy#6IVw!uP41W<+IGBmXL-U-+*60sE*(p!>w1YeONfbB?$*)Ba;`PW|%aB^L)Yzm%!z5%5uq@II<~B}$d11PedD*{n?^ni~ z&*B6!Abjp4lXZwdH1-FFX9Uy<-+o(iP?LwJ3@1=k8c6~?ZvDaX000kp0Sq%Z089xC z5BS3kHMlo^|DcmR#{U{=Z-oI2iIRz-qlJ`QFRXhNS>U{;OMg{kFCCj<$+7pxp=M5P zUtUdKOghk#ndfcV$rdIc!-g|u4sFMa0Bt?ah#mVwcJ_2p+)p}q~C%vXVG$GooI)f;@fCWHBY*CJ3_YPz9zzwxXXW@4k>;+x z@9+q}E2_RLu2Jdgz4rLfK0G_3&+Wl`r%OJh;rG2lPY_fAY)zv|JHa40>E*mm0RemJ z`$m7xAmHmDki24sJSo`;^*C6NR^_d*Ljdo#(@pDR>W!7Css>)S1$otW&z3SLMK`ut zGgd2#5__TT;5JS6FYr9gPU9(?VL`kPy zQJra#zaGlO)6z;VewBew$gw+(VHj#2fYiT%4)TKUzY-?Au6(sh`}t5o)*B)nj!9@& zgP_GyuFX-?%I|PL?T2w-gfnwNs(3Pdh>`k&T$Rr_U8${?8hB-MJjh{g%8IhsAUJF~ z**J72aKwT-!jk?@+;>)Fa^73vu@N^^w-8T8=SW$BGbnv04*lKRd2N;yZ5v71cn z@ZIh0IF;c&THzDhh&i_w6UxtTg*ZBSKYfmjQK{Q~0H=v7;(FAeIo`ksHwQH_9ND0i zkLr+RPlC&+Y2Dh@tRP*Fh(#8(l+DpVFCxa8J@UzG`mI?(-Sj#MkN{{C)4|i%@?^^) z4TZosfQ5}*B&c-9Z|zU+iU28;5-mA)rP^ohmx#|L;c>+*M;3N^S>B6&8Q<*hvd$Vv zvft^ISm;(ZCT3fb*^LnK#o45Df&$V6zcol!=%g)R<#CnliD&5+^CaRl{voEL=ri(- zrSPj5Z~k8A3hEn0oe>Ib;Do410Q&Q?@8uha#BtvfHt4~}yQ@D&U!ljJ2@ocDtigFp z{UK53jj}_grfoyc&9;fws&lGU0mcO<3RLZgv0tZCi(#&i1ViRmR(kiwjW0M!AWO&R z!TMGrk+TXx`$IZ~`deU47Xk`&D6$BR{=fRHM;r|}CxcB34T@s7H*HawR>Vi2#L_NZtANDB+83pZ&b8vQeA zR^ybvtWrUwlDv}8H5D$EBbeyo$cny!2cmUkvLB%scrBT4R^IQ&_VG;RC8ba~TJjKk z=9@WI=!lP4@xbJrf!X^3)5_2*4#f&tngez zHBqBfWE$xjk6TwUvAJM*g`?lpB06nL-$lCHzl1UM6NTOI?;6rhXnTsAXk)fB_onrn z?O5fGdRO1489lz@>Etrj65>^y8I5;>o&Xn)y9*eIm;{r-SRa$*pki))JR~H_(2QgE zV;z-BcNxd33-OeP6j|GXibl*WgtidLay!oWIx~@FYFg(jfGrtr?qF-t_GFpv%xd(w z?xVF{tzArL#7Dq7hTXtg71}dboro7!YC50}YeQjQh*M><^0P4QLB058#s7Kb{j)!oG(SXe64s zJ}$F}tJYsL9GK7c;ky)81{x+ScWlH;MV7|x;M*i zVy^cRRgd{bnFxi&t3)woVunJdW9%0^L3K*$V|4!Qwk?f0(-t2U9Dt~`RaB^HnK%Mn z(g<}NdF12OjB1W;rmvoH<9IW4PVcw6-_np#q0}R?k@M#)l`OK4x_eTCUGyY=+H^*x zruDM@CM@}OC1v(uWYB15-wgq7o4bhI0Y!Lct(U%Z1cC^QZoj!YxH+B z*?ehGK?zjQuVr|zqd*FgBhr=Duxdc`-8H9dOp!t-aZ=`#*C!{jIVt2J4{AlDxULDl zLgckA=A`5{{2Xu5;idC$}vRZnbSETZ;HF)yqwN{%i;+B)X7{X`CS*<-&9dd1=AcJa+;^`dM zv$@RV7!K%^Rei8`F$Oc{I3B4Y$gB2i#D*x_Q2$xSiXT7_#8aB4wKxeui*~~ds`v|Y zYKC4sVbFDpe)F7dF)r2*1}Vx)k!dP$82uA;$0p=J+n&SL>f4q`^EbmQ5#yM2v2}-F zkCq7@l5ZbqR<1p+gGy9tgAAASR=SJ@$IFzE)4}19h;HopT1-+$dqrz2_jg&roi}ow z0Xtoi8vF9c0o+h>^Q}|SD^lOGwT9nw$o@TTL}Ou$cmQoFK`@D1mAN;z;ZTMR6#BghYViV?!Rf*rB6)r$PGrzpBH3xGA~GYkDPB=@YvZ zffphMbbQ#i5|>r%ztiM>qjtInKT(OM7lzHK?(s;U161xtm?PR$rrj0#y!cVW?=^()+W!neMyg_BJ*%*UPS9JNa!r6ui#Ol9o%vqrs zeM4Bypm$H40?$ewOTJNMCYXV}AS}Kg-2}BuSr;nCf(t$K-YnPRJ2>hrT=fM=x>LbF z9mlfOFklEPvyVS;_dS$MKJ@{rvtD*BUoVWN>c_DYuARv&9y|HCU2AZRM>E-%d$1baCc0~o+IEr`qOS9~Go_zwD{Q@_e z_iI8hr7nnUE`^Ny?oOCIL?Anvb58AHX&gF_^GNg8=cv)>8)ArpfSX!mR)8^jGD6|0WlC5*pL|yVsUc!W8lGr=rX+;1gnz~wXPj{f z-1!Qki+)k+CrD9#$k|leumFQ&A9gG0fYt-BDraj{Tdh^H>>!Do+lanfc?0q_0%h7B ze=a~&0g9%k=FL%!Z+WGSDDMCb;4Dj5tE%ZrC`>|}grof{_R9rHCn9ksiRQ4s7vay% zWO2Dce}Yx3X1xUp>)YF#XFL{jleT`Yx*(WNN>(P#MH!`t1^Rm~kP1TC7Z3XK|AQX> z2a@X%=K)Q$!z?^#i~s)@aY(?qZd!#BP!-8HMoyqbZrdVGO^;lXkRy*)?PmFsudG+t zsQ+H3<@zl;J9Qg!_3RN!jqj(rAo5#uf-MFxD%OMUviQ4qyk7!Nc-Bv(2_7RW*{h^iU!V<$8@XvhotohJ zuhiZcNk-D6OHSw1<+$^ME5STO16f`hA=VOQ~Kk(QPzS$4f6qx%%;| z05DJ287B`@9B^~!5({8eCv$l9!S;P-sH9j;O8}8D5`XKJC+R|YOM7<*O*AvX8OlAa zUV1$w81^%%l;<)QVNt7^ne;3GkBUv@CN1ha3O{ux6bF&-I4YMc4+LHp%e{co<);+o zy{;G2?~5a83}-kDAKV@S`Oc^jjFT## zGV@Us&kQ-7T_RN&E)N(W^cXvlIip1!lSGwUe#XBClYsk?j8H~xwX4R>SFX^`D4}w-#;u)fp>uoFqFiAW%!ZW_xi3 zC9iZx#UsS8R{_6D^1!AsYYtX9*B;`X1IhZqEFf4iJqF?0vlt#PPjz71&6}^ z=Y1tLfe8JSEH~&MUZ(o%yHm>1cQ<^x&C60II2LkQ86uUQ$lXT?a|J^XE3_!jA$4e%uOH3B`mZm7CmzbTz&Xq%%a44r*ZDE{@H?b?{6_>J_m0iq z#==KN%jPUlB^z$Te;@%OrV<4ZP-;M$(E~11aw(Q6+9|b1UOG^uB8GSqy#6E~QG}ra zq`KFpT5Gu#%6=_|GA4H9x+}N~gY17eEVD=o$V7>AQdGoyg_a6@-H*E;CdvcsO&JJ$ zdWZIwEK4SPmPF%Cf*1Y68`|3}Pc%pj^WXgqPb{{nwlubkNJYtpm!4hHxT4d6xf>{JiD zx<+59?t(77`Nj895(QfG6$*_ES{`Pl{f?Eai&cjgiFoOAa!vGH&23JsmSBF%GWQW& z+lw%IP_tDDp8TysOg;Zx;@Q4Thd>M$hv|4m3vH}4;(OKQ!WAGmX3BsEU;U*w7Hs)4#BnbE)lDY<>ZVbX;N<`6rVY?Ux$s5;d8_zzGI4AMJK);Ou!oQG zhcp=(K#pr>>eksoBpIZ@32FvL$fF=hVj_e#JmwVfy4g9eKQ}S1@ zAKs26=K?O|3X9mNe7+}Yc6&eM$kOTZy?KwZ7lx{cZxSS(i2Aj^)-;ruTPD7gLe@3v*}8LVZ*McGcO)}syNe&IZa340BTct4;q*mfCwbV^f>w!c$E ze4g4qg$xh#5n_Bz`x#GwDe5~JK-;l5)ND1gYFi+Z`S|zf)I!fnPjy3$a0{4x# zF8tS^PlPncG~kfjd)uF(%#E85VZP4%+Sqizg7 z*QwA9?>R>+Ar!I)tHXg;CJSgkc3hviLl#cv0;J1ju93o%6o?kR z?j#XY%}E^YkIf;xSqlMl$;2q$0!bC^_T~e3lO5ti=wJK=aPq^Mz62xg50g3)!dy5x zx&{9tpRoVgcLm>g#f|S6Mcj~8R95KKTf~FoOduSuBuG#6d39~IV)zlADp%S9ey;!Z zjJ`>8g0Y(p1mx=U_|pLh5kABVSjobXUR6#g8y`Ff!iEsM>Xakk@ABYEvFK<_8Nuh3s$3fbD0O^V>8~h(wrYe#NrAswq8sg7N7f~`iJM++ zm{DadB6oHr&uKwYc^gVU4V_-Te{Im#@`98l{!&pFCenP-Bjt0%nv>BbX_#1y>01DM z>f@+Bf;R}v)u+$S)~5vv4v(P_pLYy|rLBuC0Dx{b7z&XtvB6(&~3f{ouJ%;qxSz zpQ0Z%Tu2UtmP|9Nz?|WmaCK>;McljVckdL{&gHvyra0V$Y=?>5$PpRV1Ire+xPP@j zS^g7^FPleZnyyh-I@gR4dH)ktCmM?}A%T=(n%{>j3?^7YZ$9CD3DR19M~qxKUz7b% zn8yPrOTb!ODc8{uj!n;ZsR4uuHt02g4xkz&ET2(HD1(az6q1Q$#@?WD@AEaJ!j z)!OKoRmaMi2;cA+aqYrJ8(+{czzLonULlBsW>qO+X|Z$?3dL1l?aSds)tew|F}UWo zzxK{6S@&5mnRx2b_e_Z2KI;8<0bXxtk)%*maqo_ZeQ)+yA!JLzk%?7mjJ+*ReAC< ziin@6a}t9z|CKUagHWSRW>0_m>25czRnCOrt+g|HwlijmwB%vUTUY2T#S&EV43i=t z^0&^KiUCjb+Jxe8&JSWT%cI}AdYqRLWqc7~=t~S^N0)q^hquUr* zzX;1Q8g}aels3I$)48TV)uM?OzkgT8{A9JdQcAa3Y59Lty=7FJTNf@01cC)A8l2*8 z#i4kiMGB=9C>q?|-QA(MyE{cnk>FCKxVyVM^rU<5@1ApiWh5CH`Lo`+=6q~^EFv&2 zt_@q&9yd8=0z$jqsenFs>HMv$PuMJf2w0M1BvpEni*+`xGqVwQgn}K@`Dsuq=6MsB&l0Zheqs`uuxcU-VIG2o z8GNP#THAAxygh=4@)SP2jn-B6kH(TDY_b*-!C8k5$2+rcC=ef_0Oixf7e^zTp72TE z>7D{~?`WQob*tC4*s+eh>n+3EJ;JRP$q)@cF;Af@Ra5RWl+_7@U3f}`rS5rT;EUcW>dkJ#B1qhcldbD$Z4Flwsr&?z@7ETBo3RwG3y9x7 zyPvS+3f7}%0O#)rv(w=^+(lNXRCen=wBN2VkB#N1mu^hI?w0>sx9fVv`sg0!srYD3 zC%r^IpngD<41zyU)@*d|Ca)2Nu^p&DmYen9#~8kpSQ)NRKN_%YM{+`-_r!;PH6oOT zzSc{q`?(VT9B5dA4xcJx@31f3t|MCHtU^K5-xkPkiUWHY)z=G}JP`*Y0;@0+yBe_y zm(({eO^Th*n5B_D!WeWrebsHU7b6lP8DEQsafx+jetp2&9N-%stZJYEhs&Dy%fy76 zC;n(1_2N-wt|oi^Qvo5#G*y+AVV@_07B>XF!K1>-Zl^BNt{*xI%5WrME~z zWJFXB>JX$%n)rQG3o3RU78Obv%YfD?b`~ku)fS$kZbM_U^hWyVeVoHZ-cKbztPJE# z3XJluVtz&xZ`=a1JI&}e4EUX$?EJy zN6zAW2s{e=Qh&Y`2O-ON0Qfe``FOUBEQnX-hiODX!>W%ge(4C6GC?O zayf+0NA%>=W+O3Y+#Cnm;-^)B8BffFbriwbSq}0gS&q1AZ$`Z|%S4o?I#}y;_3)i6 z&`FRukNu(1N4neMt4e8^39AWj77uWuu}|`@P4vMarTq_mO^U+N+5q#glI@+!R|QC@ zpMi<*=%4--z<~Gv#>l@cn<044GhVESZu&LQ863K1{VUpY;WhAzC}*W~jO;tjzqn^; z0KDMmUMSc8e>f;5Fkau6^&v+JRFLTBS&MQlJ)(1^)k!#rzRgu(TZ_{P8oK*_Fb~O4 z-Fs=?v%TEy<>Tujd~c{T71gcAL^lMv+2(wa4-x$AN7{m}vB?+3O{~|s|5`fm7&Z5$ zPA1GV7=HFBES7lpMq|(bv!s+}UQ+&Yrf))t@LyH{`_$@2+a}gYR z9+nDM)&%5Bo~U$1QLOj9x8>V?+I6b@IfBYS5jxq6->Je3j0nZ+Jggt__gCRh?hqu? zkG9ZVNQ0CWzA;5i=asB2+R10*ap-Cvfwfz|)oiMJ6J-}!JFoq4d_ag`Oo*Bs@U7-$ zO-cK9hk$M9{=B1>__cQpkv1WAxo%IPGa9f2 z=MTbSnZ+&&5Wo)cL`wC3&2Ba6^Av-L&xqv|4bM=8cRyiv>LXPx`u^OKI;Vzdze*9VnN46x|bP-3Y@B@A`fB zTa@tLJ8?=op|ErAk;xriqb1cdK3(utQ_i+@nH$5$=cUjzuUXZ#{MFrjP0%E6zIzi+~)%wG52fWIP2ygD1n%yIh zZkZVQ>8Cn@2jX3UkoXzb55Ig?nU-g-LN)+(0e>s&Ur_$I{X5yGa zLgwG%yk<-}l`d&5zQ4k@Inq5jiA%DDXtRPD{Okz$h$QI#l^)+Z6c6#9U)kL&2zR%= zL5c2P8XArhn+R|*yh9Zr=8u)-Ckr5)Gtl>|DXYXSX&mcJi#~goM`GHDhX5fPyuM#| z4rLMGkej9b+Ql^4novWJnu()TlN`iIJLF4*l@f;&9NPI?ZE9BCpqmbHW1f>&tOeyU znlzP+$B+xB#R=ipM&l#{M`buGq8zu`K40ipnQu(S;$CFeT0Wd_`9&%8;3|A}(M5qB zPd+;0>nBmFVl)ZQU8vrh5t;#T@R{vQ{#?Bm+;BifyrhWh7P)$|ry;AbSnO?wq?!(- z68+w|EPJU94e7-sg>s5E?$z?5bM`0ELaa#sH1XM zI&;)g?0a#x&P0~$oX~<+Shs$lgV+M0wf+c@mY}dkqC$|OYC@8(GQ={?R_;m$zmKk) zsA5!=U!E26yA=SwfkcVRRqTVL0icb>+10$Gz~HFOSI|C#ozIFFSro#(xh~Tc5%Ig@ zMLi5+QQyISL`t*<>GEU%CCgXoB81m=lo7ncGH~7Gbaufd98}b19_}*@+ib}eB~!$) z%v*Yn5zs&&AO*G~3<-#k8O@0;kv5vEA>ZRhY7QS+_-SX^b!-9z@adwi5oO}(^>FTG ze_4e@xpQPk>d8U{^!Mco0{^+ne{m@>h_|_$cV~|x*VKWKoHR5zpp3=A>Z>XPaAy6?( zcty2z#{4dBjB3g0EQqtRhYj)&RN@W@ar`4wz{%v)kZx2vS3WP<-)N@Tqj;BgT?4I2# zztb<4^E3GC92_RL4n=!R!peNC-vD|oiPjj`*8HXgOdcdQw`31JDxBKuSC;r2eVj;8 z{Y{?JvSbo8?NO_B2U$C#nmR(QB1q-B4)|_T;q)Ye)2-%z&o1|!HKHLV{s`8K=LdjNPTGN# z?^vk_67UmM&WLE!(_xFq)VJl7-g+UzHU+@6I2HYpDG;&Vc|(MR-!$g#-?oQ;F(wAN z6PsqgytSvAS3qqx4bk@w(fLZiLV$kMI;Y#(RMX?(dNkGrr`|TofHU-gfz!4D1c}Yk z*hExyUG)t1+kp$%RH6b>nNWtD;#ED1XutaC(5@0ROnx17!K*fTo z&JuD*SBqf!t)5`3C&H`^$KE}Qm&0X%BLdO8e@pdWdG>!tTL?6M&_O0>N)PiAowBD* z`iI#5^Bp!JfN{ zxguF1v}1Fh)Sh3ZvQl8GD!cob!W;Dhpmo=x1w{xzE1^l)1SNaCrffHmpJY$!?|&U! zJs&-*_$gH_&jnS1KijSFRFi(ktfSora}u{=xQgo2$ZzOF%12QH6X)HrxWen<0lPnD zs9`N}B-Qm~2>xs_L+uGi5+tAT1milLrDOP!RM&WKg{+tRoolw%h_$vE8OG5y7-~{K z7rYSx7t%N54wi2&?7^O`5S9bh=9gAcc)6$E>9{O3p!2*R#fJ?rAEfqA0HhQ9?q>D@Sb$FS$kD@d4dCz0k&mAI#MC*nT6)@2a8-vSZX zcwuFDA9&;jjxp>u*NAjzbRG|DKBkSC;m)%=^$wK0Re`Eiw}MHGFzV02eVLjmH?17R zn0mZmin76Q=b%>aF!!fV+`(n^Jz}Na2xBX5gdfKiY`yK!2o+bm9$oIvLn90KcI%0# z1Cei0bT;_kdi=of?%feR^1d4EHF#R~Y>t(QDt*##X@`AWByyxPFxX4Ypmx^&Ib0bN zu&mv7j~)CB9|@G))7BN=z1hTjE$qoKlJI$P00FpH&8w+o#chY72~Qj~@}sfa#FvEz z7;iv{+-!}vx>+dof1d%^qfj#}CagBvDrgq-&&3n@#ST4;CgskiAgIYX2Wx z9)`z2M84T-~d65PyQ&JkYi)VrBRn9X4*=m{c9?GJ#h0V%3+VdWZ=(#0^b z4;EVD$G!u)6C3+b3E~jeXlEL;S4@EIWwgO3B3}B1T$sEBYyftX5bg8X2`!vm)lhZS``IhljVwrKzNc!a%Uqaa2E;e&>X%%LW-ZksYXQW@u(jbvim@b4Dm)f{4r zy+(`eb4Lc*$2#jj-wry)W@?$y$j5t4Sf%+%pa$q_slza7N#`?+&Wh41Wrjm zGtu}>X$ANxR|feN@xm)GT?4&iYl11>rgl4W2NEYK^pRndnk%Fo%Qyps?o2DKvpaSs zQMnfgIXcKoP$PcaOmy9^4Z{eiDdq4GKhIKszlB)4jQm+m`f=|oJXLgbceQHY<))+M z-T>+hg4<=cn1X-|b~np{<4m--WhM;d>&zR*4m5I_|c+u57z1~D?(00UaZlo?|9&9F!fp_o0 z?ohnTuwai3T}7E-fcT#3iBmKE!z%rIO8`tdmq5@ujy3%DrP?0Cayq{1wd|({(cr;y zEIomAeYhP&!s%MVhROEqHASoW58ot%Kq`clEM4ka+=F-mcP2w?B z8JQmAugRnU^9w+<5SFt5;!h3p0axX&opk9}oe=fr^#zh^U4Dj;#f1*!nx&6EX!P_1 zQ%vA317UwBZv+dF@9$ouoZ;yr`k^bCgv$?Y=c}vIaf(g>x`oBVLyM#)XUuP&-Y?L7 zjk*S8dectcws^@WgfawZ+0}A+BSa>8zic)x;^urPSY>p8Ff=&SVxn`=tp$y9MeYLpgmr|ep%8Arbz4Naj6ZwD{E<^K$z@5u;J-D1 z)ghFRe0L@yK}Q{>Z+%isn1*rigFhI($rOto!uULu^INbUP*WrJ79TYAx$_$DauCs+ z|IdlOEsH0V_MIsz8YlKIu~Mb)%=p7brrN^6bT0~zN8V!&B~y#PVKzbhT#fQMHQi}x z+=XOCOW}Y;=0~C_LA6eg3DkCK0{Pd|9D}}VI?{1bwJG8JC%j|q>*rX{cTdSE_)qv{U)jQV zqXZP8e`Z!jBj07$;{W#s={)D)AhFgN(q1F{Cc{^q`xsT-c{Ys!S%%bNg2f!4HmnuSf$js7?eTKI@uxl-VF&w;Z$}NfN6c!c{Nm_D z0=6S$6uSs{HUA(%;)`qz4vs=#`aT}9Z3bt^&?6zh-}?iG#i)JjMq+l5TL~#L8p;CK zMq4=znpcS2x~`xtE<;QRD(lgyJMS0q_gnjS=2k>k!?{u;V{$}^1TqA5GL&bLF$qW6 zWg2xGqp?!53%!nQVIFt-m@lB@l=}@lb-%?W58+d?)1{;eG2LpV3Vl5e(Qt&I>1nH^ zlg|=u=@Qi)Pidx6Z-xB%dF|`IekK4pv}izy0U{N_ZwK@`AEs+;kgHEI@DU)#YuHDD ze9DwswG1nm&Bz~%6pwg@q=Iw0kv0gMrZFJICA>*!`ior>p+7`Ra}_83$dl$djsw0X zTxiy$a8MeU4WnxjMcC`oa(P|Bg|61VmAjD&acWuml>)127UMxrr+?_wSMTcDI=#bg zrFPJ#DM4IbX8o@k66k;fUS=0Sz1KiQkd%v#Ei-E(CmgyCby69Rsi-%Q-o^)w*ko6U zA&G-hbyz#GG0ab%L#b-UDg(A7d_i$Fs9*H_()J?kmgDXV;4)vdD!j0+QZxn{L0r6R zd*3D+=_878o!|g6Rq<60o1rzzqwa;PQ(3wSLbypZe?0?UU z{ckeufr@cr(iTux!i@aXm07Q~dc@3OJC!5Dn*EnqSa>wfTwV^aI#)ZqDK6d#Ytuhn z=u$};Dl=wkzS-wRQ22Wdh!KDXK0O_kSP3-D({zX%@v_fQio&Hc{Vm4elmtEe~ZLQF3UD6q} zzo~gG$M?M2wzfFJfC#sczzSJuAMbE^*j97%J~&7bY+pKDRkDm=Dj=iEq=od?10c+hR=ceS3Fe z*HgFOE1CtXHTrG{psxyE($y?{hWOx#+Ax}5%s_ZVji%9iLKXL-@&DL z=~}JI^_`-Br&nG;iorPZQO)eEwh%{B1Ep$QfZ7LXC8MTuai@HSm~Lr>rCMd&axQ0E zt{|Mj2)W!+i7%*>#9wF>rec4ZZEQs+KqXf85*heC388+&!@AA21_Sw zI7BhV(9)Vjk1@bR5HK*)Q+gih?raPaj|IUA{#$i>#p9?h*Xug9pQcyt?howO3N>MsoJ%yUEpz1P9fK>tY* z7Ph=;>~L8ghIBaZ>M`b__YOPf56Yh6iqs%xtnhfg6l_C}t#?9w|E7C+6clv~;x~pA zoJnH(J&l7L11p5^#x{DVJ7iO_?jPXjAGcT>j2gwKo-YXh2ej0uLI69ed9Kd*MpAvGrNNW6tifqEbbZ2(XQ#$!+MYoKqXUO|cAMm(`eDL~#| z;hUe*_I6TLdmj>N4V9BPm4cCo8h%q=woAJQ=-#W!GJWoL4VYR~O;0NRQ^%SOatVVO zX831YXiw$1x}((l`%oW$Jlj)YdD5EI@QHn+n6b(VykGobXL)vp@^Q%8BM4fv^z>n6 z*JKwA;HyH(LO1nk4ZoqDUE8iWvA+8kL3%m+YSv*(U~2#bNe-iGeXiyicE~lI zTqGrDt9&!xe!{NE3>OkQ0Dto@JKkGZJ%2Fo=qnQ9`o>l28=^9!hWIt_k39WKPv5(>T=^a z-IWG+#0}#-DU>&5DtRTFXC=Br9wnq2O$y~#Wb{}jNCLQdP6RYzAxTwYzj6r%Gfc3i zoj*I*vJueLGBT1><;f>1qcTO6RqFGmb;-XzqqpF0KHl`)$04X^j7&~9Nr<=yNoR_G ztNFmoi46dpXHXk(1ghL|b^1@Iv@PzI?+m<|*UD3`5`!)A0r(tNKZBl{zznrYPd9P( z5<4b|@D?I|8g2f!9!WKwShz1P9X?1ApRm|@)oQf*M6W;g4OZI}j0<+9@sR?*=A0Ds1zD=-`wZw-*$0uiIU{ z1?XjurT?LHaqZ^oAUbfU$I%-rLnSI6uy5tk}?=#$?~PIMC6}$uvP~96`=l+ zQjNvk<<9~BmiI12SHr3wk@xlxW5j!&Fqjb1Pf}0pju-FkPeDAs1Txq!&hA%D|Ca^u z7a%$SH50;@H4!vnXLG+Sm3ar&(vMioxqD_v5?Y)g|h88Xa75 zx-+AF+3I9akCHOpvt!0lc^%j{e~W4I3sc-xNYGT%sfq5y4E_pcf5pffs^t_(F6Kp-c%t1yX+AK(OeOZl{owo?%`d<&FP zZ0B18cu@5x_16`!J58?K>N*RDMx9&r4Rf=6WVilIBX!QAIex`4(>pQ$2RD~dt8 zlK8K6AW91)1JCnndO;ME8CR_wqphzy4dWBaQeK&4(<23pxqPpp|D?W zMd67z{fClr1oJmqSdc}RV8Bkl6ci4rGu;16{C}DOF_0+-N0SYuhAV&*xqFmHy`Gch zyzkbM%g?*I`ZZ@2og=z1ThRwB*iTVlUC}aveM#s)7*GX=*yT`#Yq%{r5Fq!Yy!gPe zvMve=iN){n)dNn{o<+CGq|RJ=$l8|jGnF}6i+GKps;(SCY7oogPA+v`MGL$vZs2{k`3ZgxO{vk{~NA9#~l9K z?DjKW(2M8$iqFH5WNKmCi(hEV=DsnpB!3d|1c027Jr+2}=HnWmrCFuA)m9=~Kknnu zf@#kydOvM`8QY8=VFd(0YWw7Ks59v0t8hAa4zSZ1kh;{`UHlq7v01z_+rKJSH8%3f`kPoyh7>4IJ3X@C;IvDqa*5#%i^S*Zql z_jdjyYl?m;iek2QXTm#c`c zPu6xcb?cp?Tgkv!{jr+t`Tb(VT-{>T9vFl%SzU(Qorjd3$=IS50wghd9LR2?SQ~s}w&=<_n+qrXTz-AVtzi+d4 zqWGiE^b%$*JTFLDo-1@L02xAW?errhll?J+%AjO(B^-V~ny*kO8SoU&;C;%cyQ+oM zVTuI5<-3!W^$}ywlKkY28qvsT4y)zJl=#i0()vsSQo%W=g}u4*$zZ)nv*JnVkP!Yw z6w3_)0i@Ak=}~WN>v?x^d+y=xvSf4iFCQl1+Kl%l3ru95Dx-Z{t|= zG`q$qD>~LupNA;^87i&9StR06Sg?^*P1_3W+1RWmdjPmd9L%PT3Fcfm9i~;bifO84 zkNUs9-&{yVrp_jY<4NOq7kydaop`T`TOBDAM*qeCTMe^{^A{(p2lkaOy)3)$N;PB? zwfL8Lj|Z^{PG*ustqp^Kvk9lG&^q3kyV=E&<>f^q=)A+MT@>!e+RMX>fP})^!D5)>8B=1Oykbc);#_+41O@K;162{FPw(;Zef18>?aspZp%RZzZ8Zz|yqp zfaJ;G@-)p(mMiwFF{5b;St-frkxcF9-1dax$KmY^)UC30f@Xzzza9j-5;{Uw5rye( zJLvuU)sc-u`()Vaa_yNV53Xl-&1`{{`$c0B%bJ{zkuH3^?+n0Ph zt6KBAYUsDsMXUvM6ZH*>?hP>yitKk~|I0}r)v$Q`itlvqXLY`hlr{>SYfno$hWxrL z>zO7dN?j0Q=RY#aDK9|a;@(xCy{g$O#@7p0IUbACDhDY})2o*DfydMNAR=I(B^tU> zLHX4Dm&VrJxJ}lplf`MTHvm~-ciUukqmGlJMk#bP{Mns$v224$7tdE{c43Jn^q+cZ zW39@X&QL;aXQM{i$a06?{$^{d8fi0M0VV!eY2_-;HG=) z9qscd6Qh`;-gC(fbYx26$T9L`EmfC<-&Bp38AM!+?LD!1MSib`lmiicb?rWlDc{x1 z^rc*>Vuq7}0Nww4SIke1yJ%+M?Uls-|_P5dl@8T}+Ddye9dXe_dQ<3&WsmoLGmSXHV>3~J2IVy}hn zrV#;X*FX-Ul``4MvauPe>2xb~HUfU#^e(&r5(Q3dwc8uoilnRWQmo1b)`nNH1f({@ zy-O#>Uotl9W6U%z1sttcJMF7T8fFmfzYzI9sM9d;tWBF14#RW%K?6a-Gv7!BhQCiNRAv}s9_llfKvo)lMw?BmBa}!qcG}1{u#wS0M9Iz-aQ%YYJ2L_&xe-%15;qr z0`BN|3IWEHsp(fCPe*g!M9{NGlN~__*9&j3=uk8+fQPe$L)z&Ei5BXNBUpc0%Ay&I z79+#M*5|Cqj?ePoESV|B-|nyS#-M;k`b!zhT5Bd_t^m{ zC7x{p?pOZrC(dg4kLil-Y%YVfNF5vG)gr=jy6xwJ<8AT;cj4(vqid?ltSHPX#cc!c zk)EulMX1QwW>4I$&!gFCc37favr5Qn?-1?;O@EhA54<`es98=bYp6V4hU|nX7+eIw z{iHhfa_;DQK1zy0k6XD$=j}nJU*#pUv-C94`S-#lVJ&laoxr>F3T4Dg!AP;KmBl0s zaT2+Ih9nN3IW8e< z+WMD#=LU#8Gn81lFX17CHIWR^r{X(~RQ;Q6 zPUmrn%#j?OAYiV5$!rc%G-wR$<2WdCTr4*DQmf+21f+o^;oCvYTAcL9HjSUzrby&| z9q)%mHAVHcyd#8s|MWebfI~_B`U+?0*dgWigu}Iq1azd-w?8JO=2&nX8M7UiH;qSb zAUZB(+VHhOaVo!Oe7h$Z@3QlH^Fn;DU73?B4Z#+f^Vwy>n%7bByS&hGDO_b>K{G6WFD$@ zUN9O3_?hm$Z6%eb2e@8)M*8^;&&f;(G_Agq_vjIGCQ2FOg>NDRTUv)gch)R)1MeOE z#nJ4J_xOi4W2#*07A;T&{x>|?dj1`!qQ@-mVu7a_>%;U%5p1{YG?i!Qv?;*JmS?#? z|MBO0T%BwgjOSnol;7Ig#F0A>_d^M^V1jOKE@=#1Mnd(+`F2yS$*+M4QcxNQvH@^&>&NQfs;!XL|K zic$7|F4$&>iEKEgn~S;HL3wHCu?jYGbB868SQ%*#Xm4ou<%^EF$St3itP8vvUgb2` zedd*ETzyYb1s^N`O>2b9h=Oy-Fo$;ZAtIHdRY1F`Mt0hPP48pCd`;~z&%x?@VSsVo za@mcarG3T=H9pF4fQv5OBv{?7gJ_3ivd4ITuyNOi4SGVUt{=9ctV`YSX7e}xui6-R zPO-~}0py_Na`3m#z{DBwoVnvUUVE#K|9-Z9Co?F#H#*q7@~2t!Da>ZB;H!aae|KI# zU4zBL;(*+VlU6BPVE!ydOp zO&K?zwZfqf8+JyS9?yRtHDND!kbn>H&YRP3LAa(rm00)i0imrvq5VQ8V@Nzr&U@d2 zU)a1eB=TO;Fo>Hg(AZoSHatiAZDKk~dQl1knySw?*Y7@>R7Sf*sxt36A#;$d1QE*P zg!&=El1yv*@)am6Xdv>%Uapt+2uM%rXE?L;mB|eRyr`mv()2*mf;F|&a{~Ag4uAy+ zbN&=#ZL0x;8r1bRTai;~0|&Og2q@QsWvPTV2)9h4M5nal9bKnn9t#8xd^bBo&|7;G zyFxy+fsUUUqqiO5x?{XcAP=6K!(4hB#s%4y#($0&qY6dz0n#NQZR^87c)h4;h4 z>+3^iluh%4k@hf$?{bLgI$_ez47g&S(#*9W8$199;1;vV>>&_@DPTh3Vf$+CTxB`A z-z+&4n2v4;OkC9`^g*Q`XgK+QETd0c&&zuZf6G#f!a%^e8B~euqJGVAyey8Yi+02V zf(qO;aleNF3E!|>OfhooCt8+wVH4l)Kg9k~A zAE1c^l$K0($Dd>Ebe+h!v+hFinh`B5d~wmQ#5?Qm-0x^fKLP8$%g_BL@fFNT3A0Ba zJPy5{kK6Bee&hG4%dG}cl|sF$VjMxMZe!s}KgrmQFh?^|Ca~KrMNB>VeN&n?9F|9g zC=3@v7U9*56bN}|Lu8UoCIbvW*$Xw;6uvCdn5g-p;5WZOu3t1cBExM(3#QrJxNllV z189G@s~vK0^QUE-VO8S*6Fg$AvTJ3E_@7TIiXR_P4{XjZMcjSVFT?34TiX2gS(GVpDjR#0*}6Uj+<7Mup{97=cP6ml*@B z5l4S$1x?m}F5xQ!vzVYQeR}|1ysY>aIxExNIHWszda&#Si}X=%cp<%VoGvg zw3jM<|3%JhcZ{LR(NF}E$4pId`k{q-r95yWsaxXv|Ho8In&f=z$5Km_YfL@V(j!3+ zMQX6$07P+?Oj|aFAsdc7o%X9R;WKP~g>#j)F8H%@DR7>@O6{m(>I^3?eHLVZoHA9{f|i;e*V+0g;IGPc71DdsxD;CSPx=)*GBFzd+$+0*gyG18V$g zNYAm*Zkr1HH95q|BfaBkn2!0nNoVkT&+`l5?uK@Z!fC_hyo`V(>yz@5F)`nASQ5qy z9^|ld9_>@%$SM{&lb&$UZH>O(L4R@S#C_}=?}Sso8&vZh#9mF*?ljy%i%n$rofZk{ zc;tgE7<&=T5JMuodMI=i-k4zF8vml;^?4;;W*4JG^*lenq`)IYw>kUQ^fZ|Rx?5RP zT>;_MC<7wQ;{0BZ9&=Pn8ZKIQi!=r;!1yo^{;wa0PLtvGz-bmAC8C~^X}QCxNR zw-`C9k0(Pc*YH577InuIK=Y6N8Gr)2=0K!8fPNQML3x*Y6S7f<7%%j};l~WA?9XLW zIm)FA;eGk=6&!HAoU}iG1oKtvN|pxtai19wIe?nuGS}1`f02IHrPcfg7kEz%IPq0Q z{|PfsTO+6ms1LhZYp;79qE_J>g#`hO;j3I38AM_yt3KIuLWG^2_xbc;(RoR}YhgxE zvqwXcEmi%Sop7m9G5r2h zH0cM@82Xz#vK9&Dzj!e65L_E2Ea#cF9tTE$zfYFCHeRk$hmv3&4;SAIM|3ap-6@j; znb;swHV+eVq;XvujFF}vC9B5`RQ~4m^>qH`fY^&G7rjr&W@b#M?KUIbT}M&)wn<|L zXU~CKi7z8#3;K2*B2OlxBkN5R#0i~2501ylx`FgaEo7~PMDlz52~ag*c6%hFSgy{kmBLV8CPCTPT2HsMDonH~xbz0V0BKx6yEwX=_`wo$gs&SC0$c7Bq-lH;xU z{)aYLV$ZTS(OIKV@V*xug*7FM-BgLyFD5=NQNhgnUH8SVVgg(o(Z^kiAKX%Bx59!~IgknoYxB>aOA^-E z4eMwD;;d&PkF~VuR()qk|3*UoYggzNt5*%UeU}FY0TovOS&WuuX>vvzyd$EYZGx z^f46cYV>@+dlkn%u0I?A`zDv+f?t);#=%N{jgjvtmL`+_BEQaPce^}6dc^xUF2Mc7 zj#d^sUe1b0!0_n{>DDm5`k(V;2p6%$D*%MG3r2!s791tNCy_cgHYxD^aF_dLoWCRR zW`DG=ds+9mznrx0rw=cF65cKQJceM(rE%_&dVadGTrN`t)IH9*X;yvaOYAtJv4 zBeYSENg94vo%@*iM#2TC%!4qv)58brzl_H z3qjXKlT?UAF0plPhqtxUF+w}JOW3Uf&T~tQW*M((b}){8VHu)YJh3DaS?}LGK8?5O zUK(UNN$J9jr=1CxbXr+FR!r&<#%*X6?LX@SAObJ*=z-gJ+z{*Tt(I5kcbHnFdnm8c zdYDj|&!!gr5blch2CsnlV5XWDKk8GGEWyI`4&pbQ^XZ zh1hm89vaW#|8QFrhODXGchM;$15rJmnlZYuXiw8Uo?hiBs~^2p4N6R4;5N0uIh%GG za$%cy_yr7*vMO3gq|s;3Fo< zL9#or z%mwpEJ_H_97}>!AKt7;AD$mbWTWzRkRq|jkZdf2wnZ)1P`fpqc@`xB)cF5(W!=iNK z2!ij9y*P8VEc?PC9OmPH>x;1hbIwen$8AAv}Mrt^S zp}UiBM@vA-mn8@XN1N4h+faVk;)+d-8Mea+{o(86IteXN?-A%&Q?u5*7$q@0k%tLE zLj9->d=>N=X-8lz!FN>eUOKCzUZJ0Z7klTlDzfR-6*N&XS8srO>bc(k>CR!Auq>}a zR9p{;ve|}Oq0gPk`ftT&9#6Y1JTx#~#NUh+nCqWwya%}fmWFea#kOb+Ut1SDXHkco zfH{;Ba2}rZdQ0x@3O6CV1yjCpkC-%gV8b{5-7h<5WH;};_VN-6ly^zhC9K$MkOU2v z_~PZ|gZE8ump;^Bd+El*>6M}NdlINa`RwYv4vje{Jy?+DAa(3L(EGGqHNVX8Zzwd& zghYhk3gyb+=7hs;!r||nKovc&z(qwZY1vE!{@|Kf{TrPqy=H`(mZ?=WRqF=kjhtIj z>$`%a@F3W!I}#BT!DWX57>bH6Dd*RO<xmdN90viWUNy)%it`n z)45~JEczq{w(a?xESrxpqs`T>o#pBDrt8;Hy3;w{k1)lHtZw50+C zG52jRD4QWwooSH}`%5%B@SK?+#k=EcOnSJan0bw_1Z*e!P9f>OdYka_KU_GnLAf5Y z$mju~pEfulrdn%ZSaIw;H$kyJ848n!r<+$YycMJCp3#NE?PCM}x|v=VZ~5=HOmb&L z{DepEXSPR>MeFr2a{qHq{!{eDeu-7C)a||%&}#Z*!JTVokC5n2ChMx(tZWrZ@|p2} z5D%<3BLm=iR*~avn)r#=vD}E4d2-+GjDA$q^QVC3;jsheeGDjp?K^k9@%puhN0cb( z=F@1PV9DGR>3sNreJ%A6wEq~J4ZR$%iItz+Dol&IYI?daX$pPgmOOgSvth`HX8(^_ zVjNU)*4t~<^?vIpqutiXYS{E&TU|G(LXOAuJMoR6*bVIo0vn~)hFllD2`l)n%5@u)wTp2 z&lkN(M%^k$Q9{ZWw;ERKZhTu7bxF!YZA=^UF$fxa_xi#`B)@SYDnId~R;nHLQCRO9!L?d2{R;X(;R8#5Xj_gN z=o_LX$>R;hHgGYizjfWV@vv?9QHe%>Lg?G8S@M@bb z;a+G>BGT-};s-U*VvWqxW#)w!m#P9sT~Bw%D|!y()uI(dhu*W6$dig^qLL&}@u^X@ z&M)S5({k5ujxTpsr~&xiTftvyew`5QlMpEVj38V zjubJ1%kcA&ywee}Jf;KCi_&4;CKs|FP3V864QZfwb5H)Ht_y)y&4Bmny@s+p*mGuyBszppEUb$b>Mi~_ zb@C_{fn){Lwc9@nV|*0YL{$6*_jp!x8=cdP#5_{#g7>u;mOU=<>Y&)f_9kCfjE6a8 zrOi)om*B#33Ds1t_rH4o&x>J@pSu_CQ@vJ|*x>~y@L4$I_cA_9WilAC9Q5XAzmqHD ze)&_k!8exw1ljy-Kvmal8iu|xLoRrNbmX(IKL>lRMvd{FhG>fG>gF=}W#K{Ucb!G^ z=15cV%#CM8NjYK~NH;-rvatWl>4jU~n$2S+iNdk9M(T*}Z!e4QPWC!H8fJot9{(m) zmQM5G=1sjJd>Us_pu;<=MopeT46FI?jv~bdFk6^w8X(t`V&?prUJY(tz4w7koI)tm zkXVvhBU~{D9Jy%WfrbRAbZ`+WbUk9YuoVP`9W}waEar8{O{`DEeC?g8r98M2@65ye z4D=}d(ow$_scvj9a;GO(wo;lID+3o_)mR<5#;(a0h2xQu=r8FDLS`Nq|_ zCI_V~j9%_bw6~Xtu}hdsX}ZoCGpDTA|DozFqvG0{Xi;d~-QC^Y2_Xb`cXxM(hF~GM zLvRT0?(XjH5ZsbLAF}#yAtQ@~^wrBdS4(aeChwtMe zT#by@C29-et{q@N@1uXnG6L~8orLqY$R!*qChlUfu3RLU74*;Sq#)kA9YV(bIQ>kj z;Cgcs%!p%0`5jOM-_Y58Tfw|w^}1dMKDi%&U&q$ZnpQiE<{T?!=6zc}QIX>>8sT=u zF;+%qE{(7gV;);c@p`^4b=8XyLFo`i&alGNly%L6~lFE#L|kKCv=#UWz}a)Yav#hWPaXODXno_-Z$kI@i9J-q zdqH$bo&^@-;eSq^e^=mnIlFCzDVD(17;g72X|U-wD9EAVbIDhjLDu91-4KcfzH1!z z)tLKATR#_En~tNKd6p51DmZ6OE!L_yKp_|11hX4!Xi6SBlcuq0?5@#?qD-~)AbmYz z+%}}hH6IH4lJrlp#v+&T6RFf0vgeKqC^-74zrQfaa|n5txJ19AZ;fs{luqn6+WFTX zEam>u#U?_jk{^GIwOqt+qyL2+#q|2fd@@f+u)A0POftFfTy;OPFG+gS+^24AR$Kf<@m5pRY= z`|xtg!MImiOeZ;w7uGt&X_@LJOQqXrowwq9(NHhM&Hx9!7$(la9{$;s;5Rq}@a$`{ zH6ZKfY@!!acs>94eF$yu>LN+xNP;{J$-$ZJepwZZA8}MPlYK2a+~LH8ac$ICJo>hhFh8bE!1Z)k z1dduAadZE=5fd}XH%)6 z1gv*o8HDz@Zf_seTD$y-asvLK&?}8}a1!&i3PS#_xaMM9MuU#FCB}#yHTaYzvP`z} zkju^i+0O{X@gIWg1vy|Pj}6~8MPoHnkF@<}lVV^+nI~%Aq{fr782b}fJ4|HVGl*v@ z<~s*;?~WZ{m8Qsf*4AZZLCXI?vastMDXkAKB}x|#E*L(e+u4}0_j_S<48N0ZKh(@_ zb#kn*aU5Jr(?+i(v(ws*ZsDQlR75GZCg6nTl;PNZ`;L!Gpft9~VIgiCslsbL>(#a5 zbfx^O52Hj3Q#H5WFV!XU#SdLzu$kEJL;6f zl9DQLuq&qAynA{mkcM3KRFC>(ZD(54Os@t*H8BOwqX^zbiTphz^jH1aS3q-`L=DP`P`4yLpn#*8-#7Eq`aj9^_)R~a-aeBgAw6nEy7Dx8d z)GRm_xLQj434=pCfS=M-jm49{v+j0^J>KH_i3hAE_nGs5F+65mYE^@oZW5={Xoa7I zWOsfzaIFi0tlfU(_TM*p(aOKQP*d)I^{4pV@)I@h`jdkMXTZj;ZdxgVpzY&D7^>_W zGIao)pv?@mLr;%Z!8pnYuO6mS6#k7Bx&F@jIQP~Nr>g?axIN9;N1OF_h6I$V->sMe z%{o%YNV@4*CSFE1lLleu40j;`dYIEDeYEm4hH3K%?juPSh<3HaqHI@~*O;7LW?(Rd zr^8SB;Of8v9NI^`U`H0l4nQ`BOuP><;?OYl01ZlOb=D|}wIi>Nu)xmYgWrVrJ)=iq z<{KaWo16$g|KoEr*e`c*xuSc+_=_bM5CR{vheAhKf*MG)O?nW1M&_T7FWMa=DJL_) z&e+(XW=;D93(=>C4%O*VWeu>Q*+Rw@x8&rkf5_bSIVTqVJtk*u%FbLhI5(A2teeX; zY7cDE-W7m(*W1VQ>sYxVds`>_=*ZcK=UrjVn1*=6>Z&`mt7R{2qt4XJ&swzGEmR{` zx{Bwsr5>6Lhv&|^cBE3!+<9g&$8o9f14QPbYbO3hg{=GOXeV?yVkdaX|LaJyS2LrD zlYHw!8Ey1S5n01FPvRpfW@cG(&c`XPp(Ol0V|<1djQyV~Dd8{D0t%tP4txo+osNBB zzt8It!pyUd$jF;yEdt*Ms+_aeZQH)cv_N?oy&pe-I@mA0Eye-m54kEUQ^tn`%wcFLU0 z=qnQs$Eqf2t|#a-7X9t^LKKp`>>u;M6a!MK?)t%k<~x@?*FwX%Z|jfln5TUzWtu>k z_5c2PJSr@+-S6GVfGCeJw(ZwXXk^?me&cLg#RHk{1@yboiD;U+xCX|h2-FKHAfK?x^ACc`(dK9~x;N2s7;eTsPv1=gr!Nu60{$y`)p&Hk4-3i3sBD?3(GY0!_HLI z5Q9}+|UR8xM;mMOQG8SK&&5HtMb|>Ofy-hq*{aXgT;nz zKR`pmr8Zm)atd5M&6D1&3raqOIfl((_Tlivf!VvAU<_G@xbZyDnTl}a)=mWCKU~Di z&z1j)PmF;lxMzC3e~z}hKhq6(41~LZBt?$+MTXYZX%Bd=-6Hgv!nqkJ8={2mVeG}4 zEIDM)+aoV2^UB-#nY9k@W}eZH&TNHdu?l4VCWn6I$~{7kfd7J+>&14{s`EOuVsf`X zVa{Tt*1qL1_-v<&L=gxl);?!oOJi zpZ)EchFGCtHW5Dg0D63$4Y-92oNYi0y}FU6&llKB;Ln@{b6;R9LEavZW8$_^NMB+G@8jW`Qp;vX8Lot ze7`>^_16QY>A}0zwMbT#PW3=%liN03_bn}Y9t5Ch&^Qy*M$NQMy}%*mf-wT^?d19m z=br6m##x6w9ya=9FTar9D8fka?IXvlpO#rTj=Xp|~!Ac1<`RC8!Qp>iV zrIJ_8jl0s7;g(34?=g00yu9&Z#}Lsx?4%`@$X9JdEMtItFakRe4iNo_z8xeG#tExt z=;R!x|1=VXzz#`^P6?@76*+I&6uh>CcO&-376fS6@T%>@OP+u?{1$$qD_P+7z)py< zCJ7E9I`kNdlGa}io%u5(aq@NQ$`je6hO1XmB8R8MbzL`vpj5E5EOShGlMk|$_Tvnd zV0}R=elq(fG6Fc?L}e6`ETt^%I4frl9ic(Cf=~?BzXV-5-ePA)r?42YJ>s(a1th8E zO7;DuIAiraP+9LgEGLj!?^WOiNT4Xjmb7)3+&;*WbY-Eko@y8;&@RwKi&ca zu&vLcr5`~lloWdyYSnbN>(L&yVJI+PkWWpv^~s?`hwm$nOVbX3wbl}PssEO?3ipz% zJt~sTXzwAJSLKkzGEVW_h1AH7-!2v4RZY27p|kyJ48S`k(Kef{Ac?ivFhQS~az%LU zUV+e7wG-eWn}bF24#IN@fbsI5L#8vI2>4`>yWvr9efIlcRKuzyC5)ms}qIwKU;#N z?S)>1r~bX?^)))pOG&U6oCJLZ8TGn5Be`w1^m`2~$UH=6EVK}?A(@tP9P9qIzrTNz zF1`wF$qzbvxghqX7@u0W5ct- zp)rV}>{IyZX0Y!+8g+`4hKF?U^z?IxmlcZ=2n`zhTvOP{foLG={y_f}Dc72>k*+); z`q5wo*T}I^k6$`=TE@FeXD_c~>=i{mA^?9^Vc!2L;7A6K>f^X3Xe;+axi8|ZJ#W5L zf-DE;>En4#Z-dd32mPLhXKW=NKE5mGeSJtwd0>#CFH<(PUZ+l_q3n`Yim%F&N(qL7 z0s@@O@`AO67*t>pV8Dy7)K}?F1P5_PD?0p8$DD(8E{pNdT0`IeYT(?DQMEiLPJNxK zNHa2lNTD-|_fs*OyvW`dYOx6MQ`%@K&-UK@cyqGRYPCri7D5T%wQ=kWP8TVvp&xu_ zMafKLrE)^GoTjqChjXllJkF3sG}W|qg{toIiE^?Bjk~hOnDUrFkFv+ZnlAt6eWlL# zw}TNIHjAq3qky%m!rJ0eizL*XgTtYp5xUj&q{V)0kJ>{H1EwVv?hydZiyw^FD-v+P zAMv3*S4W*7CodhprRgJ75b2vB`{Qjy(>JWDh>%oI@5=HeRvBt_l-IkeNSF}e;k}T! za*F&!#JL~oYNhA>r+L1EL|cy*G!0(Gy>rrto)>XbS?Z8fO>hyEvIH$2#eNLk>$+Vy zVJxi=GTx2_tz&ZWGkd+rF)z@cXR@&E`aTHYJHm?lHm0bLE(v4b>EEa{#-h0Py(vZL zlW-Q)+eL?#D|YbDVZP(KbZS@t`?zqqw9Uw4_*O^(qx{_2bBDw4%+$nB(KIWojamZJ zUJQGQ4rzERPR{~^S!>&}VMj?3KZR6T>b05W)DNT^?@8`?T~wWovsa@+%jv2JV+Hz* z<%cM-v-t0!@t~QK$CZ0;BlKRRc<>pRQ%_Yug%pMpWc&}>Lc8G&vq!$sp}x_|6{h0s z#J}4HApD8^mENub$h4Z9j6AXxte2SZC6Q(f2Ah|FTffmDZ=4|MlvKofFzUCwNw}Z# z`sKv{k|kqP%XD%%&BSM`T$epDjIlypTY}o^q;dk=zt#0qLF(hSUuwfw z4x$GU!}!k|FGSY$CpDFwH1qTs`*CZw+=&egb_QJc8ws26hCVY2U(B*-wFp-rajrcJ zD~EbmP3~o-qbrmqAnPl+k1rfH zkfcpz544%2%f26&iDm?b{>Q zP#tHzBxEHaeq8Cdow60t1C%EAoPK1yu*~V$>j1)-@S0X>PNIbzEyWHfCSow`T`>Vd z)?A!+??mXLz$J2LvJaCJ)=T!)_=djrRylS+aeY8%o?jWBULqs?tdTT^ca#udSA|9L zDRaIdC@qU<<4+@k-Z=Cx`Q58(I5tD!h&69>Nt}{6Ik(Oq$fVT-K9+?8AloY2Z;UnS z6|=r?kS~Qn_dES9?%+cKuE>OMQs=F(Dul7BdD<33Bv5G$^R-Hu-*b^~3 zyt*1YcFD?9?EL|bFUIKb*Z!ly3$o-U0TQ6FltY@yPX;1kxCFAgsTM?QLnBb~syrDbviZ2S_Fe*3X@_yHxF_st09Lh zL4UV_sO{(N``~+Bb49kvwJ}<(rOY9R(I9p)c}6|uE@3RJ(SlpTcrV%a;;H#*1P1kj zf3lgtC!OKtlO=c(wV*9$)%c09SvN(pT+*?w1>uJ4K-|}BuZKm7c!`eF?KoYg$-{Lr zZbs0&*yY)H%IkU&jQ*zEifGs)oKfibE~>0|Ws`G$t#C=p3RU`))~w@-NyB#Ut8q9| zPIUkk1NJ>wGzfa-%WMAL_gD+Jaf%ORpW+O79B%29)KV7wfpwVhO3wM>(mZ3h*rp!e zl{xLG=J5J9;aBSE>>SVr9X$r%m9q<4Im~745gy~n2C1hbaR8|RD%)7Z z3`!5N^fT}dzCU{1v=OvwYP=NL6=`w`hxz%Sa@oqg#Tpx#J#(Dx?G4qTAO1K|RCzaA zMw*1{*ELqOOaWj+wPV@yPOXg$4@iFSLA9zk!+U$@L{6Ld9#{kokY?XYTFWkuDctIY zl2UQi^n2RpGh99qlSuh_Y6HgZY9Omp-<$A1>erT zkRIt~BNfF2Ux7+&ev2*Km+xqq6Cw$XfKduH^f117`I2p)IpX<+M$>liTfodL zOSFtRPjzTr6z#&8nTQ>!L)rw6*&)IZ$Nm@LdI%Fx62gZa`3 z_AAbAVL%TfgMI+j9h*xN5T$xF;O>6iTZW*FrScn?3J_!Mg77o!{7E0bhtS^5N*jLl z&Xhj=plljhJf`VkeVgN9W_}^((V6^h`Oe+H34QCMZahN0da1o^QL;_$ zMTmm6P7;Qi|0|e)wfQepmwx^+(6)f=?!KF>KlD*WDGYV6{Kc7F=ac;Ynf5E<)9KUH z9s2S)i@OjCF>BMXI5!r){DoP@i*C<3@%p>?7!Ho?b`|UKkRD zcuUe0UN33+VahiPRrapzFdz?nY8jVJ&=In`4wEs%YL#4tqCo5q)0+r`bLh7p`Xh*pU9yFE5?RoYC(uV*%pQiNJl@^Kaw{eG320Ab<~UcrK7tT)*5pU1~~l$bc0`QtK_s)+r!U!jM4_EBd$nB zZ;?x0b%Z06WKIe8coKcCGefWP@b*8hlo~6Gwy)Ii>dyMUA}RMriQhby)atP0>9Y*D z{y?YiyY2!S&ZyGI_&FgGDa4Is2x`^`bv7{}(O4&2fqfrp zNuzFH!J8Zif5BclSQ}*b@>?x#g7Y6({meg}QzPnx9dKWmeI$lG3a=q|OZNl$0tlfIPX2m*AD0 zHTr>tbRRdBNb)vLAyS%3`mY$u`8_&qiI z&dmVpTNf%C0;9C>i2TE-8-X>Fh8RQpU@(YqQ~m=ZUCZ^Z(d+d)BCXLIK2_U{NmKIX zBZ?+XazwDZO)yJr9%7i?PU{z3=T$8y002tN3CZuz_&KKUpqsddKg^sy+C_TT~lV8_ykm3^a0CVpvgX& zYtoXrpiPoo;xXx15>bG!q8y;j!quGRzV_=9Ljklh`j`#K)~>9Zgm_P(3iQMa(D zorj&`RluM8l1InlkGL<<2!|OExk$e@pDu*JH@QXE-s9U>>_7p%`Z>VbbCjm)mG2jz zE$Cd=Y3Bz=OYj#-6$6G$F?^wpTR$%|ZfS-dpy&X1J?HL)mc-KVg~3w)k_2>AL95D_ zM#gG(iAMGvo&S0Pkc?!e;xCTNt5>U3WQmcyFPHO-ymou~@}v8Y9rXW4U{$4zd9w&` zYf_QG1xLV&_v;;r>u4ntU>{>i(m`+vgInB`2&Fh%fxstO2(o0xCfH=gUw#|X4yG3W z-N98h7+^SM6U_EDp>$Ir-{m`LGh@+`Aub4iv+$!edlNt$X(yF1z=8*3Q6reRrPb-1 z@Xgh>PbJaBub?VEhqEXn$}>8~jY9kY+Jg=eA4BU`nUKOU7NT?n6 z?HY+>Eb$dy1=o0+!F6%O_s~8WPQiXX5PdnUc_Y?cG3rGf;a4m~hDaC;Zy5OXm<7*6bK-%?R@2nUS9rM>%kVYu@x6xh(7^!` zhusU+%H~fHFU~B+wVF`hj>@`0am{G!vYiOXB+W7D4{b|(YvVb0uDAO^_JDptBc?E3 z%nnz9JMTn^$X*(Lz%s`j0LS$+1nS$)RNvBzzb2WFY27@H^7yyq+ZL8}?)Ux9FNEAe z&!5CUYE1Y4>xTZ3Eu1CEufUQ4>@6zT&zVxQ53fQS_$$sONKa2<+KtN44$+>OeW$eR zXIom%Rc64=Te9zW7mawE6?s?!g8|qcUDDBAGKl9RUQUUSf+ikD3+)sp@eh@fHk=va z1QU%yBl1W{e_%^H_r41@U2c_vG+HfL5O*pS9_2ZY zcM<{9KdySQIW}n^h1#M8Q}ohuMPPx;mBVU88T(2qf52X%xF-ks&-Qy)8nvCp_`p>> z=awurC`AI3sJGyxBHSlC=nt*bY{CQRq_i0&XvC7eslS)J-xA9bnrl#1&#u7++wxAI z#XfvUW=ue1%e*2?)1Z}QtRS&J@P=G!osI-qwB5*K?%H-Yl!P&ec=9*H@RE1#FL&&g z4QdC9e2FBKKw3nGglx>cA4F)MCIcI|KuH?rMT6qywk(Pol~GUkisn!n$>}X=%q+$l z7WNZU9vUa)PVXew^dH*?N=V!001BcW@I|wZi17!1UTAscavh^|eCweV(@DQsGI_^B zX3B2xfOWf4r@)ZD8qHb*7GuulZ$#WotCg4+%_)edCE{&=(viln6IS1h5s$4LR_9g| zx8H;wJOv^?1W}gvKR2N}3vuZs!#^byOGaivraU_@Bw@85`KU57VaLbGb03Gvle=V} zjv67NOCBWi3t&V(t|F;&GKTSHfFW&%HC*ABL^Nz#@( zA~M%$3rXqs>a{;H% z*7Y_a0~MEERemVivSSp$Q5lZWOgvbs3zkc-w+!5&adFPP>@tz9qJu+Aunvb(?}`IL zy2P;Q=;TcXjpqA*fn!i<_x>kts`r)w3m$vcHhhX{Sbsft~wq_~h)rEE6wc?o+oTN8qIZ zl%qFOuf|_Jbcc_OSDLLh?+}Zc{iU6i2q2?oVW?|q%H_*_c~-psv*)Z9=v?bk4u zS>RX(dWa3l>p*?RD>o-j!t9{YS$wwcPhpmsi9khhg5~f{X25gOzR}h^fCYES$$>*L zuf5BSV64NdTbJ8-OB7^c^OfJA2B#ayKookAS@bq!O(`Nz40r+Rn-i!$JxD*myc>ab z>}S-bwcg&JS9hTqpF3&LV_+zd{0Rzq_)AbrEBmVFV#K98G?VVFhdDy<(Nb^i1dPC{ zyQg;CYtu?@zkgfEmSv2;)o_nV5Hx7uuy!eG$T~32zW<7G{8zvq4zf=vQwSBNnGR^t z2on|n7j$@k<{z)$iSXOsEAU|+Hut_1F1aHo&2+;RUcU-3!+L@7u1WaHMXTy=H+tHh z%wpE_0cBK7KQ9N69{!<+R?-CL+!&yXfbD&8jxnQZ(SvkM&Mipi{3zFhIurEjmGAL} zJf4E6F56Vd*ctji1^GWP0ZE&e0wEg5e6!&Tb1W@XOaPl_>(#EPlLK0^<-y1J@(#8eQjLLq2PpZF*Bdi7iJ{x_Bl9QHir1)O@pNE!?gYieyiPbtB#T2opXs z?i+m@DbOVxDtqw3>jQ#oz+WCHPKkh@g#MVBHQFrGsp9X1u7-6BNrd$fzes!Z$i(0& zY`nZRC1cpH|7SDbf31q>yA@L|;;*K?sIUMzI-(Cfvp7Zlj=u3b0JS@kB+<4r#NGty zWrzi7aaL5qIILHXKMlxu z@rfywF$dgm&s#bhu!p+#xQSu#pMOn>e0M(|?pL-u+)z@!Vfv&!r-fAF)A?xfN6zWf zUE2I1zd^?+n!(t$j8v&sQjo-Ba=u;!?=eZGXUkG6sgOPh^-Ehc0&oHdL-BTVs2};H zh(c9vQrsusJ;Vq|wo^440tmCF{j!w#bz@p6<_TWT z$Zv2?6Hd0W_H=tKtDcqKU;b?DI$99ZR0jGA4Wu*E-2T8Oq0pn|U9DdrhK|Pn`nX1X zCzCY&@#oE$aiTvXYTW~>5+U{v=9*Km;NW;gH#}Z*KoA!_yM{&&uUYecbE)UAe5RhE zuQQJo&b=^HLhfN8*Cy{q?)l6Wz26+Icp-3`@H~Qbt9}Z( zW;Ru&Rg{DdwC`-*6PZT~{_m7BAca{;ml`vZYId*m>uj{QR+WZ-fptxELa( z;y=Br7Gw0i0=F{Td9_?suL+)n7h0;vW(G3^m#J& zV<4Zgo+{fJnYX)90@*{E2I`DbW#6)fI+09la=e&%1Ef)d=A-q=x+B5Y#flx7kFKDM zZaKY&Isc@pW<8vboNMHBP80V;(C2gB5itRgG*ONbf=V6s;UX6BEs?pbp7-Jm%jDV; zP~Xg^B6?(Dh1^syX*>swVjE*BYxBq1Fb)d#T%G}P4Trs$^=RGRaYmm{OlSrid5i()cZ7^Xl#?S= zt?yU4A0Fx6Nq=R%t%z-smb{_`c)G`%wrx-RwXf2}!~66jeNyECk%%s5AU z{QAqNV@ng?Y^3@}^xgFn2(E+g!JkrAFU?!L!1u^?Xz9m(=qn|GAt;HpT~?)+RnZlY zfg1dYBu{1JWIl_flB2&-HdCI~IdDEK;iDvfqE?@{TChdu56ddlfwkL_?}`lwUC-OV zbTE88wmR+?*Tg}#RjyLc7vqm5)avVn{TDWlQH!TpEB?i=Kw-?t`@Juus1-4|-{0n) z`n7uA6dr!J?dKd2+rz$;f!e$ zZ!efuZmq^2!+Dq1A(qIzwX(GF9)NMElN2V)>{8bEP6M*!MjsoYqpWlEOHJ2QrXeNr zs(}8`EwHdEur1+0eH1F7UUAqj5}bknKf0Mt&ytjT(iwaKc*IR~+%iphiU^`AC9{ze zw6NilC6_MT0HE}5Ni2zS4Gx6~#PXh=LG^oKzfHO{s(6&N$_-m3YjDAQM@X%lN2Q4h z5M%awkYiT5N0eQ?N9!-v^3KZte62}MdpXpB%kQr8Yr^ttQBg**QVRn|S5Osm5sPE1 zb^S8VqK9d{qWr8}><18Q0Xg96zKxZzG`>a9P%1fQ&?s>@g`&*ft@#+?Zp>PM04T0 z^&aUUS@*u93Sdw0BWEifW}yT|+xJ~A%~tuk{=O@e{a*9zoUjO~p;nZ=l9n+4EN+z8 z>Z}ZCpqXCF3;Ld@5IpVkcRNS%Av2W;Ur?-u^J;~_dkRg?J`mP2ag4`KgpvpPt#m7Z zK9Ym#%T910ypFPS4I@6Gks&^fKn>cGm?jF}nqdMGcVbQ1E!6MGlPdz$z7>CTalI(h ztoVRr_8z%^uk7UY1S%0sZ0)}+4a>Rlxp?eC7 z4fU#E^*g;;s?mKE<3B7X5KSQd=XVE{$eZP??7tS8DJJ0wZ~*xcyw5_mcli9+PJcFv z$~a~gjL+nJ&Kx}zMnimR&@(0-NMa|HE^&f%j@Z+MaI@FQCQ|qk8$vReDk+74^2@2B zTHM?`(a8-(jG9-j{tG-QXHmecrL|y)5eD+_+$@mK6lgl4J-CVp`ioRM%vh?&=8ioK zvuV*Q{)9{ok7=EhLNuXLmaCzv#php_$0X;;8gDSRAe4j1w-~36$H=_zV>C0e{(Xd5>~kPNg04g*0p;sk+QSQOM`Ez))4T+mmkYJJQSCbk1Gaj(Ou(m!!G73>^K zcC`)>FRxKxm09reRr+8wiB+3afp_ZyyI0QKoB(qH^-$Nc!$!UKnvm$O(RnF!JZa4l zhMMS|8UBY9EP~^JUz#q}N#$MGM-D9ws0hEDL_dA8+wI#=UM9LW;vm9r{7N~xrUq9y zFotSA&WH85(0}3y3h<92=l3qVuod8|xH0<2vj#(mIV1MoID&t{{1iN+!8lbnEMC@e ziJRJh@aO%C4cw*WC4&8YXWx{GN&6^VRhooL)- zOSGwm5lR)*G|jk4Qs`?THP$z&?wjey#$3Z3`SY(}L6Y*HAzdxPCMmc^zelUj z=g(uSfU&dza$AM+Hjp#oqsUndA?;7@h}h=NEnb$}>%B~rGCQ>vBp@L@$Y@!cpyp(^ zP3-8Q{dsvSm$wT3@%-$2a_#<*1WRl8*_JK9R{vHAa;|ScOXzMMh91@EZOcZ9mJ1#p zKVFMYWsnm2_|IDx07!+~g(U-ZV~Ma^-7h^pI0-O5g{p4!4p=k{2-#qv-)|W;-SX)V zX-!zXK%Y4HZU&ICyg0Is8VO`eC23f0p(Cw@8HDk4$o73#|Fi9m#(inEJn9w{_&+eRt`lyq%2a+=@ zf8i5c_6PPAJOM9R5h+^*U>Y$QDh{X@ZZG)RmnM&bGv(=4%Wlm$s#6>L@nGwrw2HDo zT>mdzKaA+L7aZ87#d(?K4%xQa;nUnA-r4DMZ3|xNe;?2f9IYz>TfZ~{J={Zr?9pUA z0yd)ueVUwdF9?V+6HTtess*h0uZNa@ukHB5ZKAuQ?*#;}Dg%q?J&|JOi#B`w4KBq|A1(lB zqH^}BmQh^ARz_I~BOfBo6)2V&Dvpw^xCYALuNF#_^2p&j6vF2XZ&$tUgv}BZfuef2 zcRkrQlufW6$l(6wbGpf2v!bR$g%T7Sl&OOpP@fiM`W`3IpG;-;i9dT_{)j!|xhm={ zRh)6-$Sk_Zu6$=eQZW7W0VF%kVF~W^gtLS`HXWi(4XuKvH_M~PT!p)`LP}Cpe znUo68p@xNZ#&r03S~Xug#I*t`)ajL~l-WwTt0(Nv8=mHcmO!}Ge%koSlW$BbpL*jb zk$W|hv)qriN3~^N1}?rS5h}usQ-suO=mL`|-G2hZ9QtbY&)J@5fnEddCv7BfQ275v zh(~hqzRIg7(5!7!o;rQMebaE8qn+0ANFfEb^9Ni%T?en(%bZ?iOz{arD{iB8FOfIH z%AvkGQY4?vlO0fAxJ&qY4DB%Ce%qGgDklL%g(@?Cc3ug^O$tJMh@!^^iLkfk&+3t$ z7%3>r9Ko#LpB-D;qlfzWcYh=?%=S(GQ#AUYsRtvB!pqYJSeqy((ZK4GY#I`LP}1~P z5@_#9(>UnFN8lG@7_>$Q6BT)KF6i>60QYCpHsq-WB>vZNJ}}9gX*nk&sBpCyR`G;J zxLNwr0SR8~BX#^x!;VTX(4V);vIc8j&6+YoRkgab=(1H+;(_KeknYM-z_!%*@^FI0 zC@c>7u7xUH@6Fw!$~}|Tcw}{2rM#I`kelIUK&u2i4JamOj^^^)GDOL;MdJ~%3u zI`QE1u$hiRe;1sxMV7~Tp~lm;PCGgLv=>YOoj#Dcq^_w^6Q%j(trrg zyH{7l??1)7zl!>8(qsr%S(O~&ByA&@r0EBTmnC3{NwJ{axu02_HUGM6!>@Z|7%d< z_23P}qEBO*b>s!^Kep0*1s5sX2CLnaBgT#_BnX1N7wkup0#Xa*PVy%Z_D!@ItVn;I zgE=dNW}#u|kUuJjFw`hxQr6-d>@hk-#mTL)^H;&oeeIp@N@8eJDF4>{4SBrDtEwblE8ArCUFfllL1X-)@?Mm|3_ljpCq+c_igc<+dhxz_G z@($3J!M@&{QKaqDI z@S7uZN3kZzn5I!P32MC%?O_Yk2>S8ZVzwIIV9HQ@gJJ*%tP;L_9nH;cHtyK!pL$g{ z`&jfLIj>>Ry8Zn?`QoE$d(KU*E0^*GVRJn9f*VqMMlD{^=QOKAdze>H6dk1D`7jZE z^aG+_)E;sZ7F?gNt=7BV)i(>yDmAac#6f}B`a7QTLhqDp()C`}UHmjxg_GZ83UbkS&sy5msW%WhkLEtve`eYSbN3=^F)!5pa z8>@31;!!&R*KzvNvj_mtl5Z47I&O9Pl0#!8%x!QV{l#_qE0W&0qNa<9Y1jYH$1srh zf|?nui}bU!E7bE0YlsdsXcriE^>(a%ZYVHWoR){7F=c~8bbSy4k1XF1d(?asup@2T zw)t_5;O~WS@7t09fhvL`LJ>#)uuQ)@vXlgLSaZrCv{}AhcHx2gE_2D5m_cJj^^oe2`7J9!haH>Ors#%bdl^ z%=_IFHboZ2NYcT$K^NZq*rf$RmsF*82E2~LaB;{`ue1t}hZ3W}lG(_-#ZLL7*bzS%4F|RoqUHTcx+VnHEH7ZN8g>S=h;BH~2QG4{ z{tJlyi$lAL!DPCd1TF~R%bbeAxg%WLy%(h5rqQZVyXkh*d#4ADakxozNRm?V zQVMIBVvx|4hrAC)A{_z0t0l%4Wt^X$dlC%IaX!UWEECD1F599(Xl|Nnf`qOTCut!@1pynGct<&&0X|1u|WGT_lih`~!ssAv_kx4YaxB1^GnNJFxp zwT8DHPyt0cnBawsQP#fWXEA5360$+J9(5|qdJ>dGJ&!e~S4GD{psd0R!7P5jii9dE zx(f!k%iqlsDzno_&Ro5sMb{Z?$)MAMqOW|voCMgBV=l7mrfsQlwh0nMD<$&p5Y+R ztS5SX>xGWld@L^>^~1Z)AOfF4)?`nAh%VRQ>zMk%wx^}cno$&~-tvbX>I49k`Ktjw z{%m}SbxCEWSrixxd7}j(l2%2*}OTbsd=9JS?5qRnJv3HO+lT zk##zs`{7wnob|2z*_thSfs$lkZV_I#t?!n;qQk59#GnthM`RlWs?gMvv|dX#oM^I^ zE{)F%V9s}})3KohPfu@s$nzX`!60PTvrR0>>SIn^`8i-TJtD`-^+zIV;y?B8KU4ba z>IU4|}jiJa_gU zUu`5N3__u?9t!f8rBZdu`AmPFJxQalv)7sp1irgW6+#Dd@Z~9-Qnkr}h;^DA%}m9d z%q~k*egz1n?F-=a4=sh%(1HWogc(4-H%c7PQ!1D-_KYbX{Hz>86rljV`hSirm_zeM zzfQEEz~1F-8uncpy(3f}t7(6WV9%NqUhe~?l74Whg92nkb_DIJR0loy;beYP_s@}c zFO1;q&)yK8bI5@`5O$|Pbl=VCOm<1z*AG#8o7R`uJTDViSYZu>I{G5*&9=T!ceI75 zH1*R!UsUcVx@mEzQCM{_looHvjPaI0==!Ceeu5o>rJ<-$X!J^VoYC>L#TFAO>XB)* zT(gs!!C_Rr1rVZ03poo22N_-&9E&Z-6(=inSzG2wkEtIKIvZ-RebsRPp&FIZ_J!ii zufByrv%^cs1_`cl(H^P})plf;Hl7rSDw8@XkZ7sv#P)e)LQy7H%Z=nAfP6!W9V|LGsJvcLzi#U-}_ z$yC17<*#~vUHTThRMtutWIpwJjRE5Xwl#3hVkyay9(RFAX>May8M|H?>>uO-{(7c~ zyFLHz@veB@g2Tr;?Jt103bVXSFg~@@KMYod!E@7d@X7apv+s-s=N{vrr4|^J$;;Q6 zzh6sn9r%CZ>l`UlEn_^tG~O)O4!G8~9`y?!fJ~mivGx*V|KRDPR9~kSWw}tglBdrs z3C0=0l`j3(UDfE1C{#v*#jlV*lMB0@n4)w`SX1o&sp2yQ0~)!%NtbwXz%&{h0%yDe zSnL0v8Oj4TP`)|i{G9SdN!kpB$L&tTMwbUXPL4 zH@h@ne>NvcE#PH{Dc-$YCV7dT$u?gdDs`&p77QeM%qo@TNY-6Ae)Nu2uhrN5WSUc% zX-9g805XR>Hq_4l((qF2ugR{g8x~>|@X{wxou>iY|Nl|-RRM8q+qTfS1b24`?(QT6cMIDn`yBgt$>pI2%hZq zp67JomD|vZw<8k!>d;zmjHoMD&MS0+VzPuUAq4`n&(Ug(79?m=R`>iDz<_^mv2Hd< z;Vx2+O(8k5Yv_mW317_mU^%jN=m%o4&gJY5MH0yKA=5^g5kiO`%B2$bS1`K17wVRo z`go99Y4Ra>1jE5SIN^6R`v1kz4OhB=yT%da&WwhUV%0_Y6TtG+KTghYjB;SZ6A{!F`Ip*&}H_9?Hh|Na*$TMwIKgJqD^iGElw&gKv zXt_GV6^NCV=4a?Z4e7~m)B;K3HpI1tx$PJNJn6Jwk`oDDP}hG!cdM_k<{>fvZbWC0 zHTr=U{4;}wWp&pFiE4YDsCMGbOgV#7IZm%H+dHMQX{;qbN4#lEQG_~F5IfF(QB5G> zLsg$x3Hn9kc(ua57Dso&<9umnYfJ^wadxT1&3uF6ti|WIh@Hn}2XCgT-L8LShE(2FtL#zTJ;S)|Xsyd7AghH3 z-()Z78`~h#YDd}mW4s;2^ny9-o=4g)XqJHMZ1MX=8@e#On!)%l$_A2x_yZx}(Si~= zYag5A{(cLYsZ^8Q=E~=l+n$T##F?dlEb?>H%W-nT{7O^UZ&FwwS6`}240W?Ub8 z?0H{8bQ~{1z`WECm|CMqc_-(EFIEv(PFRJpeDjI5+;MI3zoRH`MTWhk;|gb867deW z#fP2G6BB%In1v&#Lzs3%`anX@Y}^J_cS3mCQ#xRPH5**)NmvCq=zlJPz;MyHb*OOL zy;pFq`6M6MnV#e{)if6tfcp0Qz9kYexajg?8@fK(PkNlk&BpDgj%@qf@ zPy8v=NNm^0%lITB2nLER@)CUc;>n8njRwNk5po;atg%@QmZhygjm*;3!(Qu=>T5T4 zv#^*dE= z&vFpOy_{Oj`+VcZVm)lD2ChcG&#_L4TN!Wm^MdX;ex8o7at?-ButfR6NwT`0mc!WR zlZrOfX6h!HIutX{7c-7CL-A&NJye=SHGaG@gIYRxtj5;Ii5@gcWYn+u>lCzhXU}pv zqg@JIpWedpc!w{V6%~d$z7CHmgt4SOg9De|s(Mj&&Aa)iDXx-AIWE z`0-@bo39(2hKv6$pC{1>91zt~a_HT=;<9Dd-<+Ovqf3%es^n$C6B|mX-f8~DvKiOQ zcBn3pMdg3+J2E09{ZQB^E}b{TWM0qoC&po`W`p;~c5T4~qy@*$3382VO996Kl!L%k zlA(3w14p%t>r9d-ha&ianTfhjd?Z1sN8e85s^E7X!-wn7_4)aP73mAaX$D)&a~-~I zOYHC9tCgE=&tJusju+^4)~tAshs@*c7-6UC z0wrT!BDz`Us%bk;!&)WM`h7;wvp&a#dZS7x!l2?GA8)+HSbgMr5J9wo1g3xn6kLH) zL(_mUi8pP&g0KHHjCQ75VYox6`;p9SZL-VRWSeIl(f{c<|J&V2@c|j5B|(!|r>X?D zsz3lr-N&R$H#C&0vaOMR$$Jd*KAjH)TF~J3CJee4pVy;g`yu&A7Y`)OTlN&BxWspt zdCv+-4E=B?2KSkTJt&hB36GU3QF_sKH!_VC#)d^+vOx2Dlk^9pCW(}~nPpd7uTRju zXa0Y9DmI@2L^ApYzQW1yP8;%&h#Q5jKhDdh$QALv1rCasQbt@pgV)268RUG@eicED zpn7EgqOX-Fj$`@BbKcOz6HQbqk3ou;E?ovLpfHm7&xl9Fk}}STTs4gIbI_i)U1M`S z=*uyuTzte@&x>iqY7p&t$!hTG8~hHEJ7HQdgP(I?lW7}@Y}?zk89`&=n!78P&@znU zBtNIX#hXnRBIpr1YdhzSSU-wk7lTpLI_m4RvY6hNq<%fw49a+1-U(T_+pUz}KT}pP zQv06!D9{SxznQ7FIA8BOwFu@XkJA=grd-G7MY$Y#+a4j$fm9g7{=LVpWDGSKjaYxs zpa4ILwrU3xjN7bK@YHnQBUg^|$vvH4M~1%si_-w55KQ0sUKXP?l`4f`vPyZZFWydd z7VPV;?S!V8^Gm)1Vmmx zD~|E*uv|&DG7Ka7@nwynCE>)KpLHwTo;iW{zo}VN3)=DqmiGUIFIBQ=Ifzx5JJE*A zazoZDEu0$+u&-JhMaQb72yjz? z1ryPRP}Ck(Mi3OC^1&CJG#%5f1WAG;f_lj}Zo1K|yLsOV^q!Vrhp1OpP&Rg>R3V52 zTXd=&9nWyq^n6GUR4Ws5mMeNpo4$Pw4Kg2&pcR-eTqOREdq);lch>$b?B`fb1xy!v zu;3!X*I@Cl*EcH7GC%B>Z+c3{gU`1N@I(dE7NA+is;N}sgjUCRIOKv z-1T&Y@m8@OYQg&z+}YzMDVNJhN`p3GMn;!DFJzcn(X0POy^@VsN>KlEWw)ghrNSO*J?XeiI{GqupT@ zG)|T476I}zTh^lbs|UuRQvteS4L8cKqhwn;_6+0SBFg41o0lao$^nC>beh&m{hwPk zM_`%;@PGM?K-SC-530Iwris=svIjNat^1+Gw=<;3OV*@J7z$6^*ITsLcTH4p{7Toj zN5;)z+5AQLt99sn%4|j70faLfQC#?y0W&;FG=GW{D~UB+x85h{eH^^yzMHn?zWx2p zL7bIl0ZAc}MXge`B1gcWDG}Tk^Q0^F+HBf418>dYII?@7lJSbe-<obF?6e8@KfxN!0b0-9kP>#j9=K~<9&7tJqa{b_;9F6<7`aa z)Av-h_8%Yjd=#-xv6Q}a+YI_Un+9s!nF?pmK%woGDWhM^CPU$2UTC?27#j>yHtAJd zckU!z@FpBK8dSrWnD0PC>x3`I)R`uk$rEgza}osKi!KJgTrk#W%^08?cR`+ha?Wr) zTHRmKnCmbPB;)GPkhaFqwUJg+N=dPdYa_XD(oD9y&#daY+nMbgDm-bNeq26EemyaA zuIX&#@;W5~d@e;NLpn*jk1Mg71%>Zwn~)yD2T|YX7zeFG$Qk3PP=6`HzfV6>irFDP zMI-c9bM5NOeg%*}xg(7(hRxUAs_tlMjc?A7zM=_tizZ02$}qAUTnIS(eb}Oro;0)v z)n%MNmT1JK-tbhbddT;lkKNM@H_ zF6@5rS{lE3{!TOL5?RXtX;nv+$dbQrX<*orOpsH9G_L2)LwWiXL_!6we74+oDrvRWiQ6;?nhh z>FBVlIH{^5P)7~Ipnu=`!7bEaYZx6{-?tF zJNLqcyxj-2Fq;2^>VQ*T!UeU?^$8KP|Eb63*7-X(C;tt3&G+{_-)gkdk-wtgzw7~a z1v1$fh|3PI35?Gy#KOYU`W4&kkK{j7vks22;_#~_4ol3H;*`F%Bgp^h2k;1R?L8m0 z5!^0)X3`{VIg{V8XT2tRDO)WOhUw~s^bmOQn6~TLEj8R^&aLl7Zcj}Mc%CJ6exG$a zdE}X)g|meLuczO{pEF+&t5MHI=tZ9IG*sPJ(${NJ$7@XQIJMM{^RvdVn#rFk6G~mC zFgTU_?Jdx5ND_h2eh-&wUaR|+smrTwoBl9!sMIdzH70bscFpt*elFw~vpxwf@5XNhS^#1eGPE+eJ;8hVo06*ME2@|#6-D1!S1j+Qvb1e9 zZn|-d;m$z8yqy=wb${=00lu^laQ~vT6v$FW&czeuM}^k1FCw!Q{Qy7d5{~~;b^#uW zS89Y*QM3B{&efWO|BV&UGP{Vg3M`xV@A2!ww0#s^+ITM1zp?wA9sD*8}6*uyll<*3$qymZoP@CmjmZvzpuJH zBKn`-zY`w#Uon*!Ui5o+JmT%>G4>dY1A>*5Gsr-kL@2C*`CTD(=6J3);XS+~51my} zJvBiGnvDX-w|~BRDD9ED(Y3+f*1AY$n&TZRe>pOqU7E_E>_0RdW(Sw&kZ%Vk>(kZ9LmfCdyp=#|Tn6O7!BbYe5Dtd)3|h@z@FPSL>Ep7dVrmV<1!-H|wOa ztrSshgbQkhN~XVSiyF{3>g6YKuDM(JM=dDq`|`PwG4EsRpwGkWY@||UIc@=JX*+ni ze%>9obWF!@Ui~?xDa|f#@pbj_uVrNdMEgqJJ>rtDw*;2&dLrixf7eGRGK;wW?^T?B_FI zU3l|$lsn~(9HZ1A3KtD}wkGT9Etd;J`=_oG-GaY36bz*?I#4+vIpZt5&a*Mx{X{t2Q!nwfusF99n&*%!CBPC{$u=H{sPpf6BC3kLSUqFa4 z!jT>Fr|YrxprhTenvAz<*0!!-L|9Yp4GP>03aY>%i^j!J7u%>kmKTE2vnoT!YXu+C zczB^djb%)0&1<)3n`dvr^F$TnGaZ730A@+eelnlJeS;8(U*50|m%b9ua|{6!TeO~M z{Cq-eN6dR12ju6wg9bIk<$k}$pyLz_e;_G>*ys{ewW~B9^pByR{5tkC5Mc*0a!*Py zVS4id5)`JYDNqdY$C8!PW2OD(F6C2Qm3Gw17di9F2hd+40S?Na_?RLzinjk#Y5W~T z0Q)g>#EAY!pT-KNUY=YK_Y#QQ_}v}G7(LdLcEi%%;Xye*PB9DMlS{>m`K|3h5B!dL}`CL8u^7GbRyJec~h;Bo)U3?!a#|K5Ja&u!1an`0) z|6Oju?vq{N@!CK@d=w)_n<4Z8`u@@Ar9(Q;Y0s{T&*Ji^RfC+P{FXMlaThU|-Q!Vs02sKbjY&T${G#K_pun|7OM(G7q!s8vS15 z7k`+vWA!CYNrW06U}{xtQTsXGHjFF;hZIy%^aNf!vtNiooIo>E6X zNmuZ|sNFcx_ULm+Hg#(*%WOUI{edv0^9@se-IuDnpUJYUC!Cm4Xh3S%_PmCk4Nb7y z=F3jZ8^n{y6AJ8ZO1EuYHgr0f%OV!|dd5PyP_3un%?2qA>-DjYG+q@!QxVbZ08$0F(vx1vxHW-d(@dvDFqcXZxFQ@|4Tf!yWO<)cYli(Zlt5A7a-C%jG&Wl%z5mW2V*a zcFSz(Jbly__ARW0<%SUB0QwfzchNIRQSKuyEvDqju5%bl+#L6>szX9T?STlLc>gzI z|0eex=sbVEJl-2RYmVJX-sHa-e_h8O0a^3w5sgVRUCYcY9+X>n2r!G4%9!fu8n``N`a# z-xUB_tv7Dt?Jv;a>3G;JJob#p*7Rn&aIKQQaVlKXbZZBd2qT~8h!wUVUY!gK)s)ZW zJ`ThfHfxKQTGoT^u1j(GEW+(Sd8k$pGp?QaIlZARXSeud<6L`(y=CFYV0Kj~`q+bE<&q@k zM^*D+I4Es1(`Zdwqo=EUQr+@H^+y|#jZS1C^kSFnf4u<0T{0?$pE|iZao=CSN;LN) zrC#Z6S=~au+Ma5v=-3er`KO3a)B0Y2@}4F6^UG+>BhK3wPU=;{6;1!{kQ+Sq;;PFq=jJiyJp zyfQg>zo<3>UWXlc?U7L*rBE(stgR7gjf$j*(!fuq{5o}qJH}Qx>1ZD$_YC-OybIXl z<@4v?Z1qpIG<6RG-%L{Q3G`fGBB$rM>Nm-DsIjwDbWWq7?M$07>hE7J$Dm@MAsC#f z4H+Ti=NBfr-~!lN!$7vi(79g?$v!Adp)YI=byB?PYyv3rN#9{!7FWS6+f9;v+6v$@ zMVq^!{3d1&9u>$M(tI0o~tFsB(&4y^O+e~scA@3>51W?}grSLlpi?Sk$5UKfJh z8D_5Zdfu6g~fa*B23KMI`m)`ITU(1^cpdLQ#|t zKZG1MyKMFjxMQ}P_nT6OE;B3B1Uctbu#@h_T>eWHz|ieT9Z#XCX0XI5wwNM!5POHU z(y7;K@)NEA{|4W`<6iJkTMmly)855fH#D8NXZ>Q3c{z|Y#GG{?rsZW*h; zb-Ui=*^Ny3NjG?t?5u!UQfpZ-_MXO(_h4@aobofWS;yi!tehgo6 zY8(=>Lh(0)HTQOf>u{-GInlINCt5nE>;~zuo|LIJPP_Y4uu?5Ua6=dmCC|dltNnlQ3vK zMfD^oz6Bze1)oweynWRs$>XOFPL&EcED>aqmK+!CjA*x-Unwu>GAPJh9qUBzQp zL7;ncaF1{;lkh8ZLV0%Y!`l)(Y+G+&&ZEL~Gs>f6y!iR^E4iSLe}tbO;MK!m<4C2Y z1O;}D5cSvk_WZ??B#_uj*fk#%D!GpplSmCaeYCl9Km*q;W7K6B-+{hh+r--AWqoRY zzscuiu3K+`hh)f|jW4c&C-u}Y6S9_bE?*L+atgafI(m226Mndzs}lbC>0ZdPQCn0@ zaM(ZrJTj$$&?sK~M&h2-GChZJV_imWtkXOLjD_WMx-|UTw^3z47${<{iAuA@2scP3 zXLWf3r{eEfxQ}mP8wBiHI@`9$w5GTqZT{;F(G9I42ZnTea4kO|7YQxH!4CPn@pWpZ zT>g>zXs=#=IJK6p!xhz3e#)&YECQtPZ~3|zws+j@QPYRY^Pg&_8weq949*;K06~&L zDx=5rX_HS(y}<(xE*x_2W_7`CgPHFa7)5=XFS{<49GZJuqttmFoak$c+Ev*&OY~cR zekSfB`}5j$&tLdT#O?7uB**gr{1<)V333v;stoBc{Ksz>s{vZk!CYpIg{gIsl35+m zqk-~skv*JR)Lsio0>{jv8V1Wk!7Iq|$&Ke|^K`+6!%PXgakm;Hq<^&CNnv{8B3ypw z8@dS45~G-9yMIOYTq><8WFA@zMf`(Wu4HfvqRq6sX9%q_odw)cC2d#C>x;~-1GXia zb#pWck?c?`F$>1HI)duXvMHDb^Wd2+8|k{g@9uzyqH+KGuAp1o0J!{n1JPQKeYKGL-SBQl-ftsIFrz~zEdlp@ zgSj7#mD1RlA%yyU%!*mU`GPQO%P|oHLtOZ9dEddsG|qCK>8R|%{aGs$g*}o6E;I1Z zHwe=AXtMWBn0SUa6Ts+*qCgtF<}H8gy-KHDs^mCi;dlu$2pzZ>hYxDhX8aYo=`2T< z2z>^3uQb@HXw{+Lg9xReZ_qJxudS#!Oo>b;51B`UXQ`m*9cLGPnE$0I4eP2BtgM2X zfUD;tz4xcvqxj1cj^cX2=K782aP*gw#Z}om`6b~?@u00CR$B#Z*V2@%$3IfNzg3DY zG=FBiAJ`jTZW0MY2BeL>WQPnNfo^o2@;zqB%QeIAf5jHF@EbX4_YPg(;;$|6ewGBX zVDPjY{rR9^?wuxBPLpE81~dT_N+M--@h)3z2>HUSM|3Wia(mADi4S~Xr6W}F*sSINN&V( zXIwNP479hLxN`6Jp)v(RZuKS#Yj%0^yX(A;*C1)0#+H{vfdiFAizdC~>J15DHzTJl zi&KJro-#769qZp`LXhZml>s&A%}QQPa2Hesu|llUegTly3zD# zp(^j*ru3|DY$A(<%4`bUA%Sy;{L(4rQtb&;s&QtKb9X!oV)KHiwWcIH=ES#M^Lez8uT>8oOj4z z)7g6FMt(wujI$#e2)lsnG=QxjM`jC1o=`x>{_Ja|SEcbCL@@WT)#m1exV`*b1FH93g?^Bf z=9%gr-lkE|jSv4Y%~2%FXpn-LZk+qMbVNybGJ&B8MVSKm2U2sf1S9jdYopxK>3v_1 zYVZ?!N=;qb%M6ty{FfO~%UEBQy)e-6P&{9T>t#9uY^g5^IrS_mO9dMY z6LZKTzgMsRKwAUTVZT1d4lfev(;?Or^m#cej#0ORQ0KJVRlAC%8DoZv*-I~uCXMHBDXWtz?kr1 zniFj9*iwBpu0@ZtF;LDy`5U!17a^G?E4z33RESZsg}#0if@LTcxn+g(t2`x(p_}I8 zCDu>Kn4vsV>klzAk6z1;t$`C6HytsYcJnqZyf%Gfw`9;nn~!~W;5c7{A!LNE~d)Dj3x z#L&+jd5Wlh1K9$PH!Jhmxu}E|e~lm@;6%y8L!$U6{^J}0W;_rB2b@tjWo_FRyNy@E zMBW14vGzI`wuLQ&C-O2v`z8u)3Is^=Xc54e!Q13~WF`*x=Wn+u~FIu#i;orKkhPFf}6_p>HgMtiS2S=D+hLekLE+OsqaouA%$rvIsA@u6a zteUj@tnNR_cGDwrf`s_k*3ySv2V=jmh0@I_W1Emvvhw25dH`x+yREm876FoiL}Qth z&8_L@`o_Tq4kad34&g~bXG)&1NhkE|>ag%aJlD77%D~dU*WfG+|L8qn-*~4wC z-Fm3aeAFp{@10cq{@)~WF`UM)&WjtTP9|i{m1yeaSPzS^me)Ty)-RgATP>B~aQ$IE zy=)$ySt<^1ebgAUMNO0*^r0^3p?_6wWJ53*BL>R#oY6*y>6j)Sz8n46NmdGD?Ni3% zDy~0&+tCWqSsrUM@Y1m@5G|-b?HqtFptWjtIzL|tlxF9MZ&JD_M`hzxMi0hPwg#0e zl_zZ;xijAJ^kiNX=mjG#DIRu;gvgh{3J8#1Z-rjOnlz-wToFWZD-iI$m6%E~CR`B0 zE!7P?pX?{=Js7*@E35K<4p}&2gK)YZ>UAb;O2C~7V8Ev1Dy!)U+%LD9Tuh2^i~kUhmP4jl z9)*IHgp{(jE|#m-`&RSK-yv`!F>GSl_0;=r%B5rrV0OdUIq*EPd@P*R?#12)&1Ug$ zJN6gSLm;o|^&yh6c@gOB2rch=Gg&ZHs#x?4?*Vv{xQV9?hv7eEkGbOo8w&m!3J@OM z$je37s!nDl2*Jgq;OzU#iW&a18xiVRDep5(Q83BN`uiTLk^3u5g;Q-ih#sF!k)pq+ zEG3W<2^`KH~dl&H`wh zmHTH&6qu@m1|7-bY5dlT8C&u5PTEP5343Ble)IZN^eOwe$zWEJx{AbqF_k)*oNrJg zbW=x>V`un+&xz}UiM#YQ8L#AWtSzRo8a(^`&=`svj@@EgV`fnQ)pmn}K1V7?rJR5( zidVV7%NwQG;Mr_pw75pk4^?wVW_?8UGqSEc2P8pF`f@7`XEvq0^y3t*-H)PD8JR`CPzPxZ<|zakVRYOSJL{7Qb0TuI<+!04d*63u$FR5e)mrR z(%iO8i9`xHh~Z98KC5)pTW(>QF~w9h__TTfU8e{7wPDFN{eYlfX3OT3{mxKkmisQE zaqV`o(5JdoJMQUye90<29aSIe00URZYn-^lgnB&D95Z{;DryY3Z%M<$0mW%fwNW<&9QQ9ng8 z;uLeHt$UG>->ihAqC-{j3|T4XsXD#fD+$bj7_irQFpfMU*jWlEimyi2KV+M-qM#e! zLFpvF9yV4EkZy>0iR27DT~=`0CKRJLGzXut88yW*nVr_#7Xhj5nf2RS{oem4CN4xF zf`2MXVp_Ug`jNu&X;&YRm?K>uLKkg6Q_4~67Bu=eBe)^s$pS^-@EBbc&Yk|p!$%4p z$Oqe&*U%g2wB3Gx@g@-Py{FpTvx5MCzWH0qusJJm0iN@S3)z()R3=giHo>Beeh{_T zXH7l2T~1JxJDeFsGhvov!$B{+j;~71EbFR;={_=4Yg+3=$OsZwW~~7GC5S{Grow-j z8V=1rsd8Q#8uy6&#S5=d_JfBz>EELOK%>KvRVwA#+|hYQZ(yKqc^c0aMHh*5`QHZi zUy>Mj1n{SY9au}jsen?NnIUoQ@y6HvoZa`ZI*~Iuq%O^%z93YwfE@w)liyPRcURnC z1r;~o&#Df{n1FNQBR2GbU`9*=uE_ONTIwBp&;G>kYHBuaS7zVn`s&M%eA8<}DU5~} zGd7mnIcIzd{A(NCXJpc|ZgkzBuHx&X$94G zX3ai^QnEl}E766L+W7!~LZvF!sbv>M0guy~W8S&C1UJFh9us89$E*0Jf^9IIw_TIP zx?PiU%%bP4i*42(2tk>tlMipdSLlEsH#^UK1eYRA$SGrOn3IUu=}@HBy@4=bO$5$}d;CdVj-JNHXh#yE1Zo~8|K;XFP&My|nr*B-T*I>fHb#sJgDE?9K@Q;?yh#$)N zK`8-b0HRU_DEDSd0s=AUcCX&ACfgbxCx--L#5+3id8pMMI*&iOeQ{GrbYZ`l*Eo^EUt}QwesWpfEV#EjX6Kg)*;7 zB22lP;o>O@ycfX5`xODeRLa|cJ{RfgdFDm=Z3=ODAwr;Y`DSq*?US%-{h|GotsTJ3 zzH->`{a%098s-m(z?O$FBbh6V<}Op(VM7cP_kUFmDWbo?t{XbYEx)=PRw`H>>HS6V z*6uH}%tgH3r}#58-5+1D*BG{S0KP05y}z?9aFZRwc9ZLeP1x4{t0zLE1u`-3u;WMP zg6#WTIRkHgx+e~unm!!=$cBKiCNM!J)4pMIC=FQe^XQ;uO+St(HofA2 zic}sgVl4RdIXWlY_!JgJY4T^;Ev#u_>?dBZZxoV;Xt`+dRlVtMz1W*(E1`M)L4e8aCVo1^Xy@)k(SOHZ`N4-vJt7Zr5(eBI4O9;)j0=e z>RZX@mQB^zOB7i;M$b@17r~DW&B?_wb>c>NA7_TVP@ywo68kr&%!_!$PUrd_qq60l9u!~#dMr*Z}P50KeL-)n}8yi;p{&Q1rL_(Ho_;#`2ayLw>s3<^Dh@|;q<@x0WKx4sj z(N3CG{6IoZruPoYUg`_btBO?sRMsaMc|yjtvX6(Aa%+38tA@^8zrJyLf!Ztyd#Vrc zqk_B=CySFwMf#2z?rpnHTLug@6nd(q6bf6r42obvjx#Y2I$z+maVK(vfHm5up$6)@ zS>U;P17`STEdA-hfLX zlEfs{yYzp&*(zZ?mtu$Xr;&0#uCW7me+T4~$M=RIF1g9qd~!n)De|Qfqb8BIaAkfSo-B>D;KvD#Ajjd==1lnrQlDr`7Tus_&hx(REC&DK;?@K$aBZf&Y z0R}}TbiH5-tLuseX?Jf;sSHOwv2$vgp!wK1rWjg%}Ff^X|}e zD8>=&^XhFI?>^Yer(k?q>6^83RXgq})k#eby>jfH588x`(rAs zzhcR3qt9APldw4Z>P|wKT2F`{j14e*rkQ3fIqBLU?aIxyB z>~8Os^t3YZe(ngwpy zVV2F;E7Qro=UwzQmpQ}wt!L7YqT{B3R+uYyeJvU=)cn4`sbfiU%fau_)XOH)OxRoAfs=uCC+4O5~* z3i|NszI4oW58joZwYnM$WEDr@wGbaKoc-Hgc`e zW4X$%c5YG5Xt~O8@>MmB?P8RI3}UB@`-sKjc=kkw0O)6GO?|}^3e2(gHg(N0Toda} zdUah(Lxp~Su7@SDzAI>wVb$^pzw*PzAAyA=hHTYp?Su;tE4Mhvat(dbfcNY3cc_#M z;b4FQ4w`Ffw{0JWQcs}F>;w{szrw%|2DauZ4~^W0uJs!^ySH%lH?QTg%$?UGNU^ zsBB-{xp;CCR6Ngpa?vEorQE1L@-Eu;X_18#3RUIe`5GVkd6Z8W-(Z~SdlF>}UzhGe zjM1$tQCz$3MkZhP0w8W@kbddWZN5$jPbvrLd2&{M18)kjIA1k38y_V<&}fyNI|YDisK!VhH6<2K`%Ae@l=Gb=U-r3f`Dkk_1@- zS0@QiIYCZl>)Vc!#D_2mlzsQT48Oa^bC9~<#C!Q#hsW)j9!MRezN!vdC&*Y_Rk!gw z*6C_2^9GeQzC}SjkC}ZWSt%BTMvO!2qsOV&yxa-)fYx$lR23*-c^S(tehCv+7?#6X z%9`%F`B9^V0T363hleCba|VoiL+g@JLG+VH z`1esV=pf0Q;@grCH>^#pE<^(POWF!(Egq@<>MEP+7!TItP^`h%&|qL;(X{2s>i2B7 zSGPESZkaQxkT55XRAl{7Cfwd5lV%_m?0FcsK>{}Tdo~QTf1t@-1IMHWO0P;q*@1^) zfU4)DbNW0U%MvyC^~j*V1)_!11I_EDAB};b3$LX!Et65hne`f~&^3A5`zp-;K7#ho z&jH$@U6@~))K3+5bks3>bA?I?oudhLKWOLw7@)xLrQC2IZ+4oh#oS-n+joVm!^{rC z;Q=D>FnSM&?IT;_Gjh_As+G8zcj#pDm?6y8K|4fZDKn_3qE{}M4P5ONyQi8B4awo& z2sBY4ymW-V+Hz_%wW?|CS01m*wRH2VV~w|2;Dk)O;GYp=m1=xE7?^^U;1@boa!8LF zI1OACZ)`mcUjFz))5-mwKMPZLja63!ZftD)otbCC8SfhJ?v3C5cdnn0KJO2+U$FM$ zu9y81aJquS6Ks&r2;bip&s;`Fx(1DL#^+N==VyGwK39okCGRq?GzixBGPiSk&7e!* zFe38op5p*z>nI{W9~ow{&#Bf3Ue6Fpgb>!V@!5W_tDVT=zKHfZwUg8b!P#TgcFJ_! z(ykW^obt;LnGm2f)5-0`VXS{KDaC3$6O?^FDfUl!tN!93meNhjh9rB3L(8Pl%6R9- zE@Ee}zxAN1d8!Jt-KzS*B_w98uz%5nz~iV5Vp0mYf%@DbsdavjiGM!YL6!5tG`bDd zW?G^7OQUs!WCuy?(a#4!^$B#LB1|y)!40$xVv*$w4tbjiy$RYBNYoU_N_9d!Lo{kln`y zOio&|ANahT*#DLkMg$)USU~5E!3s{s7o0-Ut)#31On~?XHxLgx;HzolokVv2EC)-h zwn*;WAsh8}>2mCDI2sy27!7{^Iu4br-_#UAiZI3&B-7I*N!Bw_Vgoz(vgy&Me*nkl zRH#JvGmlOouHt+8VEa~2Avo@{y~d<98%0P)wloFj2V|1N-7;p;I%O?9uOFou#GcS| zQ%2I$%#13iV1J!L<8)a!>8Q1>e9Vi2aeEX8aXN#;g{o?y6poFd#I$58yI&03 zcY9CrTxi>`jekLt*T_OUCvTw&k_&}M zA07HawvQE-stq5r(7Q*3keVeb(}9jOXQQom8~;g@)Jr^e#OzY2CadJs`G0p?fiagndHwg z~tUb3&)gkE2h#K{;!-M6FO z-8A)1;9hv@CxS0`oM@k5IGm|l|)9Rt>lGU%tTt2X=ckfG&FU6(3 z8O(kqcU$+*3`HY6{^-1(<+7C6#R$tR27f{T)a{h?$nplB3B6LN-)Hxbl_^rpw8L`u z?v9y{STal;zE7vBe3Kxm3=a7Is)%Bxbt${v_eF@`SNHdJh$8r3`wO?2A zC;v%7xX?QYlSq-aCY%J51CRK6jCcvSn@GGnQQ$+x4gcG(50)x|;%}+~A00zG0PYuy zgun+snskcB^63QJ%M-buZ<1tX{18#ghy#ps`a?GnD_(LZ3LAw{bG)>Tt2v)&FK3o2@HhJ!p@>%dFt~eHxITid$+N)mb<;+&Y{IMJB!7R)gB?Ix&HVEe)O`6isSb+ za_%ce14RucY?qsh65v>$eFF#{cwQz!@Ix{|JhezB%vftdWZ?eeo=cO&+=LoyaU%pe z#u_7q%MFUqY9NHhGXTJ067F?6jpu#A{AUx5@H&(G@GO%)8m``J0Lo6Zaz^1I<3q)l zx%=wwwvN6ZW8VBD-eMedv_tarNwukN>_5DGFtZ1$M_(5<>7CVYFrE;c^dF*Y(>&?( zqwwV&4NM>_H0q;-`w9>8bnB`fo-)IEA~S0)u#X%H+^sJ5c)%;h31^4e2N0k+i?w!k z-RMY1KapxZ(8s3P;fP3zM8(W!a|(|9ASGQDlJMRWH~kP@%ZJ}gjH9GVw#7H7d(8Hf z4h4@F>1bqHu7^ki{jHlCC|4zy*dg>v7^As&wes$jc2somxYJ}vCNuU$J*SZ4;LqlOOfp;LzX5foC$7jCMjeLeLcKO z?fSX3*2DLgYMNB$4S7OpU(O1DsKmP^{=rt!I3UF~>{=|*X&dxM=G=eNAz0lQ)~TC| zFg;5C`EJ3p2{qA9mk+eU!On%WZ%i>L`=Jr~|H%5vs5rW%T_6w!2rx)+4-Uay1Hs)T zI0SchcXxM(;K6lpf(LhZ26yMqd%knNd+xe_=Fjx%)vJ5gu1BhBTl^@T>u^Xu{W(Je zFc?R<+z=qr{rCi`voX5E#UNplEdRj(PWaY37m{r}qp1+G)?a|5vyl-#ANAELW zsIwYpi|BCaPPY+tHyy_Nn>v*F?8;m#lDX+FnrcI0Q4z+V>{<4yCA@=RcZ=kg^M|{! zIA@NhCE0!BzU*l6C6UL4VWaE@u{7N!=4GdAZfc*F%Qaa%&OKxYJkC!X*@FSON9B(Q zX9SaiHCHP(9jY$cIeMI)T1VER4w_J|!vP2J?G9D~b0~30bJvOx4Lx#|qtWx__O=P( z%;#V$)tlI&ugJQU(f>JV!CL=qm`-bbIo&YMJ>ZQ9b=Qx|H&lZB*s0$Jm*cnLLALQ49Hj zTLUA-%$@yBCjUfX-tf`Jqd%YF;~5K=r3_|FwVJAbl+`b)4_69kKebL@jR5LpPTmoh z*~|)APW4J%uGnJh-Apc59Qrx77p5iqnR+WFp) z3!l^(tty!s$XE8>aAWbny||8r$>7TIQFlVq%NYk=6SMK-S&bOD=Z~Qpn+LRMKfy(E z2Th+e$53_N*vEIpItFS6J(wn@?M=t^S5_6jlXJpiCBUB{Io1!vJTCrhsEp&h-rVO9 zG^w01HXn~2|4Kh-cd+lEg_IJlD8s@mrYV8{n{n_7AszhDb^I(Wgqrl>P&|`%f5zzm zYDbo!<*Sjf6}m7S4It48(-Yr+0=@kORHraF$uQ0>$w3fx^F~RjEc{~O=llJ*q0MQE zZ9`)&{8e_qm_NZ#VDuPuF|JXbxmY%lsQ)WlwA{oR(pT#i9zRRXn1!Kg!6kA_8GVP` z94!{HY+}}DPu{cBFAL^IWeI4v9(c&i;w>|020c#VHNPsjIBk9-%}4p*3+hqohVgQ? z+-$xSZPl!~g^lG;eTFlx(WFmzjo9}ZS(BP8IMt^9b$AxB6tG*oQ z$?o*kC~0D!TAe>nr8@7v@$W#9+M4%!5ZqN{F@3}0Up?94BUn(?@>F|K7NKJ4dJ$0< zBdq5c1NjysL*m+RjJppQvj!ZQgR@bj)y|){)e)CvPz`hDBe!1YI9;<=L-iNvJP$g& zJkmeCis+5DFliii5!sa9%z;;yhSBa}VKh~-7NWP7?S34-w#y%ZjO;7RWsFIDf;R~1 zC&`J#abj1ak~JQVX1R@CzRibE^$^>k;~t z!;#Bg&1q`Ick4k4R^bVKGZqHjmA(?)$`LEyzu>%%Vu|=Nn(Wvh(J+9zDc(D-Ca-=M z&oTm&#Q*FD&a?WvjTu7apo}nJ3j~Js-1V!-8L&YW+E`LRkVPdBwC!{f`LXV$ zHso>8OY2(D#>lR!s;nQ;WU%|Q(^N-ig$UMXYfh)UuoO888hFyL^-R5@cC57ycywh| z`1{-H+D#lpzimQfD68oHuJQR?KNBUDs-85E3jHH3{D(`BM8IM__Y9&}FV`*Os0$!L zlhy`&`-D;R3$@JSf*{#a-iS&@Mj-V+mqYTIKRd!jP&h25RB_Hb&g=B#D_ilXCo6Lp z`{_r4)<+|mO&!$Cz~&A8peopHTRVi4KfxXQ%)@j@ zFGP|x%7u4Ib&HPH`FkxsjBI7!4+fYL(BsVxB7VU|fJTCeS!uiGu+9l~)Y3-Zu`My( zRzE3fEmVhEGIG_`OV@Zb$O&EANd7nJ48JC8Yq<_L8V5|K4MOGwqt$I4q3_J1M3!&8 zl7@V|?*%EX&&d$A7H<%iBI32a$qwhrrB$bPA#<1MdB)Lv`_so`qZ_nYlWdP$47^|b zJc6z3Z0khhbF&FRneA>P5A*fE2al;`0j?RiQRj8kB8d3I?Z{t@@3eSA9x@#4g~vI& zgx17u!Nx}}D$OPo*$B|Z>mi#To>GCW`1qJ1$B~WDPw+xFF3(rF2@?Gv&G_`C+FFmR6Cn+|3OTsfKT}^NyEQ2y7)*~v_8Tlu6BZtG4wfI+XVlK7RWgti+D_mCY&JPW2QJ$z< z&UTH(ingbe_Y~J&!yP1s+G=*hZFdKL>~LfV=;pz@cZ?)ej3OPvM+_)|eZBdg1}&d(Of&AXquGO7SGU_Ce+U4( z<@`G`#XsFA)?`!n^QLY3q2jhO;pPR~Lz8a96p*7qxXd#w2d|>{+EvJ%5B86tg{nG0 z>3s#U-~CGBG|^{)TXzfZcitrPEJ(S-xfFmBy55B8R)_YFFOir(#k-?cO5pH$;?dR~ z)yb+4c93^UrsjU$sL>e<6JiJscrd$BdSM)|HvgyP66a#Nul7)m<_}(HzR8W_^VK&g z&#~xSWgXZFqnrfr)Ov$RMN|}4%}%SMeQT9vMTMaK(&9)-pu78NYIsfEQGy41v%ZhX z%-%ga2!K_eHnjhhTKy9ew-Hb?_jjCVyAVe4_eYro9$>fw;TZl-qa;2yBI8-M?%LPt zM32jG(b_iJAmWq;SH=_Dk-@?t6Tf46AKjo0 z$PtUzg74Vd?*fIRt ztK30s&C#Y(kz5x0c3f7om3)*If(I+K!lK)PrJdNH9ZBg-iiz|YH6y0C^Uruum?c5V z28exAQi&9(0aM;@C1gjNTr%B5_)EB7(K5#<+nCtU53h=bop8~i<~*&_lgyUP%g=r8 z8t!-v%g2> z_Smte78;R^UY?EeQQD};Alju=%hg6k>AyDqZvd+(s7Pt!{PDzr_A}-N2SdkB0xJSG z)WXXkF{48S9Sg+qSp0X&3!C7)nm+&bcJSfrq1Xk;i`16JN0mXn4B6mUW`4vDeg7V1 z(v`b%CplIR%ko6A(ya1Hbh(6Ipc6N4R%QIIKU0n;2}1a?O@_ z$)c4b$q~k1+SA<_0-WppQ>7`C?P=tc13a?uq3N++G9vZr7)uItaJ-0gIi5&^dddIw z@Eu>e1;Ob56=5V0dr3gA9UUa4ui%Fr8O4mFL{F&H>`opBxoD9YMpPz@CiyzGm_Zpn zk+J-qNwuk6?>&9x$va8)ipXvPUF3

    |Lc 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

    #=vcDl0vO2Jp5Y`MRG8@0TV;5Ya9b@g^s`-KAjc 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
      R{+XR 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 diff --git a/docs/img/cosmos-sdk-swagger.png b/docs/img/cosmos-sdk-swagger.png deleted file mode 100644 index 4d69385c75fd24c2c2bba832a1c4b18cef5a1717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172818 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 z 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%0A;j4?}G2pb7_f! zp8b^v9pUiGv9YnX+JS)q7<8UMxK$r?6oo#*Ci%xzcG7hV&GA5B!oE>aQFALR`TITC zARgY{<^Tq?wA2(TDxXEY*v2YCboh8Q8G|O?jv^p!QE1^S3zl&3t)v4HPLoVn^ z>bdZsUk%r97dw;xkt8gbTTxkA`53_lF`g+=$PXrN;|V-FT8P70j;b zpAI;};JLJg?4$47IBfRSN!lUkAL4k`kznW6Hy6@h^hAQfhzP xA7uwW#7wg<+@C+a`}0nB(%~4o=mc>)ObU0X9^kldy#xG%UDUjgdG5yJ{{dkk5-I=y diff --git a/docs/img/header.png b/docs/img/header.png deleted file mode 100644 index 609eb6ec4f1e1dff811e56dad8c9ecc623a22787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49572 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 D)@G&l diff --git a/docs/img/metamask-add-network.png b/docs/img/metamask-add-network.png deleted file mode 100644 index 79f402d2318c228e7f4a8cfa911cf323ca2ed312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45870 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 =bD9T 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 diff --git a/docs/img/milky-way.ico b/docs/img/milky-way.ico deleted file mode 100644 index a99ead6d06532af43477fbac0b9ca17018605016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140206 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 z 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

      5{hcHO` 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 z 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

    1. QK?-N%FAb7 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 _P~YbS6g&s3T#n0D6rn}a|oL@C1R z0;hQ{3bf9foG6)-X8$Qr;!BOE*Y|MSop+=U{P;)GsbeS8u@i5mi-hhxbo_Wa#QES> zgl+INxo+U?!1K*|S~Hb{xu&+F*^Us3*$&>x_e(pP?*|{~BrUH+`Hkz6efj8pRul|E zH-f)EAyjJLz#xK2wxgbq}rFBdg>)c zw*94-UJ3=eo-P0L|MEYDx7NS-<$oEW+~4!~d(%!rrGDe<-+-pi5=wGDeenxlNI&zj zA5VMt?M4^`R5WPrvXQ}Z+w4dC$t(>z8hycCjzNm-Hh<7hAqUJIN&dohwXimaCu-fj z8(SpJQ3m-;o^K{?HeV@gqx>5^FXh}QN9)_e{GOUWjR5j|dg96d%(xyyh&@4+fh*Z9K1^FUt_!nP)Hoart{orV$0?Ea% zOxD%k4E)^FPdt$;w-Ix?vWQJx2|Lj*C_pY8JQyB?TL$6#d0VB(#LlkA zRHwVI_JkfxmJI$fx~oQLmZ6us`(DRh&G2~hgeA{Lo2>8QX$q9!x{S{V3YcVQ_gY?caYFhVCf-YD8k8j%=TP$yj6$ z^Y~=^sa{*pe!bYE?#|}+v}I&lI(FG+<=SVaqJY*oLC^m1pcfXG6K$XmOs>uH32j1&+uo3`gbu{E`rXLT$d_|BYMn1! z!*ycha7kKzMOa>$gfIJYwIp92{j&Uise`#$6>@)NFRoTf^ImRC^Ln*274y|p=K8Xs zbM+zT&F`;#FK25$jceqG>Ski-d1R{*b)~UU=WIXQ6EMGwx*LWg%pVLz?1Nbx9J|@C zyjv+1b6Of@_@oPiK%GNohzK@7gr`ot(52&S;0F$vN$1X=O8fTS zk?y(oj$F+({(=QoYt$OK-_qMH9sQQp<>tp%>j9CJh)Ge%C<5=h9(^pG{^I9?h#A7J z2C?kMa_98%qiOua@zhC}k42D)LBg*jNl?!i76ce(iPoa4i?d%%}cuyc00GSV>JZBHp88((xklHMplCVzcL^!NMV`dT$v|s?%{zA275^(Ed z$X1WR6v&K%3|P0MEm+LVqHUieoYvyvi>XfNtY`5;NBqC`2UdH65Ln^=?SpM;U)N;X zGL_MyW5Z`xq@XX{G>6u*{E0k8e=^@7K!M3BFH2TTuqDgoD4~;E002M$Nkl6e*guQ%5=Ted32pq`9@)YHv2i@qY(Jj-f6`T(ae^N>%HFq^9{$erO0Kx zWE*(^#6$(xwO{x|tWRL!R~eBSQ|L7e*;u{SaW|IyCW`6e(VcS%qbb*(RbfO+I?~|0PS76U8 z;nrUR+vRU@UyJkw=C6xT(N`PF_beY`o?8eQC@xosrfwDtsk$#`YRD1GF2) zLw;a^k1v4079gmdc+6;Nu!O+jmX6VMf~`?HSOoGGKNrU0266xD$w)0bF@ma(f!E15 zFWn}qG;EIYcfRvyF@ShKoxJ-B=?o3f>Z!rIM18D^I2&pSvgJqzSx4zikG8dL1t6VK zxjq4%Ig1eCbn3zYP|yEq3?&BfB(K*u<{3gLkCJ}tU8z!DpmTD~lfps6xX;jjb{Y!}I{~W>Q#G!m{ge?hn5;Mp4Me7$weK=Y+2pM+qy> zK_MQ)LlWF7ZC=JB@gy>UH8Kry#`(ONemDeLJYwB;5*h5}*Io&Reciegl$~byIXvAXr@JBvE^ru_X@BD}VnC`suj`X1qe;7sf*V9+N^5=oG zjvhT4LdH|4Pr`DuFFFF!(`U}4yYIRuz4twjr~mS~FW_}T1P?=&QkUL=uJq$S{{Hm4 zzjGx0cmL=grLA~8=r!|OzxCS)dB@Yk54|(J^MMD`1-#7m@4r2b65jb|+5c2wrR{y1 zP|tb+{qY}tA$|2vznnhxlOIm+Bb>bLEcCb9Fz(v8=-2RsjcaL|_k9qLqJO0gaUGqV zA7~uqnkV*b#N&P?97Xn3@A+gsK5)Hfxzx4G&b6-QdV8IB63Jzf2tI?X!M^p~KSaFn z1~4?9wrzucqgd-;-DW?p*4MUFp|(c+@>Y?jI-R|@d~Htw{a!1i3_!@^Z8>k-1bo(6 z1fzCI+xkaX&k~Uh`GN`xJ=NxsGte>1c)@nA)t4DDz@MTBxOf~7ziB*d@y>Jqa~1K8 zF57fhg;EFs?wcoGOGn>4ly2W+Sy}PYT8KF7)dR1mv7<*|_c9J^&2!b)&SmDc%I{eW zm<*}A<-rG{ZvYL}_;cyt@mJCd&wd%ez(5l@gyHc!iE^P#Vv&eQHKoybQ7)pSYsd4i zLB6iKYBzKN;=M`=8q&CSU1hgA*3vlfrntYP+~x4pD4Pd~j?g}ZyUgO5^weMer}SeV z`dg`Y=pmLU^3*qG((7K&a@!~Vmp0lRsK_w<$;xwUUY%1uF9v;YRjaBawvr#%T#cG| zbL0G$F9y1vNg649IUnmdu3Y4N523JM|LPZ8KHH80v@acf{k3%W2S0)w5V;`lZYEXR z+=mD8=mzguCl&Nt_U=i&!)!^wI?(OtHj`$+AG65by9whh4bxf7C=Gs6g;+afIgboa zUFuaLgv1`q@Qzb6I2i?-Lcc^^nS%_2`*H_QLmw@$rCqFZrJUJF z`*wHIUlS9^MxD5%90FQJyCKn8&yr6ieknswWZ!peoc7i?#)&+>Yk2ZLJlIvt=6%cC z;p4_pGIz(88Q#+fGuEH-VBnK2!x;HjXukcSSM0H4uckMTA7y{^ZFqfe<9qG!30ruD zJ?M!@>R##tL^9mE75#;gEht0fa;uYHXN1B;4a3S_BtjD>9&2hz{@@mq0bjuLay7lrq+7dZd2aleeLJ1GMug+ z_9Jg8Pn=}=!bkBukHY!mcsXuGVPANo@|-uCr*S4EHB;-;=98Oe8~1=?U!)X`+;pf@ z!Cv<1#6&%vIz5hFOx!k1WCioNp450$XRWj{v1;4X$r=q^&4ag z28HK}^p@*T?c2sX*0}T@&VuRA4}CJF2Om%AFyRZo`e%4mBS>P;aw_fTHb}6k#Qo_- zNv-mC9%Yd1n&D>WK%y$phuMRJ_*mRzQ3CUVB$6BoDN#sx1mWgyRVo{eHlII|buVxe z%>zK~|9C(iv&DGmv5ol#NZIO(q*Va84{ai(a5qfg{F^6JFW%|Bc&&G;P}szZb7^rh z?V388b{%~>-HB1hR=oa3S+_p=;m4>yd($#NEMxd4%Il5+gmS=ajUW4JB}@zA$DYS7 zbR(`ijFp6@y`OCfP-f^+*f&fg@R(2RU)Fn(?9ciP^Kfy=IUVCnUa)On5t z6*$l>6^snwf~Xy9=9#I*)K3A@2E$}qm{?Mr%xU9~Cu=10`3~=PF_AsjGrNX{LlV~Xe{h|gx7N?9^LcHbhBAlnc|JlMw`39o7*vt>V^eafLS-sJQ;!}YDA1O zg-{$xMhW3f}gq*as8Sm(Urk@B4_7(oXo-i=!yf z2Zz#dr!>yzj$7_WPA*CE37ymD)0Sf|r`yMmr+rxW&cT#C^w9p)Lx_Yrkr3Q_uMVxN zvCmz1_XtXIXh;Y2qR<&AxCRNaFQ#;c1$1YF&bS3Y=Ln5x(3w6WvCLk4j_`AD&<5*F z?WmrX-5QFN1+znLy$NKOM(czRMJO(Pw}&oG%`v?6+4^?^HYro#m;I`@?>zW*3PZgC zJr3-D0W??WlEQp+bPzqBSmEsEG+8`QWyH#uD_*-w=>-nNWP5Vm;rU<1q zkw@=ox6qOp`7ei3ZkE4-$1y*7ci`!5_({Xq?!+MbZ~ToQ}xJiuAkhx|>jd zx1?YD)n83t{Nfj*KmB~Bm+j%<`I*mr2JiHrO$T0oo%&HO>q)-~noPqZyV>{rEbX67 zXHc|n85uxWearJ77*hG&f#SohDIR_3T@n6w z0lCUJYm;w$<&SvIc5|T8MdT|ry(N*a)w)srqnKMlVPxtcV%C!KmA^u%HGF$%x^plK z^Hl=ofy=a&{zF;k*ea;k)EY=s0Pd?d0-6*jUb}3a}Gs&#)qy&Rdxb%WYzoG@Y}K_ zz9~HUQ-NNRO8Qw8wsYzoNbVbM-isI`PL8vcD!9#%=gKuzQoA>@NnTQA`6T;$cXtyJ zjrZM_%;cWjy^a2{JmEhpVY5!aceC6?+FWOQpMJ&xsk=6T~>I&*3Q zRn9Q{(-1H{8~2^{L61V##exc%m=P%3IvNg-u6^MLHQ`XE>ZloIKm!(?iiU@`1dge} zFLvlS#P>QBN)ZowbQHNJ4l57+;!h!kT05eyf>@x4a{6vU0*2 zqY4%+)dF`#dHGN5_3df-OyijhkIDDfN-{HsZC44Rps*j$wseU=y+ojwYWXiq_s>8C<4L$Q&&FMp`;Y z>4C!?4v>Jj5;6%5ZcjsfHTGM@I~e8taBVc5o<5ByF_xJux|jH%`}4_^HWxaj)OTTAh>_iZVT+?))xKI(%=XFCbR+Edqs4H4^t06--~5!2T=f0KXB0lu9wcR z4`)(I-i9}L`v~Jm$SI=YEDJaA>P~g?pk&tA!hI?i+)5;j{>1I;rzLRst><4)cTOBh z0~i`~U{o;yp&ohUUWT1z17qakJGd*1v)XF3v$hW!LLCd8sR;dyMq+>$1_h%s=#0Ps zooTO2m!LCji_<-DKhaJmpfjh_9RsJS9v4!`%CGPpb@;9t9%d@kmg!mK zx^{nDU^~a+y8zf6^K`6z1|@nY@IqZGM8UCIPQCyP-k7P>G;_Ty))Xb1Ynm`v;l>Pbj&gD=fveqZyhwK*NI_?Cm(*&lXHmh7`pp z9D!>MA*g-&efAK3_>qUx-FM$jSj%DdJ4fjRZPDv!C*f5mClt=krh^9$rCzr}BWB={xZ~vW76OR2v`j5Z+hw11WM-g~-r_cW0XVdl_ThpsAznXTifBGYo{oSXY zK{@~Hv8J^?*7>u)|9ffp%U?>j-*#Ji=R4m89D%#&Tf>g-+PxitGTs)!?*nOTG~aR8 zYa^E#4PRcnhN9LN$x{@#xo5aVyTh!5K7i3^>Cu&!6_mO1LF20MUG{sf!K&FVxmnFy z%D5y`@GN^Woj&<&nw>m`u>=O? ztTUBiJGJK!+G|**B0*z8$3^&4Dd#??oCZ!Yf5GvV?O4Up4sK1>=X!Tc>o>2%wM|oT z;kIr&2Yb>MBK8duinAN|ti#W_ZnCe;W8Zl$Oy^&-UwpoVB1o^tMR=;S=TOYBMNb!7 zH(0#Nkig%(??1oGwBy(qeZI5mWRtg}+@<-6^xBKxO+WU&kFnjLe31%(=4ef$FfpX? zOHY3{2EA;JV12JT6*-a3wf;27&ui%T%D4X_b^PtW%Qhf0;M)20g|B}OTgP+cq2AyW zBL#|YJ6J2$pnOFL~Bcb2a?`H@bJzi81UO)9)KIC0NE4&4q?dp2C+Xe?e~L2Utx*m@!oo9Fcu+yrt`af6y853o&sTrCiMy-e zhstZVK|CAlMr%Ubl(Y39UsC2O4KeieGBh_T>x{UTX(M`4zU44oPAXIQa^9)t-E6(8 z?^Mq>L&I|Z+_7y4;f%PUO!t;s-w|HeJK-NRyf+DF3($r)4;@Nd35|UszkFT(>d4U! zj=USi=rl^|HgNA|(}#cV{pskzKMol0VNNKsbXJ*EHtQ*>$8+F!^agoc`5;+}2k|s* zUWkbquf;RR!^lQ$4JE5Ohn_w|H0M~UHSk&&yo>AF!_#l1*AE;>x9qz$-Fxr7F<+f? zj)@-KuCueOIYYPioez4GyLY=u?|J#MkVEj@m@8!0a3=O(E@8n-6$3An^71TEzLG=P zJH0Rh8=$U1Q}RnH@>T5b*|Q6pKZ%F=NJJqr;*pAT+i3XePK@qm2=hJ}! z7^jcmA+Ot2Nzu;mmT%tc0_Rnes{m7hkLt60zxm9Z=Bwi8*4F0UZ!LwsZ`|^EIlna5 z^}F*{efRpc=<-Xp-=Qk}1AaMkJP*8n6hLB|0M^R0L@n+D&rB0RSJ_!MR1rTAX+ldP zUZ}DD2?xmFyInU~3comJ`Z_&5leTWz&OJ@ljWVX8q-#nd{IYlL3|kF49hNlS=@mb% zp4MLlt^UrCIcgOe&x}b|iI7jbh;{a9$o5 zN;92gHJLXiLMMnhPbSbN9Ow|?O*-*>pMrQ*=+Gr~?%-iNi!VK-Iu<7I0%R(&e@JR$ zkptrQ-8SO2hF5V+K$#O1=}fa$q-`g>kcH&Q{GDh?fsio58Qi7QmiaA?ro#XCu zAvw?G{xw>_v`SmTzQ#|>Ai}@a>c>()h6zh3Yg_2%C7&=_KsVmm*gA%w%?!Z+(+~x3 zLeV0MgwroQo8}L`9DAv{5DXJd_lx!O{>YnQi2NuCxWx_ska!klHqJrQEW{ZflqT+{ zTLV72`nO@3zJn0^yHo$&??s4(!b61uh8v+wjyY>EBx~{lXX_f1#v;^!nMkA85eq@w1=y5UKHJ> zeNm3}k?W-HZ5_K(+m?OU3fuvexr+$FucqnoS7DGKXmc=+GG5E&+H28se&L2s1*QvA zcr_KatZPw@btq%8T74X5nMdtj=lJFa4CZxKNU&zvizGq#^H zSI`**mQ6adEzNgrO~d!TpEj@!2%L}nN2W8j3c5qIm9|(2fE|P(L%*+}Gr3)@f7_rl zyCzSjJ(H){-yQmfxBcL5%7e~0NVYXn)DfD3;m##=rjcbiA1BtW(X6-~#ZaFt_+fuG z+SfL6H7q9)-ZXasdVV?Yy%l)_ZuqdU<#~i=XN}SWvn#(E9Ag3Y zO;&Ivw%X)NZ*jIGhmWw=_i4PYN7DW~?@muX`Bdrw51bnxO9u|Wk@msg7R6Sgb z8|Q}q{Eg52243IpVSXYT8bJe=5N^Nsy^rG&+n@gM5B@XdP=6O!Bt40K@fZH9w0q|; z;Vk#3KmF4$rQ@R)5D4LIe)1F{mES-RzLfsn-}`UUhd=z`G( z9-F?zd@%LYdcg;V*hSIAQRDr<7c{^0W3|6L5B`z9L}kp6y?>9h-)q?WZ4Cnzd5_%B zmI3@bp)Mn}VFKekQ&Dk)80W4hrQocuy5PFTMOSd#wTbZta8T05;MeC=#+_a`xd z*6W81TbX{ruL2+bRML6Rqd$}5+lN zBZvb(3%^iuGS;w&~>iR@;83SQy{*Ja#DV>n>~Sd?Ae>G_u}ym9N)SYh(JP= zqju!~5uzEo>7MQyvlP$qILAokbwb@AhBq~;kB(d_(6gs?mc^(Ucl)mJI z#GZa|zDt+$ylu{TmCk}lffxBomC+{YyYEip`7TK)=>mI&mn7=(dn(R%@7@!N{rDc&fW`xEz=M3{Wnw#u03~ z;=1*s`m}l8JZsIr)^)*USGK-d`+KF_wZ6MNS16*Ix71^!_P3T>Eu;0>jd5*Xfh&Mh z&uphNzqE5|ZURF__+8-hg%^>rP2k`IU%W7nPH(y`ox5-roeVq*GRL-d4f)tef@?y1 z!uv6=Fz#qWu4;K2{1&`K#(={yyvubq+PRahCs4}o*uEG38>3X@PqF1CQGMTh^DJ8j zLd!8q5w6!twd%xOE7K42erEQYUu>;k>ve1X=9@Rq-s&DO9M+!uA52f-y}O9TrK^%U z$lJaCCeNM1Tlf@S$aq~{W(wswRBiOkDfV)nS$#-X9tBaVImOaasvn`(( zlBwpt+9>kdAV}y)VP^Gih9DEtYB@m+!WKr$KN#Ey1xVh_Sbw4`VKO^$D@1gS`RJ5a zL_LUi+nGre8_<+NyvqjgKqmk#Pb9bqIhwSoQAJUvXeb{$@j~0vHO*e(=hqG2-gr6c z=3;z3L{aiy?os4b2=OA8YnfA^o(SXnSU4Eca63q<9mZv&WXRcJyrj3*Y1buvK+zQ7 z9>4AW*lW0rjRb-{<8wjW8%M{vO@%o5Tk%Ij*OjYcK7QQ_z|2gEbv)OXX2)3U9sEWsa3}eJyGoL&6<(um);a3ktb8DM^Jf5wH`{@;UYM~y_^iSd@7}+k z#eGWxxEATZny^aLf!KB+l<7@oq_nRbg_34c83WY8kQ?GeVPAV4&&T>LaBW*t`|y5@ zukKHC6VIiE(F4ubuJc(Yc=p(}PuHUC>oHGSTk2v!rb31J9Pl&EJW`3Sh%@9atuI`o z>jH0ne`RWcoF)iIwzc~tzqgSm`pR$p=v)u2GJq)uEl+@#@~yj=)zO2a*v@`u#wcoX6-l$`HkgO4o)JOTD_}x0hIX zFU?OucW4LyI|#XE6{M$)wfP1g0T;4ONDrZ+stZA1l1_?4x}=x%;oL>=uG?Agh0?Y> zgs|>>bVE90#mqeTJq-(-u6@!%%BtA>DW1?fJdx8->o)3!Q;Kx&k_*l1t&il8c)q zdu$JM2II5scc$LK_oUv5=iv*V#-R)gcNFQJgbm#&T@5VRJptn!0`D;fj;)>*v%rzw z92%Us(2KDlUzyLo`u0dM1F356%hIFe?%SgcZ_io=9t5Wg=@FV;uN3C2cs-s0TV*`1 zx`l-)aNgg5>G;v(gxn;m!{A7|>#loZ+oNZnek!#iVEpd$&!-Q(|Go5y1jqU}1hJfD z6y|*sS21bLk@GoU4Xs&KpqJeF9s4@p@o(ex{HSq%na;^1Ga#0!=ZqmYAAkJubo5WZ z5ciHBf0F_jGk@^RhWtEm;7|xt6}}D)?Mz3H9*EG$zw}FgGws3?{n)WLgDwO=htl)- z;iGB)J9eknUpt!4o+dJzC_Id`6=o7H8AIZrFRWwTpVJDdgfaB50@@Rj7mL{(wpMSj7$nH0b_hh+e-q<>T@Xaebk_RN~ zy`0L2mTz3$NhtI;QAAnite15~Jy&bUdM{t)GcW*Vd6Rg-!P76COs~B1%``Q6gmIi< zKU21yL-4O)TjBIPu;8%>+{?LnB8m?T#>%!dD_4d2=3R!ZF+`P-sy=?3o$J*$pSH5y zOczROJqwMzrdOb{6j(pzD*YFY24gf}x`1f`dHd2mUeQsciAB8Z*xG0bCZKBoL9E7z z7IYO!1D6`c5wE=ZOnUI1_oXcu*SPX_44j8u?cM3S&pb`gAGSKg7y$Hg-IDMk&(uag z(IM%@*ME=(w{@l0pZgX#4}61Ax*erUJ-j%tTQzOz@DilBXNku+BM@6uBzVyr?BR6kK=CUn#O+t#8*}7 z`Y&H9hgd(qPfLHVg&Q|6VdEU-8&}!^SB`%*sG@#=gj-kcyk%cHdGaV`)WV3eVPv1I zTiV&r`|PnJX?XW-8#m?(b6AZIyo-m~>Sh8NhLLYJLx26;tPTP#ylO?rM$RQPyE#jr>KzSggIBRE<{SJ~!Tn|2oR9kusxk+%}2Bi%IBLZy=P~kF3fFHmYX9tr9A0Q@z!oUj_5(o8=tF8FN$kd zm2MekIR#EjnF9klLeV`uH>uFp(|p(No$-$OL$S@|@VpSQU(|?((No;SI!c0cWh#k zEeXfc%degSjysu${V2KfwgheM%vBvNf*wHr(;BOm>X=s@ETneGTJqs-MoFX2d=6I=0VPT z?!7-P4GgD+iHn&4anJoO6MMFueC^e=^X~gD`x~x@4C{Fgfkt?dQ$mPSESLRCdf3~b zSj4SYI3y1bvuUg&151 zjbIpMa=EsM_>;@>W_aA-iP}dv-EJ0IzHgm+w_;Y&!Vv^qQC=HLxl|t|qo^Ds1PDR^ zQsag4iE=DFP2;N^T%-y65+uq{fvyoio$w}v>TTb43s(IdX_EcXqirpWRcF6BS0^FG+GrCY!vfz`zEgd*OqaaitUkHM=X_uKJd05r)P?rY2CT@f8|sNP zP@7BVFgVH~-deGJqb~LVeX(Z^?j|$I_5}}c830oQuMFTBPk7hfe{HLU;F3oszQ*kN&r_68(Di;LWnjTnYR~cLd(&=-Q+UMMbxsFw8JjCO#8? z#NytrTfu~S<3}?+`rgOzklxN7h*RnNFTR*=zvtex^AxybZaTew{ABD&X;}B%AC0w@ z_>W(#!8mR59pwSbiSXuuf6ZvHF_#OoY`#Vkp}^%<=en;%EHa@Ur*nE?z!}(FMcWR z_pl!Q*vCJXPMGwYS2kD7#J;l0*fP)A;K(o`%vCtnl5st9%pgRQP%= z%ea{&&Ji~iJhhp3-WGZ21NqdgC~-R5*~^x7s{LYr(OP&sVL8tM+oKZ2pRdKManC2f z1aZxkMU0;uW6rQwb;neM(rtssT{~r*vi9>_4~y^Y>%hbNwRH5v!8Evk2Qn~uYn}s- zGmQBm_9J(uMU=O-3%mwTge3*b^b10iC!hXis`au@`}`;o0ND~C5Gl`LYgOFTkw@H2 zo9hAj#(=wq(~hv%i}YT26z)n27-g*c`?>;m&&*;-^TL#XpiOHi zt4dkd``B7{c^CN^!?%l9Z1Ihj?BDC1mcQ{9krTgPXOix??bdYcnWr#_gYBEA&9$h62B9WJ|1vH5T7&&udh)GJy+)br`WQ(yOdvqpfD>RLZly!95q(dtK7&g z%B2gfb>6B}&q>L!X& z=n$xj_0h=76r2}zUj#o#n>mjJPWIZmW!!B<3wb<`;1_6#VXZ?RAWey%@8X3{KZJZg z3d-=|Y20regGQeRZ3wuwADi#wBCKz&m(NzFMt!N7kCuxsw^wFf`>Lhf+&e3?SMN13 zYi@buT zdX@H`FgO{2Z|q>(K^6DiL6aQ3@M+eF$p*#`E7xdw%AVm;Du$k%olV1DzSc9LiX63F78H z!MnEa;5&MsQ}kMhlt)f573fQZVwL#_%PjUHRm24qXVIBoj?kXYEC|w~-p$Tgo;iot zDW3dMy*Nh3T+MvF&R@ewNc8kZ@17&HZVf>R$`_gQ{98GxGf{P6l$nPv82Ig7C}Me~ z77LQ$q@u6avuvIBr=^ST{NJ44|(HBdSaSe|utoRo>xh zMN&}O4!oM;9gh{}(EHZKv_yo4MHCua=TJxyLfG$50g8L}AsDNC!~DVIphQ`!!>r*6 zQ%`uuMCf?G*i6CLHQtT+z@s9wwLYD6{KD*cA}gH0(hCd5k;hYQ_yGoF9~n_>%u#{9 z+gMyfl-x@`SGD|()N&+}Qv+Fwzgm$AFv^{AGg=S&3vs}DDQ zo}u!uq9=OZ%?IWA9E-HMDZI52k@TZ5oCkq0371$H1r}nQ!(ti*`Wy;$P}tQa-)||y zId8d;x4=g|D1h6im)MtmKJ~L*NH=(A9y;Pah_PAvIul+G=H1=1Y0Kg`Hc?GHss}F- z!6U`@8aP8bQxZ)Ld|Ixr)zMFhrxzy;gC<3RigpoVoqHX$Z97p(4iUwqt$iCmOjB1) zw4cZxebC$v8&K)Qd8Mq4WP7UnxqJJv=?ukNB1>l33sQs5@Xeqzb{UTr=22i*>4xV) zS9s`oJoBF8ATQ7y4@+GwbuxZEY!A}|Qeh2~`Z3h1Z6U;L;{v{+%6Jfea&g#sD}t2B3yP`6u9;OsoM*E`7P zboSc$BcPR0iCfp=Pno=>tSZhZ_uhiz?mfHHU;i7QO8@#-elr~-T=@)q=Z-!5(wXDO z*#~_t9XNChKG!H)DwOS&#)NFCYvGj@Ix28f&{@1^;z+k<;jBHKlldr=i(F<|1C;0g zKYMQ)W%+R(_Eo=rz4!F=>?`&GNRWg`iKG~F5h+=uP05SwoY>NF>^Qc(#8E!v)aQRHJ^ReF>9NNjXHCEwiFYvaGRLNLqntf|@f+#Y zGhaq<$0m1RLuI?4Htx`GX%Kk%J}^VtJ|LiD_Zh5kac3M{vwy`!?L#<1Z3 zo$A?+^4`Wr=jw0|n;3h+yAbhE_Q^!iM8{brg&bh%BXLFGi>gnI6F=tmEDY-uZagR7 zLfHYo$o4&~##IQBU&OOv?OryW`N}us@$mcV;86$4y*z%dXRwi;cfDUp_ z^*rvjC$2w}UVCL$lr^FaLYb!w;tk zV0qCE)!Po#mrOj$0?90Jul$-<$l8~|LCe)bt39^jQDRy!!L|1c8xK2!ZrCLPJ$UhP zQ|25rQ>C~Hbn&XcK|Iu|T=$G~=bA_Ihf&AQERfVz^c1RqR_|@ZYO22L&e{3rU>t-c8L#Z?0*2=FvLY)bB;CZe3++wz^ zy4TuMvRbPRC4T!``!1&|F-k68*Lv6fUUDc^C|}y|T`8yZ>Kj+nQ%`;`UA{Dt4j#CR zd83>5241`_r|Wojym6B`iHvTB`8&H({6Kau>U@0x0WJ#2e%YFuE2W>_u-u z9bI{QD9@6HK~y<#2YAKx;R2hU2RK4P10vr$PxZ<(hjP8Qxi>xe%!}##UXO8fW6Jtr z49zc0876#4bngQ;KS+VZ+-VS?CFgXFUH$LB=YEcchSd}KZxFhvL+|25T0nvBxts2|O@o>|F)biG zcm;!^QD-KcBwkm$OSmELg8;{F(~Yx_k~^zFQtHKA?`Uh(6(kT>zV&n7wz~)imu_M; zH;z%FXFRYR+>{{UvZWhk2yQNV$*-fBRlOlIAp@W?pa`N?McRoMR3sEP*Kymw?>=(u zO8o}yRjl#MLbQ4jI=v`&KE_^b>o?m81=yr z50@Y_<9gOJTVs;}&&WvwCLDkE0IU;?MeZT3cCEsRoCK&fuI%4jdob8ZMbpciI1cLbQ9YT$}; zkPQyYqs|UC40yio5ar^|4sQr|LhgYw4m;T&!kc5GP+s<6mJyiso}aK=hs~WVx1N{t z#ZX=9pYGgmvj-e6X@`pDUX;@fHpeu;OFeY%0O#GYJ&GUOB$(?8BSc7yGKsJ>!unSC z(HSDPS@0I315T2-G&0mo*QVxCoa4qF%jP~TZf4oYqveyhbR(c^VmWgFtCb-d+6^*v zVY?oTW;~oLX0r+o+Co*g9Yta4GRJJti4+7g-5iYa?EBF!ER}H0wy=!r@O8RZVP`)_ zV%Q&UtZRk(Jui2J&VbLC=n&VWEjmNq!Cx>Y(whYa%Ef=UOpKOT5k7d&f*{{3f~dl# zJVJ@c6*sZA5!o?36Mtw_;GsI5anT{)7IY>HC(L2HbfyblW?|}5;Fek7WndJA8FVG) zK?q48)CVnqR+2Nrt4UuJgw`qlLO3(uzy zfA}MKoq-mSb)!i;;k$qK=l(|e>Q}xRasM-1*k8SJC7nHUHa-6Mx5-o7=QcBsBBD_|iKhWT>387@3lVBdQi*3nfYcK!)@mx?n4!@4(uPq(w4CRH??Ih>%qG7WHqj_ zm>4VaTgLNV6Zg7Wp}+CgnRM^rN643S%;)E@K3`zNto5VnyB-ueceClBH>|6WH|z(u z!7JPDkafuiim2{{Tj~MlC`2UEN^cxjF|~9-c<`qTYYDj1h@`=Bje9t+@6B`HPJ<)& zrxSO73c>zSjDY%?<5^K~OBLCHM8V%sZyEuk!rGOV^sC^Pn}G(!8t83+*{wEZt$DxI zwBK*>v;aSH&t3YRjAN%{ByGQ&G_**+`1wb`9R3cEY^6(~lgc2IAwRzve+-?uH`+cTHhBS>KtB%ML#ApyjG^twP5?Wr!19% z#%AiJ1sfT7#!WfkbgXGr+*@|g66Ys4T^tmAE?-P6&!8tg74lB)c{b-$qspZ_$H%aO z(UL!+TPAIiPPKz&7;?{7x5Tr)-~|^oTqBm1jq!DfXQ|RLv|E< zT6pJ1D?fQ0o@$n940Y!57~%c+*i8DZ-~4)d{<+tIU5qG@w{6J1X!b}C zbM)?ePSOSpo4`A>oV(uWV%3f?tOw7C$4=cBo29A#hM|oeHjH-XUrn`VT_mAvCYd-;2Rd`mo6~5@`M*B%|a+< z`-ju$z4xa@73j|SHXd4)vHO#Iand!`CzG09BgoV69v2S|ntdgSvGrNEV z+F(q`4Z8W;#{d9807*naR5GrW6oT;D^Ln@DW_1k|2O@w)9b3eM1k5#xOWpr2`XPvT z##n(AOwdZ`Vs9$#L4n?n3Qk$aDqL;+T9AMSF%L#yYi+6}-}0?Fi{K`1TuOTt#DkD~ zDh0ZhfrmIt_bQfwjV6|XvA=cwtlb5;S+IwKd7*Dg_t+Q0giX!YOiBVystk?G@JH}o zL(E02+5^g1SY~%UEP&YH5J$8cX{`XFR=J%?%~}zvde||J>jvS(i4*I74Fa+5S3c0# z=nHR4`&-2^7ir)kFc!KK7^->3fE69FAuPHHj>XeP1$_T~3+6K5{oPadP+CzPml7_B zX2ENrKnF1ikGoaf)!0VqJtb=auau$T|Fu` zGvn!Xt)PdNJ-th*U!h|ShXu{)sJ3V%6dfJ!*UI-+-dTL1b#8{cdFc(@tHa*T(T;t` zq3wC$d1z!$8oaiUZm?6F_2$}v@#tg2!>~t%WcFh1c)YbtA=>#_NWqrrj0s5Sr9n9= zELPDO7P@^9s0A1EQIe(kqhNUfZLCb}=DK+ASd|~Qn*_EmieaK1M~`U*USGPk6SwG0 zDCaG=BhU^@^~-v6#=1(mrJ*zPZ&6L?j0zvmakm2*kjCJF)IDxaF6`GRC%)|bA7`3X zkY_N67v0S)&oak+REW?8PuP&IBS37@NZa}S7jmC6>!a$MfcN)b^WNqfE1>FOJ4y@IyU>DY1_C?^uZWO6l)tC35TE_sGNPZ~ymyEB)d>{(sWM)tl+r@u$-9W5-kf zV1GKzIi8af6DXzoS<(TO9P192LeGTb}2k|I#o0 zQni*U+2yi-<2U{t=as*bp20F*>qG0U<-_ps5Y|rnQILN-d8YYctkpexQ$>qSP-&`5 z_s1XmPI~&OC$Yd#ncBb&{#bhS(QidrS|sbS?AXyG6}~EEx3BhwxU3Uj`7ZZWxms?< z4-p@HSMN)6v~R3~d3JvDdkGtTD{=nVT^lp-T<3v>Z?LiA^|WWN*r7WV=s{~(Qwm2a z(j9mE(Ee6&?naTksYLkBJtt4K-B2anZnAf2e9n#@z-tZy(*dlGJjwvlOvtTtOH+8G zs2c5jvJXrD8M6l=iI%?O@EkLoeZIVeas_^B_!ype*l5WX_9{1HuMXJ)Y6E$M^M!$0 zLLt)Vac)hf=bnE&-F5gucnDo#_of%0d5U^ctc&ngY2NR2a1$W;(nozGSZW=_HR>?3 zj6OCZ#hJwLJA8{i3r=pQ%l|>iuRV(#H$xq!d@f3K=WVt`FSye=o#(Y~Yv(xMb^n3m z>Dsl|*+?~?&c5{fSgh{hT>4KyBZkPw+}@cWdXZ+x0~^Fey{tLh0PeTI@w)-0QQDn9 zoAm&*85inzhYR%uHs3i`AN)je*RC;WySIi?W;F!=qUYCTcrc&03JxmdG+t8S zDqfb4RtZd2fdTbin-ygl?(7TsHkID!5ThK=M4p}&Kg*8*kufc)0eLFlXwTBzlZ7V{ zjt%8Gf8CkCd0vng_0Owe^Yy+8F+kQew^Rj;eFHz4(OP_=#daTebJ{FL zQKi-wZ>r%~@owV>E6`b3yPoa-+BlaLUpu>Y#mB0+&Ej;X>39y1;9cj6(3)qdOKFpR z)h-OFV04;%pc`xJEmdBegYcC3ka$zQE}&%^Nr~5z!gQr1^YKJ-%`^~00SkO1qII60 zTe)_)bR8O?*oJu1)5tY}FE@V7<27lPv&EM%fSlo~7bTBakOu1EVQO+JP0!4x$+1~Z zaGp-zd;TrHjRH4#{DJT4?ivQB@{uRb%`hMWuJx3Vl``;A;s|6g>HwFyQZs&4s{o{E zZzT&;zo$G)*-d!or7^D0p!44Z{u zH#duP=lh)=xRoBzmFqMMmgA=$#H4x<7oax-r-%NNh5ypzM0(?;7t$%dFS7e%(OJ8N z;7%JY(8sS_#!@#g@+GVanH#ul89jcSiB?AwYiFu!?OqfZGc)6{ujtN<0lv4?t+}*oz6mdlYe=@iO4gsH93y^eM~!rS5tPw*ygxg$S9aTZiBQ% z8r<4Lh73SRE>;+C`#@UbH7FqSah}ED0CS%ix_%HI z>M-Gb1uN?(%2V5NC><-C>{3k3)XTi@Tbu;dO!Fijwob+(O)X!lN$~iSx!9;BMGDlG zqxv!9FW(o~B?A?wCFF63?$qkv{+gRn(v~zET}yt(i9EGHzlvMTy+>(iGmRcPfybJ2 zsh`bdO=xM}scmF&buH(p1pEaX*7~5MLHf)07@Qop%)1y*UX>`VoNDcEz1!eM`WtkH zboRCR1)br@m^t7lyy2KW76)~xaO64^5$JTtZJ>9=Fe3;FC~_+od>1R8JnS-cKHBeMT1G9<&L}P?Tp~- za+a}BUr~O3zY~80R%&^#gvb0rOAC+FC=GH4c`xt6J-2kZG<1^+trc&JNjJ&)&gZwg z2ZRjQ4?QSf^ms7<%yLQ_|D4ByO8!?sD`437yeM$sJy7+o3C{a%hiw3`O2Pl(fBc2? z@cZ7A{p;b*29ylz;=```WsLh{fB0@Z?U}t?s z-}_n|6*#$yn_cGmtwP!>((?dLjj=G(lCKk-|J5I?Q5VuZciol#yI=Tk)4%xDf0O?3 z55L8^cuVOEU-)7=^}zk<#qYgD^hPMXC4hNjFPosKzlvztPO_Kpa0ySPe%_QhK+|#usP3vDrDPjiALG5R)}V|;_#X%u2BLutNySL zmyo7)xf7eXnLcq}4a6jY9)!tLc+Jov z8UvARm1)ClM``IswGk>;b;L#qcI2BSR%mL|{2c$aV%s`lYODEdT2L*5u)*{VC4zHW zzS@xK8Mu_^_@V3*cK6|7go~t+3fBJAb4n&gC#% zf(FU=2Cm@UPR{Y&YU2-Tz8Y5a?A@CN_a8_LZ(VMUg}kOR$EmTKY5eMy)Xm0d71EV- zVMn`Tcw_|r#EnX;XOXb69(*h=;#|4f+_}K&s>eJacHL~;pRahcR(gRn;Lr>B7XrA< zs!0+(K(SUp?gb%uP2&!#$e=|LwS}7;mTbo#+VMPoF9MX`qy}T>H;Ax$5m} zB;aM~(!x`hI_4as#E2Sqg+^CzHo8bv>!IXVf4BO+vxC-3WsQAb8;n&MtvwE_qOEw5 z%UY|%dbHAC^>_JR>`9+jAA+y0?&ZbgRO)FploVuDo=;U)-|>QYZY(bOR9U1kco~D^ z!&FL>$P(u{j%5a&+Z-GD7Eox1F{Y!<_bY6^Szs=xpm$?SvpIlK>0+9ko?+cFpQfi+ zdk9MbPZ-7GF=du-S)q@&1oMMuRbf8QnrQ*=5cYe(6!n{!&>$}d!J^4gu}diBr^gTC z;en%L7NL*Jtc$v!b>M-%0o&^us`7$mUj_Z74#27#MBISPUw+JY(%ECm&&h~-Q zd27AJ5z9+#N=1HV9VaK$Jh*v>v8Ygznwi06Bx$4Z|`W@clSMMae9mi%3_D1Y&1Q8pph=W zdOCdwYw4NF3MmUk0C+Hl)_XFUOC88~nT1F@5&Ei1CSi96Y6yOKXZm^wMueBvM}_me?c(ns7IEWC6EGPnHmDzgxlX8M4)f48 zeJzdb!wn*3D4bY-KAARKd6~_!!fXB;-#S@8E#ho%Fw4Y=y2X`0TMUsG`9+|Nt8bi5 zhx$M}bM*D0lk~adqbnW8GH~D~?(NtegtrbVVP_hwT{V{Evk#=#T*lo-$&;_Tw=N;~ ziFJ*&FG)ePe&%PA*7qub?^Zwx@qMoJM)ZBo+jP;N`7u&khnWf7GVeJ;8XklZ5PSrg z6Wj+aK)4ow-vu^l^m`^dOit@uGbTvD6W_B!XFeTJx$)Ko6gbp@=)yJrpUGDxNmjC% zKW`$0Yj5t#*i^4u&oPFj(Vg)mG@<$8Lj{Ohv@j?-uB~L_P*{gs2?eI>%*#gktk*^bWA(7|ss3f{dqG#iuY5&U?Q_7w z3}fPS6f$Kk1EP3d*;koCY0s0j^S{-%E6Z9xms{%o=riDqa7*deug5vdP>`yh(bn=q9Pl&T{L)P|O)(~NGAWK07ONCWBtti*BG0ON<|WQ{ zhiSUAfTFh^DOju0{WrAwJ4#PU6c{|)hZB5QeCm>4q~GKjW%s0butrL zsMALp+rrINT_X~I6joN5aus4S_ww`;sv7}FoO(s&*T{rdN8D}>5rDa^y z53%_!&XKdzL@XWrlkPefI8I>i^i{?$FFS&^;WEFn61tsm(`tKJ^NaE`NfxG?i@dUEPdw3Ka(DN^ieE} zU&fN5FFo|0htd@k;}>!B{`sH!Db6;(l%9Y7`RKDnHZ5t%-hf{I%U}5w+REm-UKDA# z>K-2(hbA))EE50hpZ)3dna})*^yM#qCH>of`y0?#APyXCkVjYexd`s~z#|_>Kk}gu zrD4wW%q_R(xzA}Lb@Xlil6$Rcs#!%Jl&?PKcoCgj%abo@vW^jE!;*uJTA==pN3IR| ztQn$1*Zfjm2LD8vRjK9mwyt%sSiz%HVe{QA?>1+#tzuh|h0l#brU7iWp1Fq7d<;(l zzsJ~J4@d%u-^R4UpN12pUq~rBY`W{*>6zHlmT>l3DL7o|)Ij)Fv&uRPhS1$5u zFYoDt!@~%fC&Gi#EE^Xr*B>K89Ar{3ZIP?*SSv5kZ_R!@XBbafo{UP|wOXkR+>%A2rrTD}|6csVXNTMF3%e(k6sXMjgh+0>0!gC)x+dyfbm zKE@wpO3HoWoOb1Me6tU&v||*qpQt~{s{V@hcyEYr8)JbSvHI)SMf<8ux6xMNw6m?j zr>-bq<%1Y1_{TDU6kAI68noOUD#UByzNn+MtlHSRuFShU#RgjWI-*-l3Fd9zqFUga z@;H=S_9^ki?*`9&?%^9TV%;}_4D2Q}U~1xQdhO-^lpc8R=cw;dI8(53NzB&N4Q9rk_^e?F}RE{KwX~Z!_!C zXIrg%^wk<=tRB%dBCYdE53jR~$K4MhWnKc7w5%LJKkkY}k)ids&8>SsTdUihC+ zLl?l!u^vYh0xs+$GHtUBrdF|Q$Zn*0gG+PeqH`SAIz2NNkf`D}+7b)u)xBEk zQLd38b<6X&^hdnC?LVEl)yF>O)QS>v3s=0_=7V@zzOnqXAH?~&Kg2m%%@;Vl!e@Fy z%BB+>^69QB-rLXqa*cAW+uT{bRrMB$Jt@gVC5Y$BeYsZOTYNxyzhhTRtXIN}OP$-b z$+Kf+p`EE#e%<`3jA>`v*2>rNb@r0SCik1l>gr82VQi9E5(QX_@y>x6IS!FMqeRE(V3rcDjhge^!-!n8C`+}cUaqrw6 z0vB~HpeRSjHG?v~AFt01@L13mc+Und)t#s2pS`uP-T_AS&q&U>>nI}#xbVs=rDHxX zaa?A+7k32ya1{9Q-!sllyh!8p=GBjf$~}9A(#`AM_p&hnkCSBklmE-7(}@q49DA0m0WJJdSWy$}6W|z%!o<5Z^*DSv0)yz2{RmJ7Al*%2QUIk$ik+9^?s_ zpW1(!cent=WeslNTMU77gh@4oTfHe3gdq%SS<@uRuy#BjrR;iH*VH83mLKz0}5$Utc4tH}GRcJ(KQ#t?JSQ(dU z*VLW`TnEnslU0F17zY&aY1zU;tRhO5k;g3O<9&VZtay$xOhKsM3%xSjR>5GRm~-`c z$9IAv<2sPIsb#%Bi3D%MpJ?OTP|j`@VgI>XR8Pe!&rzWw$bymKez7*rE0|L%<2Z-X zhYl!=({9!A2R+};zTHlHO}mvjAf4$!={Y|=6|_$)F}PR0av#IwKFX-d$!zb`?^Arl>8O}CmQ4)*x%w$J_R*DhG zKgU7=k>e6y*Z)&}w_KGo!owQN$4GAp^$=E*B&@?w>%Jp0;DK;`KF!Ze;$_A{GhU7= zhw#%S6&`31$PJ@#kHrJL3_9y}sOY2uieBijs}AbNPaI3f z_=jidt7~;eO`}U{b|I%-#ul~VTL-8$M^<2ybI93Jr zU;K-IA-(tE_oPDzssH}p|ND4TJC%O!=YBT5_S$Rdi(mXAuGNpG54`{V>GjuMPd9Gf zOrQSopGY73*pH@v`7eJpUF6(%EzK7Y1Y6IrB;uwA!OnfBj;AS(d^vIQ1hTW-9{<|r z2OoMUee|OrP5=5||7(OlH_{~e4&8kMT+c{ECtLe=ZH=hHK zk)3_yeRP@G^IV4m<8C)t)7uTVTZh{%fBp3G7jpPhX_zyPpZ@MwvBr4=#RThlJl*wR zZKq|;%xrdp>3XsBeOUBhdEOcP?l?F<1B~0l+!;0UTJ>^`7Yod_X8%aKcHvsMkJodZ z{OFcLOHRW)qdh9*4ZVFERBp?e7uX~(8ys1h|6JOSx4~|BAzj|vFF8P0gQw1Qk%zM{ zJq||QuyeZ15ivIhDL54H&4u)x$Ny9Mp@%+}PM>`lhkR^)>?q4zZZ}v~c%{&* z!R%D(8FCFjo`#NaOdg&J8%^u!uV8RXw5~pjALL<5Tl{vb0bCwDpo7=W&v)X}YCty4 zyo|AZx)VV>7NE+t(C|D~Wz4o#PJks*>(weLRnTeira_DK?grnNc%EmgJjac9;;{Y! z#%Td7!|Chk%Ec$s=)R-r=*dHA3}L?p3-5-IRcy)&88_Q}o0WR^;_lmQ*xQg?Ysq;w zR~*DR?F=~FbI*0HoHtsqVVAk}*16Zx1ApR^X}UE~Wv;hg+;&adGkWV;9Xz@(_4J{% z;>eO^WS?_vRGedjPY*P(Tkk92pe_{i)^bS!8Ntmk;-rQf9+$z@Tu;C9YMPk-SQ5Zs(-fB9ux*rH zM!-z~)<&MJzIipyCTG)P30=AxAavrrY?bR;M7os&7$1eF{l(hEjgFOU$FI5NoN$h^ zvIJ{W_iAfheUtx2&2u_$Hwt{ueGW9xq0%$yr}(rPIFB~a&dst}SwtT9(8;uVjTlv% z%)3}Yd+(YdZ^ob;;75MS^7Lrn=5>3~XMEk}EV=j1V#tE5TOJGJ2-9|>xLq2mi}D2( z%DnV^ZehWDH^VuK@)ufb&!KRh;aCA>DXtGRHk)K~tZ8*;u9dc)hRkn~G|O&=C9i$M zBWZAeO|bKLW|(i{;(Q7|Y9U>{el7ZNn9Wt6{mFyr#itk2cfb28Wo9o`P3B53oA)Ls zC)4$t*KqWVw+Y&+_tHi9phd=DfTN;j*x@oVa*(#nvq=luUrk!!PJXF`MTp{!N#~h3 zUcM^NIolb%2f|kQ?dC9P8$-&XxD9^+snB($8_GBg##7PU41R(yGmMM({2RnDFXoy3 zjAGj{j13*k?Vy*qJ<+p}=bD?F^unt$tJn)k1!noyg#oVfNFEQRo-y)Zb7zP#rLEMO zAI3bRdl;`7_;5DBt58I*bP#Lw{zpdBi4Pu+G+X&|M}fYTUb++KmU=)U;xc22n-72H z)9Jgv{~r>%#(1Zqt_cHq^W5uc_Ucv6C>@0!3gCizfcu(dIzI&Wv9~U!CJ3p%58fSl zqeoAqWvqjoV3u$E^+G5uRG?Ew5kYqlt(d0HW~#wt0|}}aRnWWy@{@?~W)Mw@&OB#G z_quKdz>YZ-=zS=dRkTI-1OrQ5O9Mp?DnM|*JJN&FA03BCvV2~z&hB2bNfL_ArnLxm z`B0i(uIpu5dvCsFQKF)z+g;EoHqz*O>0?~$9=RtiB1js9tPQdg{HE5{gi@zkR@{P= zX`?@@5aYXzx~$A=7+Mnrm0RpzI|Gp|CQ~0=1X+L9wWq;{t*Qo)#-B(ms~z zd;3``O*p!>N=M)F9M{D(gcXiT^f)e!m_b~s9b+*_wYqfPmVVyoy>Se!vF(h!>bZ)q z*qB=h*fNw$L8J>%e|N&I_ki1te@g zfpJ|zf$q@7IfPmtId}ZIn3IX;tIACkmd1&tH;Grh(dQAuKq441}1PvXf(YmQuxSa=}vj~`YH!IQ3==9FdJNz89hJLAsdLP9& z2TY(qXA__Bl7%Fsh+VbBmX3oxy76MLr-wyJC2%uYEFA?Q$20_)ctoImeegEAWh~*) zp+n_%&1(zZgv|=z>iu7*KP@^VMx(yci#o5?YSWq}b-v6CvaE9M{I>aXtKJcHWk*N1 zY@WrMF(%<<6!P>z>oug;8cs!>)&RMEaxC&?RVPyzGd=Rsg_`eO1l|en?jCR~^?;ya zi4)pFagH5U2nEF1?}kvHhwIhHngVsL&)&D5fkk1}{~^@&Hei!ky8(bWK8p3kR2spZo^vBM0a+{Vt(TUc3dY1eo_8D@O7)gh z3w|T&)8<ryybAaId(2hU4AWHoOnIG_Tuvq-7(#bAU;$^(NHOcY+>Z&5XPwT zZ+gO@FTrC($?eHaU0DtK+u*!k`5CzJ#irF3zDh7Mm_#1bLN`xb5>h|wXJ%ed(b{r2;=hN%2Jjz+<52wEV`%t*h?r8t!b=s{Mu4DZbTCiK? z>_)!pqO?uncQhVjI5}UKUvIts8uDY5dMz$(XUgu( zCFFv6ddDaGJNkT`{@s6gU;4gwn6rDahb_^4f?`AX~UMT7OsSiN1@ z{G8+EHELkEh~N67oVz1rtl)dbl5#AnU2=|Gaw=DQt4{X3&v@QZwtYE=&f-kx7yGme zx~Ac!UZpVQKrxQSNs$j3s2EoH?FJ_E)hogRIClaW$}I8^EwA<5sPb7@3C}sipO|2_ zz?#X2d5qB_eA+CV-1HJO2OlvvOTVE|)+xv$9&EgyUvN$0W<6@h@dSFIaqFbz_Oi*P z@N_=6#+I~Ql)D6EFKJ@(Z zndpy-XQPtKT3-aeWe00rPJMaqM&aM!dl}zmZ371}85nt7bv5#8&^?}(X{)eduy2Yy zJ4UkVki1!sO^xzu63$9E(x9S^a7!$WWKAZnV7zS`H*CH^K14av@-RkX+8%KL-&?c;RK_6C!v@CJYGD9|_PoI9U(rUzW~ z9eve=>QewLs^!OI zavqKxK9UwiSR14-8A?i)IG0vMzM)5@h6OVby(%mL6*J+%$hh8HoOh=@ow< zo&}~cn2mR>?-8s0r;KU)&7HgNmmVk<=*!dNFpgk7m^BW&uq^nlbySE-<}HM9Gp3@xqMu#h$q*vl zX8W8M;<*Ub9P-|pPmfWUJbi}ewq3uY7+pf=9oI^GPf5W7}Q$hdXV-yDG1xfDU=qE-rzgxt601Lq@muO?v z68f=s2p8@EUKx_ouU^~H^4CIJ1lL%kR0O-c&$&t=1Y}clE#p)bnft%>u<9n}3Q2Eu z45HXox$fKx7wr=)JZFLFL1;9+2M)(gJw0M~WDf&2JNI6upIJCyElNM{T#fGJwA~(X z4D#r#PU$ycNWF^+b2qgj;$VEWJa=Kfe%jT!y>oA}S~i#8p2-<5Td-O6LW}>fafI@m zpW1&*pE<*&A@)-}?pkxU@Q>|W^4-MP1Qy$`V?i;V&YXEQ9XkZRhCYP#gLHxd6p(4Vw#}JzxGONpb;!M_8%BUFgu@)96g-=&fobP;llm@{k309 zzxR8;o4)tL3kcY-kN^iEZXj7rd`!=_B2@ z_rb#qB0x6O=XrtUP#DlZvmT>{wO3EgidV7j;__e`e+#38=_Xc>2%r(F4<77KLkP2% z;I&MzP}U$mt9MN(XB6bJfld~FZUXsCujghu;a0X+MSw!%kWnE^(p_m+|8jctJKs!K zzV`yW8fl{6Zm;jHXJ-ia>{@U2vQdf60Yit}DBw|m@`51&$VpZeZ98(?JM+xXei!?1 zFJwz})0lQuq3dTRA`ARxxlV&^re7mxDavKsw+>^Ow>&@Is!oO<%b@*RoL?J7^;=jj zvYA&mvi7^b3=*E<%DNA{s?w&LV;sVj`}Hy0+n!73&ODYLdH?ZrBiym5IC*D-G+-N} z_Rd!J2fTFQ2j3Oxz_DW(>*xz9&yCV-an{v0-b~%NIfrcs8EpBs6Ibz}b*SUTt>zo@ zfJ$EK1}J47NEn$H;8Yj1wnhGhHpD#ijRo;P6mqQxzM~;C~_EO zv@1jBvo%m$ta32pm`smys+?Jp3wc1ZQb+4WHe^2FiNS`{j!IiOU!$^(C$~ zdf7bZcgIdjs2&v77bUYwP87C%DtP7LwIC-&q|FNKMHJCfleqAX?a8^+>o;$3(}wM- zscDp^S*dLu!=jsfwfNRDde=d50Tv;KA=I&@qi}@mTUJzLM6R|un zZ@FG>aEwhJD2qL_dkJH|C0r}VPb+lK*A_l0H*lnD7U?=+2H~#tP;X@W<*9`i`=tjx zK@T1&mrxXNtax}fo5hntKi+%hrIoHK@C|!g=SE%wr22(3fu73Q~&# zUC43n$$~}vDjzNA>%ng5(o2M6MjZ?d5k(cUw*~U|lXShzyGUdCSrZZS2AUaDIcOw# zQW<5WCbc$Z@6|lLcSAyyc>?)1Q}^neq|9YOOjjWg^TJ9O`h^){)P0R zPjcQ5GoUuN*R7N3uDx+CEU01<64MFo)EPZ;j5CBq=oB6^Y29r2%rc5yH+@V>k%Wt= zl1K(UEY##`J%5_3J68-&)ZGZ?8-$q~NtU~yZ5QMW3-pOlppT(!i)K~L6WLT!lBlmP z+y`N+T7vOSDr$fGv+s8+#JEyx>%XS_Lw?0Xw2?vfGtV@O^>D=<~Ho3LNcu!PEpRlUySaJt<^lK<^^$Vu22| z>&PYdyRM0Z!MW>~umYXV<3|>~Sgpr^OBhOJYB>aqRzuhN&hw`C=CN+0Y6aLX^LLk7 zRgQ{->b4f~&h17$P~a)=l*}xGO7j_*P9YkeCqiexhO3)3#(kr*?tFXq^nmzVeAR<+ zuECKb(yMNSS*&vSPz|~aH8@^xE#b;hD|DLR*G_m?uVtdv#gc`iUxL?>7Pa^R`hj#6q_#Rc;LR#nzIEf*g2CFo*&A9QlplG)jjQU-f(iNQ zEvOBL?L-!BSaFVdezoS`Rjz4E$FCWCA();7JZ%GY2S+1x$2HsHW~d7s zvwKy$t(=9;EM^e)${o;GpNO=r%pY&sJW4LQ%+6Mv4QkXm&r4n#O|QUdh+ry@g~G((rHL0CQn>1x(DU@1Lkdnpxn3)X6gf@n9b=p)ow?VAh*W`L2`=JlMKmFBT_)Vucohm{p$z_$J4L;$}flDZy5KDClH_uySgNe zL97~5@Uh%_{%3<)m^|_?c)ncYWwgCL>RA|UTK=Q3Zwb6| zPozVK6toVr34-&eUB@#46nxtE0n3b`LR+n!iuF04Rs^Et`CP_$#n+V&ooQEo%}-h_ z>Pr6lWzN;qdI<$yxWMcvcdfK*y|eyZ-CFb_g}8z1`hCMpi_SIgS}C{ouECnxjVQhF zDvES_74BF4S8^zVYX#_&vy*Ag@60KM&3eJpJI~~7Z@NB#HQFV3-G<(vP(Ur{-h2<9 z7lrUFaEL85$bVmjDYC7 zLM3vnt^GBPd2Ak>8!Z~m8p6;I&YR~5oh@duZXsH-jbEBci}&@D6^gf8gwuj&g|FD` z1&p=kUce?@#dRL{z7ZGR&~8(1A3O)~!y6_%#uAo<{TwB*I5dqnmMiJab6-nGP99A| zBOj%9!_dAp;A`C$?#>4#T4imxJ0;wHu7w}D{hZ#tIoQTI@b_LkhxHBN9cSzYc-MKQ zVoAPeDP6yKAuXa*ZVc`PHg~TrVu|`X)|tB5EZ@6#7*8x1yFt`cNGb$#9%OnbN60%e zDHupOiVxG1Q>m+u8-&RdlZ)wF-+m_j@P|H--gEEq)Hg5+{bYkVMhVWv;EP&(VARsd zxS}Im7uRI~br!iE(eAT;aU4Va12y$u8zD&}+7WVo?auFnO_zYu7^aq9tO4ww5g(AvWH%%K#X zo1riiw)T^-Af7Hpi$1%lEjD)6#!-EbV=a%}13mZLcX?=Ohh?h(50~!XUgJ^g_+{K} zTH1@{v$B$&oJn4@I&<88{#SFgPCO1ggG z1{)GbQK}E61%OJ6X}Xqj)fM%{@qKf1(tGMcH5=HZ+yor2@F3T~l2+Mlp&Ia*? z{o@?yh4)j@zKHH6Z}<~-=m!fR!{7^``H-y)Z5hC_Y%0GoOJ-??Iq^>!qObs8vG%YJ zgj28N$T#8Gkln@m9*D*A+W}mb&k1dAUrfj_qtI{dJC>_ET~Jc zaKzs;GQy_lku)(r7v91a8Mi)^=SP0@MA~y~w90#H7oq4*xYGl>+5=2utk3(?;ZyHP zmtJ_Th2XmZ^gT@A3opHtKFALK?k0$fiI9cbF*DYzSA&Uk4GZ*sqI8!TN=zry{^KW5 zpl3ql1l%ZSVYbAMa9x5MdN_|E0(l0K1T155#fwopGb=r z&!leLWh8|C2e3jPyYWXTHXv^E6KrJYP;3+=OIpx4W6q+MJl_?8#)XFhHd#Okp=6~m zAv7TWXg6@y#C_V{zM&3au@Qmoxq|R{?1k~mXT0Zpda+s$AOQZt1zoMt#tgfLoUYGBYa9!7QOT zpJ%KhPD#*lE#ubl`p#q31Gn8jdCKf+e@dg8Sb=o2Imr2{0F_ll7GQ}#oVVgM=6KK> zgzzDtV4?+W*~NKAvAA%`1$43a=v$slZo+CpV;9`P8Pd0^d!nzbZ~Lf_@QSpB-jmKa zR-|slj<)%Do9%P{6nY?S&Wll$5D@1ZuX2{)$x}?Y{&eK{1L^YfznAvo)^m_!SzNfU zEL%*PDW`RF+-|dKt+w9ojqtDxTy*!isB@E9)sHN$v}%dXebAV0n5tm}3(Ip8xb1W! zniQ8d(f85ViZ+y^LPD0y7yB>`5*J$K0!zh@!G%wzE1Ala`6kHb@if=mXPq=B7Dq%B z^N9hoi@{8@V!Q;tT?zqPNiSp9!x*^rE9Y&|h6QY7z4@Kl3x`=-~tD zuDedAC!c&W-Q>)374?e>BynGLwKwpReLQ3sNx)HfkNbL zc@F=#PB*)`!f{lv?bw9z%$91iek852r!G$bGlSV(KVEDy?Jl!={j{B50zQ~CGt+pu znWT=i4+p26(Qe~8!=SQ}KA0DEz_2UPhn5}q8^O6ejD0!5`J;3bigwPLN4Tu3POY~l zXYm$s1(&QGsn+b4w* z3!zZwxH%7NL09VXSPOVQTw3U1Gi@_1xY4r;)_*5MY|_(%A&JX0!8%#^41@e?0_v<&SvKAe8D4bm;!q+nm~Hj9o2FdSz$M;ctY z53vCStN2FaN_z3TUr9gu@%N&LK?&4UMp^IMdg;4+FVF7ALQCI0&V6^=@Pn4SuKkDi z>`i+QA4)eb;gyw1>yuRNXRrdUI% zc&rwqdgd{RR)U|jMf_*g6z_+IJ?9x1vJCSIGxTdwWWn~~?s>&9H=^*rvvyD)~5w+@SK;OF`cExdCu?M)Ek#N2PKUy@RRjZN$14;7ms8Z>zF4H9|TKB3vm*4eld)=Tfs!yRIJ$R>4L2i$jZ_b-X z+Q5nnz6MXlDshRN@g%LKUBy#CDY;x@BdmQ(@R%oEtPA_D#|^!`L)0s>k8UrtN!~ic zK^`ZM;c)Z8GG}~SmtMxoAq=HA`4~$p^rgjY;cxcV(YUIW9d9?Ay6H9K8wh%r==Z^H zebeP2EKq1Xc+`>uJ1_(vz|FNA*Mpz`%qQNTo_+ib`X-LE>OF#2<(_nC?<47@7hg@6 zuZ>0i=CF5Ul<`5=1KjoL!kvu+?kAi^p+5_q8R)k!<=x>K*?iX9V6zH*nLMOwBscZ< zz!&unaDXny+$>_a*F;a(g{*95CeN7xHvV=wpeq8ErUKD+-n*$V_fC$~qkNOLHJZ?B zE$M+p*juj5J+5vXHprL7MhPzUv0ZR&!^UMdmv-yTfc~1st3VfLn-5?;-sl>LjgyYm zEPPuRh9hx~IgJ`%bDep*S#5UCHqBsho@HQq@0tVtA9>#g*_3>cBbA;6wwKcA{yk|K znc01xdNAO@x@|R>^PO;~2X?Io1oC+h(F_ye$o=n0Z*m{=EziN!U{}nI3m2K#xON}H zT?I9f5XG)Au}epAsw!l-aq&Fvz_r@TK_YHhy0e)9i3L(N@&-X+Nf)lSdx{{JI)*?* zM5-V|s>e5x;xdX&iNj6@aj7`C1aV6sb+AjEmFoxI4YH^m1i^)})_T)$+gtA<346Z^ zSdd0opo{l5>I1%+kL86Whg*G0@LTP%yx#8B@v#~PiN1a5Sy0zse=Z%o>p`?Pqm0?T z>FP^gOUKw%*n=-Q6*NI$qkL0a$;bl2Bm;)Rjt>9;KmbWZK~%)Mov2*YDQ8_9f?QDN z-zq}slFZl|0Ba4F@z&}d$ou?OzrXY5`>h9L#VKK5bGLFzFWpkX@ z$<_}o`Xfz|7G)uUSZ)nE!*}sp(CZ+IIbM$JU!QNUkE`yf^+)SXE~eJ(c(KEO3Ox=N zZ!r|&cigejXIj3^^6TZk4~se7fZJcW&z$!pSXtd2uHBvNHtPY$Pu|zyxacvU7Xb)j zgHWD(=DD1Y!;~>#M15ENu?+>x3q1NHqvkUr57y52h>EZl+)S;=e$tK8l6ljd0sutYbd)sZXVo$B(5i z{Ih?W-hA`T^ofsuJiT(}O#04uoi}GYH{q#?NKK;p`{PFa{_g=!i`_r7^c`1G2 z7ylVWXG@R=9=JFCxj*}7usAuJe(N`XlMPeg43+>|O+4|$chZe9jwG>;RB{m^*@025 zDFy?Eg;PWBm)wpPVDLV^y0C~)+Fw1caWSU-r$9S4Vo}F#DzlU7&^3zv!Fh$i@9dc; z5OSVFu-C;|%X^>=b9fa~NbP1f;96lOeXIh#tvt_T6tJ6twbdu`Y4Zq3$EOi0A~QL1 zpdZjKW7>+g%LYT&TlTX->-7a>D_18|n!K!al5Vl} zE;x>b_Hp`>qx!%FeOO|JyH~zuUMG)}%%WozL1FzkH2x;urQqqq@S~0hbFAvGAE5cH z;TLDYUnub#FkgcQ_obV!Q<>ce(PY*guyuQm;a+}u9P4w-pW>Y!F|1EUjC5Co7_REx zcWr!Hy=>KUWjZ>XaToJYXfV{dzhm9N8X~OMhykRNrs0-=FS%XRdKR z?PyPUP2efw-0B}{5=pNE4E+Z)Z`KlsyWYta-FEi5->T%%hZXFQlc3X5qJv9yH*I{+ zmvzmj0%Q?Be;F7a85vAtSaIIG`Vt;29#1Fk`2?Ph^lB)~zWu>5Q29Y?C_F0y{rheT zyUF9co7!2g%M1#q6Kv?a^1bJf{i3vDj6y01ZXCuk_57=^rn^o(9BZ-d$`$J6?DTyP zxJYYVkJpIvi(MZ%?PS)(8F_jJk7e0eQL2mt#i!_p-x4y`ag>PPc1cBp84JoX6vlcg>Ot|{3IV?=a@%WB6{&^ZNjLgXD9R=^oSQJSZcr#V$SXCYGUmv4 z=4~?+q*8!?S5y|CY1XT)5$d9fCxz2rBqw>aXdWY%kn8);NFssva09oE|P zlV^6%^W8cubLD^FlWFL;n;caRF2Jj)(7wsBNRu2PX+>=)|jCibv6 z4q&1!^ri6Rck`5ob!^>m>T^M1LF=N8dHjNwS&-E%f$w>fg7u~@{KScFWH4H6p0Ikg zGz(bT8{`kHYmRA8(8r|J3V(QTAU4dNzxY<_;~1xpeB}Og<;ns|^RsCP?-HJ)K0L5D z4WHbf&Ruvj;B$%1WIeWlzHH)#U4sw1W)Rp%>y~Dr9U9S% zlRT|~bJt%EkaMh^RMyf1q}fWymVw0FV*IV-*%>ElD7I4<%xbouT~Cv5Jd+OI{1IHZ zk79&=5=*VFw4e8V5c3(vJr>5czXbqh;I9e{LRkQnSMS6%EJYy*4Vj~WJjcBOS3zr%ASHfPz*}*^7v($M9v)#3b(lg8FKe=e*9 z#6lsRlQO*08FsJoGtE|l^~*oowX?vT=S$AhyrbVJOdQ(4!esu*ucn?K{i{6mrsH?t zpU$4WnD%m(_;rM(y6Vcx{Xl-yG0$Exw|(+%3D$1FMF8hG&5U0~nFGJngX>QgJD6!k zpK6T-7laaUAsxkPa*{Kz7FpcJ_(i*j9=sPE#I*})2zrGve()L)U|kUqR~Tfh_-TE< z2z&-C)-Y9u&3fl#TwTZ6F~+3NLv36OvTti)D{vr@^C#c3M!fwM~(5zZ{rQAPG*MM0X?0gqr zWQ+4IjP-DED~?wPklC; zM+Nqg(tOKzc_2f1j)(Fm5@vdE=Je@w=FHjji?6(t{@Txc9!2y~go0R0vS!eV#(Cx$ zn9eH&iOjUz$XdZM7h4VWgK=_U!KbsH2qBh}lzi;F_%R2K3nj>DB1xvd3Q+ft9!ih@ z(f^lvhdtvMG}$}A`Q{32*i@}>R0SS<-q_e!I`p9rrVo7Jk@UtJZ=~07-G1-A_ob(v ze428^4bAl8OQ+LEfAquQ9$J^{jaY<&FA$!3p7~Gz^ykvv(ZTeoPkj;r&)3tHt5?#O zzVz=n=lpOwckT_+^@b4WI@T(eFJ4ZE_wNsDsa$2t$UnQGbVUn1ys?P{+ii$Gi@W-t z9Le=}_LdJh;E#m$9hX)0GdE$zyFc~a$4&6Ac6q)+s$?a7H}0h!L+!_rj8po zXVT#VYo9S*#@E!+@w`@EId}?IaZrkd9c95Mz=nqKKBhyv*lpdZyw=as{FFjc_=(^* zww1*ik*PP}DyS$77Zmjj(TBFNw6k1IY#rQWqoOjv3x3t~JMvs|SItmWa%z8qBNg1TXN;)woIk9Q_cF4T+qc-av96mgvy} zN2@k?@h)S*C6ppf%ALo$Z}8xeH2$WZCwg;TBi_#Z(Oo=;d*haVG?eJ-i58W2QT8Gp zAB*zb(gG#cixqjS1ef~P)_n-(DaH`S0j7zx;zVDHTiZc=ArG1j3EJ;BzN6pl_vmkr z%VDgr+z$mzRrbc|*ZE3*4TSBpV{Do@;L!yX1HeSTktAS8+%DdXhjsGtwNa?13MlWD zV51r&t`SA#bDn|dJO}Uqj<0A?s)*i zivFl)WZcfaRnAV|2(^WD#JY&*m~XYV?R1%U^4oe3xW+hs|9$BR6laSV>XhL0_XNmG zuf3Y?=00dO*BuK0ymBlzOs&J=ZCI4``RI>-C_V89Plw`ETBH(nW_m2rl_g)dZW;*7 z&P67vILEo=X07mq**%zUT)UC}V@;+x`ixb+y3O>UB;T54g#zO6_^(vpMNy zLYk!Km^oa9&p_{|XE^#pIz?RX^(-`j^>?GIpR`!e!e7o&zpxx9o>!IZ_M3H=)+`|; z*09R5=TX$^cDxCqUjV;b`93#xDdXT?9@zR13=9PyTrBXL^hZ6YQ^^+PD(&SQ^D3d`BZ4JnxKyfZ@g7t&=#c|Q|B5U{bX;}cU-~sR7Vtf*naMzS z6?Ow|?Q`zyc*lI|fwuNC52Cz?2OU=CPLS6&tuUtYI`Sdk7Vpr?H`i-LIiweVO9n#m zZGQZOk62sqRMjrrw)3eK7U=^6U`wFARZRQRC+V2&*R#s(@?f9ZQ!k%Oj-p-uK*}`iJ_`=`*L(wX1KX!6CF@qy;<}e>N*XTY7qz(*QDt0r;cw zDK^bfs`O-;1I|_0yO+>)l*i#%gLxGA-Zx0ogXcW!+t<$q2KsUV7@Mn(l(hB{>;!^o z^j^kk49xk6nT(BS&J;PCObn*>uOdCLS5z|HymU zAkzz9{&IT$doSRX@@V?p|MZvA;rHHE%VX=e>9G`&kZKh>1Urx_kQ+7n&e)~9cFJ;1F!9g>RA!jFI)(mC;DmNHF1A9_UOM)BY)<7WYC@NJ$YX`d-@I9*TVvr1qB`9 zu5s%}0)7%=#+hd~O1vHLYsuC%E>$~L^*QzIL-EjHY-Vm;L{M@cD<537OEjrxmkKg= zw`;gS2qrtnicJE$I$$0}hBL)sEj3A(kb|{!n2nJk$E-k=6^)N;(q75o^T>kHYX_%j4 z5yM!is0ra+RYsFV$jJO8KNj2IcaNXz-Xre=eKNg^6|RQpmNLM31<1>I8{h4oLSM=? zK15pLMH-ik=0|LkZm~~=on?0SFLtpAvj==p>QWU_7ID>M&ff>i*-F@AUDnO20`Taq z6?x?fNVgXe=sWLS#LB}=D$sHG;JF4_GcKM1h_SI64awQgRw_%6oMppd2>$~^e&z}@im}LJV6SGC)_NrrK+E%` z#9BET-X_Y@hkeGRHtOJ>e?P~OIohYr2dPg{%oxEs=U)ZCrFro&;}m;Ie9>-uPUl=M^Euj1UdB~ug#%~=YY1qSzTF9H z_du+bgdY^-jfwR2C%!~~PJ}?SZvdYbz@8pra^J#L*_AW6>Et}dS(K@BSkLqWPi_!# z*pS1smVic}e4jzVJuwTXIIusxc<$9Seqk(q=wm3;;MEwtwd>>BP#CrxqGVE4W}>qI zP63y<$%=#d5Q3Xf!tJTYGA;qOPBoNO$e} zTpF96O2$ia?w;p|WVltr)pFDx<=EXD!+=Ta3#z-sNWh^)^v+*v@?IvF7hr&m9R!Hv~@;=vb z`@XmOxON{oFOg~PJ&-2cC`I1FGergt)^iUxo!PH=*1+gvpZjQf?$PJ)^20iYy0`T< z;+Bk~3Qy7%IsxXU>)H4UPDU2li>0X>2i|z&V)~8W{@rx$^vmh-LN5iDiatU8A^BEJDQ$)cARG@9h(Xk z;Axf^EBh}`T@Izcs>gLMvlzoRfmtou zXQy-7@!r+7ckQoPc~Uxe?KqpgEt6uicEM9ZvQV8LIy$QAUu}Tg>1VlF3uK6I{GJjvM}w z^Did0Po|!G?@t4lCele3NLLqNXxN2^`E{)X_M|P0f$rVkF0-|gNYx^~t+&B!;O@8! z4*^TFxL5QnbO%e=VQ#88V7U#9vEYHpJG7@iUE@q0r-VS~VlxDJbV!pkPkM4XLmfu>Rf>XKb|0=O3?_ zkM8y~EHf@yFds8D-tE?((uQ5je;xd|mGZUL6B`npoep?8k;2@8nSM`jxkoH!i z*gw5=H4!@OZz_lc{u5VY0uu{=@ba~wb#z1t6Cj_0$Y8|q+Xt96B8Ero&#?l zyA^bAy4Cz+lM_5sS2vdDj7^%lmeR-}#>B<;O2i^Rb&$<>%PbI5(_=$~kT%_r9t}XR z`e>_*t7R4}y?YsXqp-4302_gHp>A@#sAw7LPMlnxSJN5#FIK9iM36vPD?&w2R=le{ z1O>wSbV+&>1he+>`{Xv-VCV6l>6Jq@=nXU|E@-=%_bSg}^$>JrWqJ>bOP2oCua!%r zUpd-UmK}Xr@Imp=WGr(jW0X_<@%~%*UvY%q0ph%RCP7Sts%xUpHt42mC^v|){-=_+ zTv!S63MG{La*g*L1-i~@rzk16e$9}z_4r$jxz&8F|IM-Sbm`KS5LR|07Z^NrR6#u}<{<^CTL#yf&xDFg1y;Ai|C^mD;Ls%$9lMtzVJ`KkUsRmAHrIEG+li2eERiY|MhhJ+BMEd{|^Xq z-1OX&#%_+MZ+!h5C`dW8mpQIm&KU&Sk3RZGekHrQiH5 zzCV`65TfbYG0sA#P3EWYNI|8pyAK~clKV983>5VJTz<0dN1`92MfQL#5 zUgv*QY7F6i|MJC)X#&`gN18x5Z%6k4V6S)`Mh6fy_A%xgDCIXO%Q9T;&WxelRyZmIA>dbW zo~_-8uua}iCCj2NP_d+&#^TDbe|U&C$wB% zVrR5g%o;kV;88J-G&ky*|M1R^iC^utw-}2wnixgwYo;mAW6ym<+*Yu}`g7~U#y1r& zVE3q`Z}iy4`rO_)`F6g>a7GmcMBAzSfm`5eo^wleAKz+1g@p1PFluSr+I5TQ(QldK zaU-ZQp}7g=mnvj+>@y$C&Mvf)Zsvq-Xl?YV{uFj;TvL;tDl ziaA3~262VEfI^~cVIrM>?TK{!o=QtFG0Xrib45J~p!)!*FS(0{!aMt0=DXoO45zZk(05c!bIvYu~Z)vCJPNh0fEzv;C_D`2## zxh&Es`&gkXA^j|JW-Z_?SFcH3)U_B&+4{&MDw^xrgZv-|*R#qa$lr2;Igw{Kl|<8W ztxF{4o;F&zMwMQvkHHq@P(7QRka<~d;#oMWV1>S?m3)xT03ML3$xDfMB^eHx_bRFj zY@1&h%65HxOF2%LNT;|sW?Ju3Emn=h6u}YUcj0hiY+K?7g zQ|cEU0V1Y-LKft!QC!!azO)1%vVbf7Ys}{^c?|lrhuu~;F^YKd*{<~Pdyl4%eDwck z@6Ds^Os>Pe>eu^*eHmaD0E5{$Go-{#)JAR8vE(DicC65{qhmX!ZOO@T{&8}WoRfc( zlRef+;>33B*p?SrQY=d(6;hN$krEe?6geDn_7xZagMI6Ld)@i{ZhiIM_g=r(XkZ4z zA&CNBe_O4$Zr!?d@2y+M(l?$OORuwIeRl3rcs9_hQ3FN!N7j`S)p<{U%Pl|(#bLCP#hrWcubiuyCxcS;wUt=yk zn11SK-j{y;S3V0_yBD0)Xl|X|_ZZ9YPyL*9U>Fa*8@TtwT#{$jD1(d-3?ZAr!=hME z3u)i}gXu?pRH`K>j0LC{TgsS2#;aVvG$RvHRli;l50&WnP89eCj3q`STe7}a4XX}-j+ z@>3_$7|1=ej#X(e%3USIIAg%DSX#kVoRFzMcNB#pm#Hr=ywIbB8&b+(Ch zcmvBL;SS7)>DN7LXR#8W4Fyl&uYdUVW(8?P=~;23)V=<`URK1Bbm4Y=0GEC1tLzM1 zM6uzHz-n%<$Jdqn(Onn_oSltDcNjq^2!sZ$>$;shnkYz+W$+G5MSiQdsc+BUIs<(> zN~nQvQ}+GZCr-$=twJZH61r-a+NwDBDzyAA{0bgz%KXlY?|2AEqjgb)q$IFH0bGnR z351Bp*i(oXo=(6e$9n9z*$OFpK&_iJ^oY{;m7{o^ML;ZXKK9-K( zznCt3<4ft-#yNz1DA-r`LCNwwGfG8wuU<;K*yTM+fAr%C`;~X2_gi&qzj?+y^+=;K zr!j<~)eyTEub#pc)dBbb%xhgW*2DTzIy5y%A7RwRKY6eGD>R&b!@GdG5Cy;U7;4>n zfJGZdTnZ@_7RXo9NqN!k)qJYT*XI?Btv`3%GePDg)}h>+f)F2^B)jS!A8UWudDdhM zIcm0oPc6l_&8<+;b|W}VV5~@oRx&N?hM(~TE-LhJT)IPAqZRSA^eC?bCSLpDsri)< zG{Px~;Q0G?o|ojk3~!_j!b~w!>^cX>gt6ec0Y*l-D1CoX~ z{2^tvOE&NuTqd(Z1_fJ3*;RVqDlk=<6m+VJmG8|quSYd(DrGiN(meFgk@R=}v;QRh zxBvYwrOTHtq@Uyr^PQYM{>3kSDgDR?eUATCus$WWX-+ebb(s!k2 zpM8!tH`t+mCVl>MpG*5tpkFwDA?-kTWnD`M{DBvZHwtAz^7>Mw1%G+|c*t);F=#&3 zM4j`@`FbC4qdg%!Ers2=wjtnpiS-mx4(Rn#dj0G-5X_&XpE(0BuE+y+Qz+iH&z3G60x`}dNksa+D8}4dzr*jtCJI3l`?q>2H z8XZSz$__qu9#8BW!D~x1O|!Gw9sF?4kyY?3+!Z190v_%RjzNXh?zn0qGdX*WHeZAn zN4Aiu?Q$C1O`cS@f#7}Eom%b+bYdZGo#`n3wjPQL3=b~PqJRKy7)Qj;YsTHp1hZF( zJ~E9gr-9)F!_6`ZJ-V5^>TyGSMn|g9_vp|D#}&nHcn5s6DUa)Vn(f?69t>8yU&t_m z;>7NJj013uJ~(P!?0-@@21;Tx+$ysYueyfUJ{0In*VsUkc4sdDGO@Q9^jKi9+pb-i zPX~6h3mxT=%Bk&!Jo+$xWcS`xyf++Sjq&v_zK}4VVT>NckadY&rO4}Oyf|oeFI`?v zci%O^E?;)8^4zEt=woB-^b8<)6hb`iC6uC_^0uPbTp6U-Uz0Vp*e-o2bmf7R%zEyeE7%HXFvKS zWZayY%zUBoSOnWaSVtKbfoG4vl$NbC-$GG>PTTL{iCCjSWEFaQyv*??Uwz`4^rbI9 z$=Gaf#8PSLI#(HnL3UDQpS-7rSZ-4498jpRf(S%@Exl;RFPbB$qAF>~7VLlX_o9l}lEZQIQjr22kub>qeNl*`!o>{R?y8|A? zBM(gBkj-e`K=~D)mq#vdOjq%EvGdy^s>$B|gKb6eDSR!{b+_|3D^SveyKM@{bBR^V zu*fj6qV$t|5N(fp=jM=6+c@rHe)L^;L(MCP*y(Ot`$s8JTi4bO^XMw+6Fh#jv1CG- z2Fqov@_Wi?4!R0A}G8mS;l+*0^^(8Ap#_Wql$4 zk~1U^=ISOtGYh3W27?>8Ghasc<498;umMoC!#sQWe7g4KE9uzLSe~E;)dNWl+Rm$ZsoJTq3ouL-ux8C|Pw4 zt*%)4QNo)8vAcof2kTNYtYY5!C1+G`i)S80aA5YzxCVn>pKtfOMvK^p;3*wCemp(P z02l*o;*c#;f&TjQ&!q{hUc3*u_h^het2|43#6iS8swq-uhG3Q5<2yOeAQa)-Y*au~ zOB+$f+PU%&xWFtdTo|MZGbP9y#0%Gfe2*v)H==DZ->BxA$>vSW=JLY%G`hf!tR2&QaDHr8bP!%;{|IipR<5M$LwmtDjkMfZMjYm(N#>hTex83G zXLN&aJN7aUQGo7+^ZZddTz*WYt+<)%>z6Xe_@@5cao_6bJkPk8x2+VL>0@g#Yc89E zd3kQV##&YDH%Iz5e)VSL&Zk*i3_tme=hFM$ z`7ZdWjN?t$V$7q)Rb=Iw%z@($X`j5$yCe|w#j~a5F_B9lj(JtQt^z@kpiak3(MoET zK`%GbnbW7!@#DwRV~;C&Z(>0=*#IsL&Od^XKoy_OE$bvV8I-QSbG z^u;frIOPmaigss)yX&v>eAl5v>HEI_1MGhIc$%Kxk^bsm`T2CueTUOO{D=R5I9Job z@q_8%M;=PQ`+L7jofHr?(>{C;{>{JjH`DaQWcqD(w*TIzKND5@{onsIall{NvU}%5 zct29{Y2~ARAb43D`z}Mu`M1EsrU{SupRWPuoJaiSIp9VTVXOdffOW`vwUgR7cS1J= zz+=u^ygc&?3iM~$xx*S=Zv?E{%DDC_EDfUA1g&G(n zaLC)hLK??NeGoift$AfrnIkW)i%(tZ3P*zm;_L9-*Vw5zbDlHKu}~jyM?Zqr2HyOp z4jn|k!|ro-GX=z=f5^-6!7Eh}an^1{J9H<%cpc&Jyz~TtG6LYxF+iW})BZsv1dx&T z1bl!mZl8w7@c_iGYi&qxX%CQ6RSr{@zUHhf!e6LrLNzQqlooDwfa?Rn%#6o1U?@ZSC6pfn>?&13r&7Pr2U|V_u8rcUWO!J&(#z@m z*{`P~$KRR8C*RGkJnB!GZ$+@bP^rbgx1zi|Wo!=uK_i`;IYQ#l(WB|o*;BQI%mNJh zCP!IZKhJt`*IwvUTbW#o*l{Zzz46$D)>Se=eOBF7{Zu#YO3AEihq* z0*?Gt1dfhPQh(M{xK3}V__o}tY*P)QFjUFxu?i{~vm()BF&ukHbrzlH@;DqI{g9j6 z%&#JxtsVd5DTFfpCk69>c?B;VITZNuzPgR8vJ-BkRqi++#-L0ipFARS9e_ynj9eZ0 zxC-uj}y=oa@CC zX}C3rT7U-{(&b|e%(s#!_>mYLxNe&&z9l{zr3ymWMo`mu6ZNoBwvC_7G^m3z8`B3Y zed)9BZFYPS_p&_1#AP=+ha^!w3>R3OdY1hai<=u{@A;IZj|dB)qL#tYk(h@vxHq|s58`TOUG)m)xjUB|Kj&O>&FcNpPDwv? zm6gB6Fla}s?z;16!EsZ}TYr(y%D~z;;Hc1VEgib=?tJDZ_qvKT3^Sm{Q7~LT^;#Nw zNVi%Q%t|FIqULVo2`I$*mtKrC_DQI>nG|q5!8tHTW1%DgYxQAQ^=nu zS1+eQELF8Z+ir;FZa4B9jRy#$E6K;cQ-F`nZ(97uSJK9dU&WW>YC1Z@52D)KIL%_X zDzNHIJ2x<^~&^w%D@CP=#%Ec>oka6ffIM}k;R?3T-ARV zTszFp&bzTrK96#0eFI#_!dQ#Qoy}`$-}-Et0v(w<(h_M7-Up+EyA_3Lh1uz@YQa(8 z7seuRwLFWzrIYLTk-)migjRHn$Lt13<$fnk_DnbfQDQ<=_|oDM;>+#-^G2BT8`Vxc z>KDXWsQ_SNPsK)B1{O;)nszJzRa-TRZK;JSGO5FqQ1%`mWdiWGtV^A;f+&NmtD#%Nat|{uF%RLe(%7L zX@c{^NAVJ3x~)P?;iQoSNr!CLTN#{ZmgbvjCySD0j(&OVU;jN8QUmEh$k|b#{$P4B zA-@WqB!)AU(=b-S;}pA#M&Bj_+IG0eav?}(K(?=@)oZV%;pzQ+ux~Pb7PbupZMz0$ z(jm@aT})Sy+mU8X6I~bo>uEQ;5k_%8I!cl?GTwb~H0?jgeAUNLE90jX=$uO|%MkNR z*S9j~)ZHO>biEJT5dLi-=+^b>x2p^H0MIu6IIq@&{cNws4qafo!a!O8W{of&gfE2W z)q>rb$DiX+eld33Re*NvxzOyK$#W@wE4)~}-0y~a+pbaS4qVMC+L!h31tVbrh_?(C zs3T5A#ar=PydiIjkfy-AJWCi`_pOxQem4aU-S8@SUEo{VZwtLwX!r5o`V_7pN=sDB# zlXmhxgqud~s%)O0NN-+L+$8R@IC=6^`ZxdhU#7E{X4$DYm;U)b`(=bSq%TeGmSHGovN#?go&+*gv#TEH+ex$~zB0u7X4 zjdV4gIQbO}-mhXvJ%EP*4BTY=s$iekhn|n>t{Zoy4q-e}cBiTkUt3s5k%rJ4SIy|n z)7jJWDER1C1o=A;Po}->YHe^#iLIFn#M!{L5ohoB=1c8)6aZu58x8oUtlS4xz}%V=m)Y;8@gedzpq( zgZY0Mm-Wji92L^+MS(svfHCj1yU8;jxg&!f=GRFv&~Ta2eWkEUToJ7Fm~i zKl5n|@HyP9qVi8=Poq2N58CN@vq;ZLd^5qmDgpX|;ebl>1_G8r1SamTQ5n8EH!0HO(g=C$&LD`hm4(R&-5I&=+`k9kV+ z1V0$xsP|x{{BA%$u@7fn)uRK-^l~Iw#AMVU3!wJ#B=6?d)&}v)PUdb8v!jE^XyrTI z4Gdg{dEN*b?byS}C1eEoUI9r1-ZXZgQz!K*rZtrO<6hDcx-U5_)AF78;Q`Lcq0H@$ zIo8Sfs9||F@}k3I*Siyk`LyO#Xg%Mfd+MWBEIC&oyyvju&GkfCcicq z5HTf`sBxtpHY6J3Tv#h37Q)fejubb12;3(Yc{0n|1g;`(zAx!ZP3=+v8pTyFW8K2b z%&UMW@(+9q?+#Q^-hX70H2@wN*4e4Gv4Xae#x>PTA*7n0yM`>f$#EdpLQk{l{06~q(MA=O;7E{9s4-ED1DF7$p{-!U0)f{ zI?&hNfeYSLbGFsjQ;&Fk_3G8^!W}q7RN&%x8^uG=@dpoq&l~AazWRjKAy|iEAO^HV zHWH1XxDPr4K4~azedJq)hwzW z(L-sCa|)VRJFhb+41!~fv!Bns_|0_qIA^5C>)e)z5P#UU&cr@}F#qMJp1_qklbIIN z4D)pwv&ff^-a%i_B_f38~L7E{Z4bK4$?w7%xg9L+t8!)0C zFv>BZ$S@P6B|(dGx* zxN$e+5X?mo^z!j-aCM@H9px)m)B4pDdE_i%Nfnc7uHYy*e&6U~`rsjiVxZb0E3WGZ z35QoXv*Y}!G<@~h=q~$t2v_fuoPVy8VGW~^;-aqJRPjU1E;ubr@?>0(CBC-b7q|so zH=5NJzpGAhf@9Xp8AQhUJ{G-IzXg-fVj#)jEe!Rx-0osC&Pm5v;6e|Up=B$;su=BL zxC4|5T(`SEck=)Cgh0>+a7Q$e*5-L!g2oHyl=Aa2h#we7#8{NP1x=Q89b{L;AoOSj z+H=6g6qUUX_3Qm3SJN^=rusZHhSB9TQ|k^aMKxr)Q80g(cHgQHbdot`fHS3&HCmeh z06+jqL_t&(IZYuXn_x15o#5CEUch+E0vPP0;GbYCJz@lKv_ibEo=kSLd|WG|H*_N} z0^dU4tSp>O!waXWwA^6krObK=x5N8~=hF`y9!~dTY&(k}b!MIkmWBN+?t#ZHf0H~` z(h`d>4TAP^go>V^2DUKNDplT!{?@;FZ;*DzqFz326RvDcIOPBbSoGKV-pKU3;E!#O z0HP^NX|E>ie`G%P6_Aaw#S7Fe2vU4j%#`oL;$FP>eZ{aEA1VXNi@}6VeUe{)C;qkV z!cM+(%5&Oiq!_pr7KUr<3RL}IBCgkYFypnrT2rcYyst7V=UJ=G%v?+7 z&Ynwu^CN#NJ@@SM>1&_;gLL}!*VDV$g{^_9XPyU-%KYdq(+0l*fF7(We?0aiP`twP ztpJ&M_sp$n7;3O-=AK2`4tp(%Lsok z@Ifj0(n~L~^L#e=bk8=|{N)N~Z9ekIBk7r^pT>Rrzh%q~$1b2{c7*-YfBH|;z4zRm zPM}mb{pUXSxlnvLHWg?pAU%8bZ2FDg_>FYmkt6A=fATfj#|l4)sOJ*0vk{}I*xgKg zg;~0R48eAce~}&F@{4~}yM#+9`k3?loS*Zx{?||9aO{i`zbRJ_aHeVDc0Iv&`#r+E zA$H2lF0lLj3~pmNcY0g}awU@~;E}(RmvWc%62}&}14re#WJ34tD_ZmUZfH84Jhz-q zK6f33G`qv;`_Y|a>BvD8$1B%3M|qUNjTmAtAkkkgj8-B&0lgD2B4ungtQB0K6gDA#rm zjj{_Kt{|A@n+gjR3hs)_ zA&)ytQ*p9JAL&wF1?C3F91XMeYkT0BtjG^2|FY!C!>qi&x-(5A9(?1^5+}y@fxtZHQfR zD$q6hxPEmh?K;#yH*4AiCUcCt3GhXp$}`YcRfL1*YZ$e76xQ5&&3j5Ep8IA@&au>wz{kvN7hBN&A> z@e(4%9S)C~+*Uz*^H?R()*|uuQ*mWp;+3msIa`if02#PUZQ#E(3J`I}J7qO-{r34`>FLD(9UrFs{6#yg&zN8=;$QRdtBCUbNcSdqV1W2|!?xxB9Z;~W=j>lVoZ zPRjG?-z*Ivo&VID6UXYfo^f4B>6PML$$@+U@(|h+asb;HF`&8JyLqa?(HYq&fceo~ z7LlQRi!HGn(p2rs^M)DljbB5))Yi51J@N+zTa?rDF<>BM^$KnKn)JI@4VDCU**Pyy z8o{Il4Fsi^`N1OnkmHCKu63o=zSmf+fw$O#FCqJu)<$3EEW#Ck)GI&Rx_WS0jPxY3 zU&27qt1uvLfVb-Vl9so8XTHG*OeJx6PT-w}9CRb~q7BFh#f`uh2W<>fj>W;++qySt zhkW=3`YmDXamPA8SXo&NgUX8w*Kth1_*guZ_Uzo3CTDkWX80tVBMzhsSFWcOHcm_+ zxKm&2T0uht&oJM=?_fHK=iDjIUSC|Cr4GzPDAF4k^XYZDWnd>5!mxw-(C?$v>Cm3t z=`u?6@hLn4;hjojx!Jkva!Tpy^(*Pm|M`cZN$*Twf8u#~vtbN3hcP0XiZ~iNuEQ&i zc;qc%nfeLBA&%G4ScU9?5Xa*>Ug+Z?;@VAX%Hi2Wvb4N_VHrulcaMG8!?9N57&fn< z16xC|_x`{3zVy%s9|+h*0k`4L(9YLBzh$;|ToF73Vsyn`r&HfZXd(VBW)g}ekSPl= z#B7n6OGN|<5i5$~?qalls)q{iTd#7ytw+$JD~RYZaJ*Eos3xe`2@U*WK$CG?OPsE3 zdOb3v;0ScXF` zKQg_AKf-R1tz7137-KN94=f!%a#xyv={fHCLS0;6DG)yY@>A)NwI8LTctwDqbOh=) z4uzjuTTG)H^K>)JB#QV|7Dq!J#twD(>2)n*zSp;Hy<-SZ z!2pZn(-2r`-hL{3Wc@Tu^qD-|tBfE|2%ebFIkOD0*tW8_Eg^(QI2MuIE63h7svNx&A9Y$4(&TjBGehh{N_9IZ@b;Sn^*9-f=UR;PQ3V1I(O!D`q*!M zEd7Un`NL@xA=A}``Sgt!UQUlc`Y`hkGY;<*Hf?D21OacsT45T5&G|3D?;=fsVWG

      QF}Od`)4-_{xktPC!Ac zylUs-B0LwSYvj6ERP4WUGvi&E`${tfa|tSj-ATJl=lUTFWOE;@q@@*mv6fa?Eq^^f zdu1KOx?C@=A@qhwg?n}?5(;%(!NhyV zF5XR->$dz1bOiJY%*ofVAU}__q3u>?R|Mekksk%W&ewXgT>#)Q*K>{j0Q%P5dxIXr zY@dn_x@Gq-yoHf>G19b7mZ>buvc%;q+!wED7w<}tN7IZ2_bh9MIoI5L)3y6jpnUNs zgai5Q9JoS`i&5M|6j~q(hWvsgv*4Awo31-(An~C?T*U{6P2d*y4YW;)TZ}M z`o<)4tUWwNaRK-%*PQFZt3-c)y1`m+i1W^Ek4IiQ=FHEwam$jtQaa<^2xp=jZv*ld z@j+M%H;;~JWc}sQIj@~Onf~K{{EsNY?~L`_V&iD%hAr~#zGpn!O>?NXV=Oc z#J;bF*-I(bbyw1stBGv9e=Z8UU^0#bNm^HSw~b^?JJI%kbLMIqM1a1Dvsjv0Y_`s@ z01XXW%U9DvjS_l|9-YId@jU0{O~S;HndAbets6~iH-L*_2@&Fzolt#~7&nklodA$M z9tIGe<0fH-RYfCiwEp1BZ={AX5cb+kI{mc^Y4Gy3bZGyc)Xdp2x)@NyYbk)xEK2ia zu=IAVJK-tftqc-w2a$g&63kK;tv=Kq3YQ{PDpQwWcXt90VU)W*Bdp&`KYGn&mQ-t8 z1K}OiyY;5ODc-uvwv#F#-;~L>#tUmdaN@=E(*OO7Y4e`L=|_Lz7t@|6p5Q!9 z`joNesdx zflPdkR8ep9bU5W$)Z2*hkaIKbJK@$4$P8><{^d#9MavF^ZyPzcMYY-5O-Dzk9zhVN{@cx zQ|ZE+r_-DN;{Uj(0`$C|$Qz)b^5TqiyLJ^QW!+IB*y3|pCzS6cooSYRtLRb5yX0Bo zi+&jesRcJBKjW=8aH>?mdqIXXgCYxm)|>j)@k(269c%5cxovBIzo%cAyqmE)>x7w& z6N3 z%QF6An#G&cv#A-2c?2cERc}&bBc4Aun?{E@e;129>y$&@V>(y(rvP2XK@-Bvva%~N z%T>BC#%8A#0cCq<3s#d|X%jA>cW|cV&b?bx?~dNoxdl;d$2=a3CJ>%fm{{Jo_^&<+VgQNyQj56u7VAznw{}L1mdMc zgH^A1bZqb5^q*cFOwT;|cN1WUJ(O!*ZUYX8yJ$C_nL0YttH1Rlk+ElZ_p^3xC!a1oi!m>rw{BQ>3qbsWXt=M zoQn`&5gcsbg$%zY)~#Q8^|kbu|H22BMLL1&{(h`D6lP@p$!+$Nbki*Do#DLEv$)gV zwKKb{7x#AW+z^%_1MpE0(}!}7$6Htp?K<2uH|K{8%V?_~$&~nxQL3A^(m~CedehdA zd^r933ooXh`QpDzf8~Gt&>bHWu&klggX3bYa2~wej*znj4{u>{i#IS?uGT)|RF%>; z5L{izcN(WpPn@}w_CN3t{l++pGUjpLKAs-jw>Nd$u81GWZvCUxH5Oy9oj;$Rz`Alu zg$3XPCn#O#+hr7Bw&M137TV^{Q+gpTdKb5AH!lWPC?`=r&zSAQ0{aYB-SReen-PT(k z-W|uEj4>EH7#|bx_6DxsNSCe*gkX1IXcYJEDc?Mmwr$y(j@)-&>h9=fzoz?f1m0Y=TH4sNfwRpI#@XigKX^Y()3$UC zTqZ&q#N&hKo5y**FlIfQJ(P}^th98pO*SQ(M8AmlO9BqYnuXCD1|zrd zCYwcY!s5IdxX&8YZd@56lH=MjWE@5ih~%(oWWDOWf1cYbezu}~p zPhV6K7H`X3wk#vRmax1o&V{Rmdb#C$J(u#%{&QU-4mEX(ryc3j|IJUN4Nu)4=fI1H zuJKi!MpjB_R5+*VprE3e?* z^3sSvWb3Wc#}uZ=O?`M9Dj8LsF+Z+C6e(*o$?;kKA`|lI>U&^W_R>{@^Q;!=kPdRR zcFJ`8l516joxUk)%GGx_)7#u$zZr~MkDuQyHlq5L>mrgFcWG{k3{0{ZoYR(qUZzy0 zECCB&6w`F$J@0XzcvK!89_6ZW7ww~%($6Kut*`a6a!l7b))sJulCBC{B}6N#@6wm( zKQ696eD=>HSqf}Tr+`=iwq8FKo`*!swJU;OWjG46Ll8{7uo$Ocl_{jhDm_GP3i!xR zp{s_qA!H}tMJw~%slmsUlzU7|tBMA!<8mEHM_C~hCJ*z8w$dL8d!;ii5KP-J%QreI z%3diz4}9^PYXlovRt5IL-?K&xNAe1E8!?Q+G@w8us|pVR{QU>~a-kX`57Q&oUog{61&UVc{tUA&++B{pqESfb11e@giA~rD{2pKzQyh1IJ2oWyUoiHsHI?)D1a7af^jUq&BLhB!9 z!W>qfYTGOi(Q9-T(DoJ#u`|_x7Vl#Oa0vp=_YOL50(YOAHttCO?%)1)+S0i@ZJg^! zy(2B@*~7Jv&bN^ zyraP8aCZ1gPC~^`|IR;8JD&KlJIdnjBA0%@ed@evxmC~HK99F6#`WXRr&s>3UrfDw z4y8Zw*Zx{M_@4L1hP}{-Xr(i%-3V@m2A-Q7#(5_Km@YJ;xAb)K*Bxh@H{u~;-bDk= zoqP4RFdy1~;iF_jq>s6}0Jxpqmp6rUe!R4Q$4>LWgk01hUv>aH3#E7XI*s z7v){9+=}PLj~N#W^cP>7`Lc(_(%!jQ1p+bd0j1+}3$FaMl-SU_IT$Zmo@WNxJ1|`Z zbl=vmB-b$oGQfgN1dh;T#(qpl5Dw2=)MJ6(Y`S2;ZQ}SBrv*0-hCD*!_MM-53IXXR zFs|ra1@5W@C_C#47Fbx#Fvp{~6c&gjQnjIS12&FJ%a8r&kEiE<_5V$0Ui@-;^RvH_ z_J7x>?nzC>9cfFc|DAgk1m|{KXu~cto(B--U3OCrj2%x)qP!72?nI?wW51~P=qD~3o zgX`ZJ1QUkXQ1d);4L91Hfo@H8SFVRCw=pF|Jj%FwSy$mHZR_)REk+n=$2cdfg{_D( z_n?C;kqVBM^tZYy{BMapAIIJFswqx;ViT70p@;}9w+X0UZeG^Q6>tZ{!8nwJ; zB*$*ZCwVsj6YJ1n+{@u^t)-c>V-d8JaoWV*O~zeIJHlP^>%$tW2~PrTSQXh0_b@XE z#ubjwHR4V-`j|HH-hJ;pl7u#aZ!_q4n>&)qS>m*8EwswC7A@KdX z_aaG}fO)=%J&WZn-Uu5JR>DO*y;%OdIS#V*IeR`U z7;^>b1p#4p6sz0Tt~7vU?4d_)uA6b5fBj1O_y74+`g@=G&ETr6gmGE%XAI5^Nz-YQ z|M*kO-Q!JsP8~1m`6v{ zl2)1Bd;td6u@c#N|0Wpo!3N8vQr1U4@nAaf`uVi);4Z){kTRe`fR5z~Sdrfpe2SFD zv0ysHr4$2o1N|d6=SSZ2Wctk4n$w^8k$;)~#{c@U^q#li(!KO?6uHWec=_DEhp0lP zb2)y2DG4MX;3gOvZP3m3jnT1m2?6AxHiQreyIaAp2^3&-srefC_`uPlslyJJMv8k8 zYI#=hsXo|UbZKMy%IUM|r;i>>1B`9y#~A(hIs*9z_VlF}1O(q5ElE}T0P!d+ok zx7aJOrr}#;deoA(pj6V1C&#NJ*H9FgMiF5mT^hQ|F=iv_%D|O$`TCVKN}F}Neqhgm zw0Hl$^vbKRq^YwP!ePZGtj#@F^%@FYL!(1n8&XemU(g_#sS3ZfOjCe9%|2b>w^r$4 zncm-@UO#mz1m*{i9OmqET*yzLOaNQ}1N0UlE%6(maULzu!EOCHFzkv%zSTXocXO0g6!}ugb1{$m44KX?Y7OEQQqqarKm~f zx#2OCrSinN*gv<**KZ0wCMUIqYbX6w>e<*ui!>ByP8X*yq+JhfP2cr{A7tJcM@b5W za+G_-qdd>7QQ>>=dX_n}1-{F`0?J+Q+LMOAemzayU?5SqDcY!09fj9g;VE~OPbyp- zot{&l1twA;XS@vC(s#G2o=o=<#_+gD;lYbejf^#wYRIC{?tp2`g_##A3P{p??=;c4 z=l!e;D^|SkDRAbs;WYf_)wBgVF-!fZrImZzLR7EH-7&v1=%&2{t5Mok-mQ|Pe0s}Q z%hG_!N%)N~yp)dp(8pPbGBxvF3fpt!UAHZxsT(h_#Il{md%*k{^Bpv^8F&Av>fAPu z)gqXx4vWHd&YOR+kFVl_K#O@dccXKg_3qCDez37Tu5+owon4p1d##*uEGexqN{#YeUIS8pVCD!B+Mzte zo$?12GKbos3rA3-aRX8dQ#Vdka3=3qtMNU?BPH?7Eg3hYu5I^4DrvQ>8|Q_q*RQ29 zjsclK=r+%M-U6?;356VkS*iFX-@cp^t{|~4P&Zz+vhg-TSPs{)VWr1mji#1lDx`N^ zY5<}A=gQbLMToxCS{q^?M}y+tTMb+djs+DzV}a`tpzu2;P(Ga*ue@j&Ct~KG02Rnw z<`~}!uh?Uics$oV7e!q9!?l_KQkmE^(rX8XmcR|nQwHTL7TEg#v-ckGdL7qc=e*tv zfQJqcjQ|L+NFpf~iK0anOP1s!E3Ru>$tKy@*)*^7TWOtmZExb(o4WQUPVw5xCfRsx zC60@1C$_b5tU^f?DN5`FiQe0L53l$A|Igg}efK@Qhr%Mk5(aqRZFA?&oH=vm%xMEm zQRP!E%5n1P6|b_~`$jS;+d1z#hIif9Ttl|-Hixe3DcFza zQy-;8gq&ANPm`F;fFHUIVJ6Mc7+IO8eLBrWD81=tmG==^o;FquKBSd~-FM&jc^1)K z^xe?-NNNWc2H;DD^BJND&Co%XFN{iq%u>Fwpn)s-#xN$fKel#nhu`W5T3O=5EaUbZ zyyO#4J(=Ec?>*_3^|!>V>{zwgw?FXn>B%pBD0DsQp*3)o~VVs>#MQvQTTJ z_c~kH`v}X#>R_wp^*lOg>CLNL_pf2UuZwdqu@kA6#b{RxOedY!C^CxxV6X~uL%v1W z2g4Eo$wrXWdkuuJbDXY}oWxd4G}lRS6apiWSi5E|9odzB`?vmUTHo5A?jfYqzMUJ= zs*cs{wKRigKx-bj0VWsLmP{S|#+3k5semwDngZ^W)rzv1X)TaQ%a1boPT4np(!X+Y zHvH5pO=X$Y_hmG#qHS|v$na%il5;uLu9V!r$W*I&?If3HP0L%$!vSbIa0#2WW@+p-581(Hqpu3#juMh z1p<1zEHF`tFVYnSWKR9dbmyXal?^tZ6J;g_*Vkw6e~wi_EXX31*~ORB+@+UOQ}3?D z-@1;gAl_7CIUKl-Vs7}XXTI{e^uoXWhX^p&rw{(K*q)ZS?BD$Eem^5agmE$b_&OuMk z;n6dSkVX7zz_Y+`k0MJ06AeKBx`+D>j~L5U&>_uucXaj;_OB12i)q^MpD+YB(>Epr zq}{ScLF+{hnL4n<@jrn8ZfJNgU0@-`%!LPGTiSs4xeEl>Q005Rb~AmgAV3Gwd5+=b z_zr93ygY`$^}T=o&!vC$V_#0EKl=x1>)XBs0qXKwx?EdJ3VuVxVWM$uJI_yM;lU05 zMGE}#yyQ=c+cIPDA>|xh*4^vsxw$iLG7r_tD#|FX<*Q<@vnqVog-p~bvdPt44MXLb zEFXS|w>=L8k7E=PKYqi#!r;>DH@{BKY;_5x*lUb%%WbXQgyzJHP3e1;7dLY?l`mHB zUFZ1>i&xl=z=u&n{chgTmA>?)i|PDHlz8j#n3GrKxjiG@(GYM3p`vwbhF?|XHFQ3E zCAYHmQ+uI6*I2ep%2xF-o)|B?n!KJOYLJa<=lw=_H2HIRaaefvXHKabCHgk*pExu| z$axn1C>LPeGdw7E>AIj+K5ZdetgCAGswcM9YAvo(+>)0r!?O!Nb^(jArjotAt3BQJ z_B&Gd_T6a#WkpsGTCiW^H(-bWmJsPvjhC>#$H1ZNKnja-PNo>MY%%0W^`l1a3UA4x zjPP^>7Uox|Ab)Bq=|o&C`FZT|-`zGLY)nxl^Ajc;7+a74+)DT+;7^0YM zGUTWmT{A*wI~zOFXAV4%@S?5=e&MOp=?C7|3#{yEdEnxUmg$Ap3g#dpdY?=oFrEdr zXU9gj#Dw?Kg*t)I)f4?cKk;0{s{M_Pf(B{Ow%U_5Lb=tET6lJ)7=XyFYcH z(94o6fhDZ$H_z+!_G%s%jv3Y+=O%~Ku6>K!%H#Cn)2Guz_um6eP?q8wS4m3n_&aj! zRN8yTh62y(@4fR~d(*%9$IqsR_TGw;7GWuCT|s5tszSYGzv2KTe7a-7{h7N^;I%;C zzV%ISOsm#(rGNVikEfSDa6WzShwfVT^;diIdHVh@e%Cv|OV)S@0Tp0Eh%#6$oO)@f z5ST!t^yQicFAttLn$}>Ta%^e{($BuhL@!ikaFq4Jb_6snTGPZh7f$v5vB<@Vk;8ju z2Zz%tWDv)vSU1uqdizK(UcyUw?`^wN147kSCAUf~sgxqdAT&QI^e?%|qY$|n zCxvrt-Jm>T%R}rBF1@vS_3m6$Qq&v)=U2|0Nw+F}Ww?ALvXx)Lpr?bF&Zxp< z18s~6jbSk?qweKi!0OYW(5Z{?=%w;pezw_p5V#3e<-3l}{7+P0itH$0!QElxY@?I| z5ui}^xSt+RtTt|>KzGG3S0>xE_1ysvhran2;7v|^`UxVdGWMuLR``}B zMAp~!$DwcE2PrPTv;-Av-!CbM)aCU|bBu{Twrx0b{B)Wdf@kOzfc^pYK8$O&Zo*jR zR9r9j)3FOrVzZZEA_(Jhp8gcAZJ`ygJ<86EqM+OcylqD0@D z$8pXXv{Gk>NfhXAPoyELbEpPn)bo{yS=^~NuDnstdJShKy)GJ6f1`qH znXXuOcnNsNDLitOP0cXpML7TZTfs6&o3ajo6RIm7_$LhuAZO;S@>cy+C9{xq{)lkn zoVyi(m}Ht_PFbAjKXA|aI1I1~Y9!0zm}v=*bnuV4Pi3o6wl0QkH;Rk%ook&|_)jAW zmj-E}q%|KJVnJ-(!%-GKUxNp|)XOl!z&Gr7Fl97(CXt@_8}>OW+~DF|ROza=M8e9ouu$ zU*dqcGQ`&26X=80cd7T~4YJZF!k0$cMmUmqK7^BE7)=7J8F)AA+=5~2491yp zKk-D``YpFuLj2jl)fkSx^8+7EpZ$Y>kU9X=jvcGu7Z%mjY}c3s#4_*JEL&in42je; zI+O+t1pyOZ3nf?xIVMm}8e;HD=`uP(=7E0p@Mxa{SZpE>11KU*Iv7E22RQIXd8I`I z%nTi(LVcPA#XPR}^Tfz%BCc}mZD1$Uj+_?P!$A{w%Ex4Kc(`Z@LdjROGHJ)0v9F&H zRkZICo%Pg(GwJZyX*}I0(|0}iF2Wb#4G*%}j*NK4=dN-n2TEDL^16IYM3BjDqB6ZG z;!L7ynacb@xTIWRqn?pLWUD@3?i)TY@B6mbBAG}3L|RFLu$6#mu%NKnzL1%n0~T6G zJIDf&Eo4a&9$}fgyxmxzlAqZ1z`Lp2a<$LcfSH_}ym%%1K6&I?hyeyAJr6Wr%FAw8+EmO6GukHEy=blI}{`+6V zh^i%h*H8Sdbnmx+JNsQQxif))>VY&Gs)YAEcxkBiCi;4Sh3UH9?leHSx@Kt+7K-k* zDbj>|7doeBj9W{zBA}iI4^EGcr}N;)MGQX1C-LYZnnVNpF*$M1iyzWhaLdpuj`f@A zMub3t%XCkKK%(!ZMK_h_H)3DC{&gznNCq)ehqT#w8f$2HmGSYh_%mY61m}jH>PCRK zZrw%%f9z9A{;*5G0qNrF54jud3-UOb2dd3mmsJq~1$6nIZ~fM^{$Ku5I(OjZbnH{V ze_dYavY#=7Lgynv_p_yWi925V#JRwne_onVW*CDXrJdSL5qA4{oBs zw|W_tO})h5s9e6b9^uJK9YP6Hd6sjO`J%$LTazdU6lfqXh7V?LE12OX7PyO2z<_tH zPyFRZ$ZOheQ8V(9wp{dqR}7OjB(<#d+L{AJ+@Q zb=g$hS5Re}9B0!kmrhr(6C=fqqT%2Tem#YhaA;!w*k?%%S7`Zq+l_-Xc#UyGMxhgu^% zWHPY8ypTPxwim$hS?7C@K}Q;HL!khtAUqlh=6)1$_9asI;BR;?{4FQ?f%6jGxSl{hbL`x? zwDt|Xlt=HlmS^zT_BXw8WBTX)pG*IhaPe>7xizgujoyL*gkCi6XBo=ITA{ffwO{+6 zx&|8XqvFyq<&7v)@7uI7?b`6|=@XxRGX2uv7t&w+3-{GtTY6H`>!tSUN6g*1 zwpaX0c&3qGhlq`Y%p5&2l79Gmz9VhcNSL~_*T;(QYcqak_+r|FbHOapP8yN9>G9}Z z)zN8;gEebbN0@Y#x92Ymg`ri0vMk_Zh}-`DZe)C8slU4&8qkN)*U3=0Pa|`gK;Sxo z$N3t<$?H|5d_;k{xIVxK$Zc0eYItfzI%f zp7NGBsnWhS*ldAaTf7tJ&V7ob0V#9bEaB`sds`#&)e(fmBgh=OdRAdzqw*X9GCZ1X zFdB)55)BBu!fwfeBQeH|d;&h4BaHnfBauJ@#)1jn zG!8ax8z169=IbG?X`W)9_{^iJ1%rmtsH9S*MRoW_xzLkxdS(LrM&|m$OQ~hc-i-PH z#&Oj5h6mH|ncrLy9IYkKN`Ij1GH5CGS2KY#jZIwr;CKE&=YEFX*c?0A3;qQDu#+dh~mYvY-CS=HjgEDk|o+;#4 zNYvrKJo>+<&s`i$XIkzKS|fpSY=%CCNE2R{$vLyc>GIy!`dGrEtcP^Wu+ANQ7%Ri( zRjN;x<>uD7yF&dCqg?{5ot-exrizB zjjSRspa|Z`Fy?82w}|a`p(REjaqRgQ96MvhXJLfKo!mZ;1>Z!!hoKeks)V=65klUD zAkSzO->m~erM<=i%JZCIgp+)^bual}iii~7pgnUcmzYazMs0mc4xbx&%yyM2)*Ip) z@FllJgJMA4=8Gw`)J!a!cXH`2GX0Gb}$aeT+^hPea0f=ETl*~ykd%c=ow zje<1-kgV(3KCrq!ogci2vF-_?-eH_7pBeLd9=O5B$Jo?ZgYCD8{wW@IvVN1-tj^0m z`~2rWpKjm3KkeDJ8*|jmA&8rsw%p4O7_DjTssXk!>d8h$Mf+dVLs;KJsn^1!PMo=b z)gqo&?7ugQ&}fQ17Mej8_rzOD_^zcA3PjdzW{={dv+2_0chLS({c}G_AwNmcKu z<9{dJ^{#gjD#ZP)m}2R^5J*OwMFJ*hgdLp_-))=LrZrt%cxEs$v4{(`1c;JFDq2VJ z638q5szkqlMdy(dXVM@zF-}ohNH?;0mCnSdwrpSFFHc%bz(I)O<2Qe9AP7XC(l?H2 z`^!J6KwNuqGkwEAAjU4ZATu^b7_2drIngI_A`PE(%$6zj7^qVcAftC^N3AW#rq`qbS3LMj_#e zI{NX-LMJM*%#U@+En*(!T%}hW$y@TaQ5WmOUzrx)tKTo5d#tvtdjDF_tKYlUcdGdo z*RlSjcHb^31>rtsu5Z9lt__c+4&0Q+*>Bth=d#ngO|EyTZ(nz^J6+#cj7pao1Q7!p z+tUah=p*cf-mQR%XM(*+Peq>3u!x_$gm7au!sb!-!#jrnjYoaF*N7Locv7pFrzF>8 zvCp@QVeYkhU*$RYQlN9>yX>cU|FZj3s+qcU;qmUe(MslZ8mCs6l>4r@$hWThS3I=r z;LiC>=Rj-f;cqi_9~;t;U@8p}_IJvC&uC+_Fd|I@Blp3xF8MF>cP>@RHHf^M3%=#n zV3r|VO4ztmz*#75y`wj++OZ|gwl@}d6Z{Q95|5P@gt8!In|%T?BBlWTh_1-a=HI`_37es*RqCG z#2+UeXT9Hj8-jx(y+GaeZQq_ctP?_?07isJhgaucK-_U((Lg!QTiMp>FkW6C*mG}` zR4Tp8a>Bo3xJE{Z7a|Na}rwd_hBlPuy_uZ2|@z|Hr&;OH8rN8k%J-oD# zxLyfc*ThP@0TT2@=a!k^VL>VPY{83dchF(!Cp=LUp{ zgh)lQUmC!_gfO|U3lC<;dr9c3A6;^8uT3C$I7aBoHs+JrP|{mlsq;cQjk0My2HmZW zkz!7j4msNg>@3eZR_7+~)snKCLMFz0T?kh11M?I>H(-e&w+>3xcR8fEjX zc!~|4x|ljwb*2t*KZM-DBhN>8^pnR=u>C~#8UvD42_lRv$B?MAC}It}+0WW~jPW;) zg2y4&Mkx1o#<)uJb%bVb-gj#{clt~?&CKaZhXD29QzPkg4~j9`xNGy45bkyu4HBhF zZy#YmQS2Kvz!2@1FlrcOn}I=K>3--6GX_@mwnfO~ zP}(xS7Ff?K?+O@;zs`vWkfaEvNgP00+6;N#%=!S2c=~BI;p1O=881ha@$U2P`atD% z2;6yZk#Z(Vxy~PO2`?!WY;EDSWn{ELU^z5A9D90NT4@O8_G8V!n^wd}@^AiLRWa`! zS-&Zwcno6@(BFvyYO3b~DjbSlyvoBmsrDt%ss!J<4|l-q|)qSWmt;sF*M z0A&o=$S)T);uyosBjuLu_1x6F?csb==lq&i*XPhd(JWC3pw{U)Gv~7 zcv8JpnZ_7Tr!gAZ`N-Z_e<`0et$E`Esr`xH&lk)5w!lX)+@g$FGjTo&J!xZ|wh$iZ z%e?eexs`EG*`j!olUP?`o~<|4an!lQc8fwDbyl0h*m4?!xJKyOE&Fdx?|A3Ksq1bG za#lfqSc*1wxaMM9fSB?%CUI+G{6hM}PyKlMqZ7mFWZV9Q4hfiP&xGx1DiIe>0DIRFTZ#U2yRS$DDavmF9Cxo=>1|^?+e0qa`4EacZHt@ zUu_ub%!8A{#A6G_k&bO;JvTy9Ihg5s?(4;Ma$fO{bS2}J@+v*gOZv1pf1V?3d+=pN zk-<+a2JO<9{JCLEG4&rlgtwq?es~!Lw@U&=fw|gGJOP=-iLqk&qZeg`d8nRKWztJO)7p)xo4wD~Rhw3?+n;uAzdbd>1CNhltQ2=&ryng?d+>H$ z)lHbWA%y`902@H3yQfCkA+O}~y?8?mUT96|q8Ma^R44qHd!RW0Ia9>Zyb2Hv*-!1fzKuvJmTCKI1*mOJPe`ln>N@rWy(}M}S0py+swn2(n==L$rcVXe)%P?y) z9Gl%mpNV_YB&G)@G2Uaskd!Yd@Hl%Rz05w3^WYEcEeT~ z*eg2PXBltgN%G$Sp5+Js8!^R_6@`ugeO^J(M8p7hUu z<$Keg`?J5A1|NB6dOI+^#Zbr&c!fnv2~F`aY0ykj2Zd(N3$uVdMhs)I6-8M;O6Bi) z+uPEwed<%`AO7P%Nk8^u4_{W*8uV9^d(<-2Uw!d~^J(vnT?o$<2o`Nwic2=ICTD>@ zP~RaUj(z3uvGkTrThi*5fi#M@po+Xx$cgUXxfXBW&NPP?SW`p@sDE#{Gd+E#@k%;y z@&q2}T|hO{TGxwy`T{biH7IAB@VpKXE^0>!eM@#=1=Naj@7d$fTwe5vwA?6bn-Rj! zvDH{}GoiBSpX`KEyl?q6WcOWUXI%G@*FGN^WKZXd!w5W4ma|1g7h9eEt;yr*2mKcP zC4U^A+b9i@jB=N49gwfI(Z_wz8C^xzqP$;=LS&q_onkzWqbPT;&z-=t8@wGK9z}Ml z0fKaZd5p?;!EblNYb)3_Z2JO+3r&Rf)$6(q!&MdLr;eTokECAUWm2iGSNYP^$9|h# zDAo@jK9t{Z%p7X>Nes6bA2>u5NgT5aF zlQzPVD!3NrVSL3=&vilTb&R`QRQ#6wn8!F5{?MJW8|yh2*q zrYmHtyHk54~Rf^3ayWPBVJIYp+e;A~e>DT}0nbgPDNAJFKW7>=% z*0gg*K*hc=dCX(jtpiLBY4Jz6IX_If-Hj0h$a`W`@{N-zMX+@HHynDv}PKb znIq%c#taQxW^Tz+z%}0Inz~5aH6AR$#7#0@A*r;i&xAmjYrD+*;pEy#1RY_=-0r+@ z9em!3>|I5vQJ_?K=CP1JWWV`myE~D^cd~_M10LyZL`Q1I$U&Wu)33@}w^*4aTF5m0 z*~+$9UCe>e2Jl@L-W1W~JVs+wXuCx(3VHh2(C~h{4ZLz)V4dg0EAksHsfl{Z57-9F z5k}H^xiMicMuifcqlRkoBh{qgm-B9HtHpyB#&?v#yMa3ep7~B-Cv9>M@o<`zcSZSN z1R3)hr6Ux~7<3si!Fn6wU1K(>pWlvXw*lka_<3;IRL=1oz|ZfLX>LyAM*9SQq=1*t z{9e#z>Tlca&+zuT3x9Y5x3<{Fwb15yh!1)vn+-xI&%X zb39BQ-?!GpR5&^S@`f`0K`$Icu^&%>7n zQ|nY~>L7wscXwaZQ+$$l8)aLcg9i_#3+K@r;YW=VJgQH#5oVWrvvjXzL3o|FjCgLP{g-sWwT z<@Pu4d;bF{v{?{Mp+MIA>~tKx+1?Yl9(=I*GI*d~i{@%vwb%C)UYM11EE1 zif0l7-!(*u%G-&BiwNRb%CV9wvzFhf6jwV9=AE)%k7U>k;p6vTpCr-o4-oK;+zeX{ zp@ldw-9tENp#-DouXy+x|2P%Q5q)5sdAEb`{SJ1+Hf8+DjUQ*BnE}B=`x2s1;@N9l zoy&@wX20$!1YD-=+ja(Fzw^#FAVl~_>7yV0XgUv3c$@Bb@5#)7aFCf5Bpm=LvQqx~~luF?0+Fi)Eq|2x;O z1?M0(DAw(JjYopZ5=_i00V)W!dwvkuD;>Ikl_%lORGPbb4NP{@bmTIAvxmE5lQ;Qa zj#9BXZt(lnN`5iEU(_SoLN$YIm6a&#$T6Om_rHOTF)ZpG6?EwvsQEXWx)cJA1(*hw z0xSk(YT1VgUZoEUNB2_nI!|1V80LjwFbV`J#!-IqjXS26g7k*HhI?)zRAd9LqvM2r z`<{>fMEd(b@PRaR;F;@Jpcjp-@(9`MC-XZ?VPL*0zgoUmBSj+7l2pD^u zxN_@8KQ%&DOEaOLne%7o&LIF{+arW{DvDpr6mX|NK^)x%tyutPTTqgBcQ&UpCni!q z-qm`(xfOv6;ZF7&*PDD633KaoM;bnHA@=*4>SGPHt}Tr$kB-61%o1g64uP9Ig2t>D zQJ{w>`gJzSy0)=jx!&gr5?lj?f|~l(+CrJHN7oAj@y#Wgi$8fc>*M{N^=)ZjGa(*< z&lK>va1LcUUh0!X5t!uKz0>FDM-2!f!W!kwcx@l7P}yi359d+F@4CA$EwBa9j0*~s z=h?9P%D@wMUQMcwt*e!z0{YHPcziOi#hP=aPut+j5}g=8t&1GyLxIlvnSZm4iPI>O z9{8qhjE78jo_qRix^K%JVYsSSY9K-tkQj?c0?y*aG?Am`JG%*yKAhHV>jgg+BkSW| zJeh7|592Hp$1C_*X`TBt3jSL+Y)lI%85JP^npG7fR? z=*6M5X%hk^fm)L+wIZg7;BKX192 z-aA*^wr6en_{V=J{q?`}aiW4xr0=-v4wT<)eI{?T+-Cxh{9rE486{s?FH1)FkMg?1 zb=UZ%^lkUPG5zM_kEMVAYhOt}@O^~uucR9O*UGFsT;cQp3iNx{>_E|7uK5>d6t01$ z3eQRIHaib~56@1ee&D;Nr4uFa2u>U-D^of=IhywD-;Tkyf-B##J$2Yy#?oZVrx+8* zP)ffAp`nf&CZL*5AcuO>-d)JO^!p)at)nAL{)sN|$C3*8#iam_Kykk%EcrTFyysSg za|+kU-b92&$3h;Cxt)P8(jywRz(n)JiwDvNQF!@oGe%?9(Y5a6*l2_;cfZe7J9ej& zD8oAlf$lq5XV4*$O3qC*AxXJ$TG?KsG5XW0W~@+Uuj?za!mORzSrHuIP71Q z)}9|q3(vfurr@#^iW%w!V-m(8u46Jn)OkQ(QkgT20>)@HDwlra^Udko9#CULb`=Cs zZD@Oem+@ekpQXIwGFh(UR#sf-Afy7S8H0(bexlgyTb1r@elUIRw;xTNxZ`$Fzj<)a z?KFg%WUh<^aUCDyP3JB~H)EoA01tGHAg4wG{6RXUU;Y)zuB^7V0XcEY=C{Su2JkWD z)`0NypZsHJLGB*MmwZ5gvn=Qv>?rwC{$|p^=*WvNp%eusIJL~dLx{7@cuqI;V5~Fh z{B(H|zBM4)56EuyW;eXCtVI|wT>jcu?ama&0d8?KgF)>Sir>*@A|E&M4bcusbeQ|#`@mW2#!mWAvc6*hXxkox+EPL7kL(~!I10X!Svbx_EYJ= z(J!ST=Aw(On^7=tV!W(nEKm?h<)X>0Y26;d6ufbqRcK9deWM+w8UGC!3pKIzNQ2uT z<;F)fzkF;ejh#80`Y}A)_{Mb%G^2r#Cn%`2(?Q2T1aR}SIKstS`N#37f$SQhlsJ#5 z@YSO^6xNQ@66lq8UXRmIoDUyr9!(pK8oQ6 z&nOrQ%;D%*^D30*wW5Vr{&wxwRZdj2w&3WhGI!cJoA-mt`3;q$Dpo0SiaBPA=SH2G z*ZEUoz}TIKPc)SgoMzyyT2T5r@1G<3uiNV=Yip-(TKVfisj5A)#$GtkDoaeD;GnLF=SAN4~&;Qm+Pl z{D!y@e585#3xgxtZlY`XHe()owSg@b{O)-o6Br3}LFEhtGMtNfPr$0HoMsE%si}*x zA9^eNV24`{q3;oXXU?2XFCI9Mwrz&a`c9EL2lmkCaCp=cV{AWj{mJ*P_HHPIP)>EX zW7!EuH8OH84KW}T(1bOngY)`79dC@y!GQK*v5VEZ`;2St+zG?Xik5F>%L|E%432|F zz+GhDo=X=;Q}0$M1ieD}2R5Mc<(l?XfaI+bQLLlDwzh_n(ZZ-3p%cx3@X#LmZ|@!J z(>o^Kke++`R62KNm~yd((6S9W?ApvpO#-2(jR@w|^(5;O^(z48b<|PrmGeMokiu$O z(-<%uYlDQrtYwI;4XU`($BRW@ek>3c5A>z4MZK&5Nqq3z@n@al?v;N6kFJo#F3GrN zy%%T9-6cUlpd&L&mQ3DrzJN)kPld(xL7j4zc|oiFSr$g)>;WdxUg`;9bb=8CB_%P; z)?gsQb*8J0ua%0MoyNl%OJ+?UDrr~20T$(Pg1AO9HptaPS7^EZAp^=;h*br6dkEm)ER1j%Hx zOx5gY+KS?Q+iLb)q5m5h=Mi>J4t7yutU>!0VB#*q93MP$KApQnI2x>$>L>|dYp^ZP zYd7kT7M1(@Ux@PcT5w(+1B)KyeAUOVf9-CpF9bNMFuAd+ce6HMMF>bI6vXu-r0QaC zMtPiegyssHB5XC2bHwo60EXl0b!*WPv8NQU~ zx1!wQc}dgbQ{_i^Pkt}+!cok!Ka2SmU#1Q4k-@Wa9zt2`E6<_zJV_qhg;>#uxEFjM zt1=_^WTCKJdp$+d3Ru+dUgufa(Cd8dy0TYzXuWPB5wsP<-lmS!+1igF<6_W_S&VyY zO7z#TUa@X~2F2PKA)O1*0ldi%J%?8y9@Tv)#^>;!(n7qQy}<3R+2PqVb%qeF$Ki20 z8qcU zQubw^UB~$O!V@Rc{kPpN0icicK6f-$8dUv&w`s@14Ey~mxndp+cW(1QFXvns2aioD z3}p8UcMrx}wj!8RqD?w|d^oLta1A2`3w6FZ+nB%SzKP*Qtu+V`Xy94_oJze}zIE!< zx%B3@?x>X$h4FJ~)UeAahWXw!UN=U731lxbQ~+t6{Msx+n^QxVQuhvx;Br`Jv!6J2 zDebs_Ahm|)Ml?3sl^6SZJ3!A0nSuA_5Z=sp^rt7k@_2f%QnylIRaW78kBez-{q1w7 zCem9s?oPc#j|gbmHj%{?Ykb!?q)e1KLAC*bI5RSydUy2WWrcxH1vei1?9ud*x86=j zaMzWzSJbrG{*|ec-_mDLU>#?__YJqK1|C_tWtj@6OmWWpwqeWW{`7zU+K1CeKJwdX z^wFvG-4DGrt;Y$W5v|f3(Y^ePpKPqm1ufQHIQxV)d7W=rKKGz!U9`EOVJbbmZ)^Hj zzxA1P|9#ujZM)a~Rq6G|L>?@3`9cwRhA4Nz85Hcy!GcUiG zZtvke5y2q25M+grXJNV^WS{YGEvyuSUdaYm+iIg`GtTc*i9< zz2MKSJmwf%pFesw{gu79MNaz|Dp<_@3O}=eckRZF>DY-=yn`VMW37R4a)D6lZ+YO& z>A^RDFgumle@I79<0+1ZulrX|G43QQ=h-%K)6^OqSH@Bw23LCj8XC5X zv8pgOWPc2RrbheA>api#&{g)$rVh;raP=yiBkX4vp7ApnA2hiQBQ009r=nF4KfSsZ zz^5J*?z?W;p3V>k{p5*rsh@35RTJ9R#H45&byVEY7(2}GtWe5bz|UkioN zL=@%^`Q0jV9%F>@$!Q{f=+$Sv*azIl#gE4jjC;L8T8VzGko~H+^W4F_OU?Za4B@ev+-D&-|+?N(Qp%)z}eK3$Rnn?q6 z3UOp8$`{}(K@XI}&~otC5bcW+9pv+9R`KZU=`W?{pZR!t?km3&S&evfwrO)Z+q@Oo zCyIFJSGUn$mZS+4P~3}ow(`t-Wh&2?)S`U+x*q*@iI3%YbL_-E*xg1z$*?H%oW1Cp zVq^L*UpSX`L%Y}PUBmk*bD^1$qy;e#FQo2`c{`!}z~7>jf?kyOv%{sd5E^7wkD z2zSjlG_rSWNKdlC{k45{7Dclj^m=B`p&N+z>AWS)io%3t`4_xE+1WhxzL=2*Rb;=W zA3eC+iH_7&M18r$JZ@PfKit@kVwh`{qNS46xyn8jwo^o2_L)(zd}ka!Mo)DeOZ5<+ zXU=P6Y+oY3l*~LvURgyHnO;2Ao$s4fwlc2T_)aJJYlPt%T3~sx{Rd5#$7p6QnP*P% zpV#sMa;9X9IaX{4P!(mXbgw4sp_jeef|yEA@TgO9FF)ZK@b|fO(Bs|+*Lr80q>(($ zh7R$;d|y7NG_s70;xPs0F#q|Ezg5M4BgkM8&RecwNC+I#GJqQdQ{1NA_W-)2P6JIohGmy#D;F0VGwFjA#$F%bTRF|b6aZeT$}#j z_dZ25pO&t+zpq7#8S@M1WXu;aKwRj%tBQD9l9Z`vu+pGsR@kT!u+l8cxO ztP9VpWXd8cASLH3OY|U1p=Jy>WNY*HtctKu*gG-7CIN(ScOtd!dLsH~g)@T=qkXkh zqg+?Zc=_|$iP1DOs)h7sCK?tIE{v(*I7vC`}ck}{qcYOWP0h7A4{wD zzca16?Y$7=yvV$~#N0OTM}No3a=HHW-J2b|ke>OMe~*4_Ne_PDgK6hm-pXD=5OoMV z6q*J(CD?B)xFEt?)()i2tNT+6R(p_uKyb&l-DMK@OpZlJPr8KF+;i-CIIQ6ihD7S% zL-69^22O#kwgvpnP2-maJHBJ}o|}0Cx8P>gZbIOz4FMN13=D{Y;UQx_h96NVRfgn} zCKRONt6jO9-+PTAP?A6>ea!W(7)^Zh_kLgcm7n-1drTjC6$*4P$3-A>MJNm`zvKrv zI>(gra5>+Ib7iXC^F}crRiEeEdCrR0%u|%>v+B3<`}w)gOttTqW#`+q-zy1COCBta zMOnURnNjabndQB>@4T}lIh7g{=GCMUj<2)~-(UJyFN*~ld}%e+7oIHsAO;e)V_G*gLYJt~qZXXBqJaH{Uod$MwrBi1o)2Wxo(wcR8LbVe~%gVS_72dq; zfqv%Dg%AW7UVNPjbl>HB7PBS~Ap%SH)eFG|e2@kzv+#5+bfBI?3c8WV zr%n{%YwW+WTAte|CH4MQlAmZG8o+#;%FEW&*0(W@&4bY{8_1{9@k)v1YzPCcoa;&@ z6l49$S!z!w(ZH!4~{45JSoB8WC-d3PuGp3oU7a z{b>*3iTajzZ;AEF$jDSW!G7ff-`taCQP3#l3WFO;sNKr&6&e9zBx&!Xs}C?}tV_D(3liy{t;c;#7eh;>C1wXfW-$Yg4VfOVsV`a~D(J zH(^B2fQVkTy(T4)W#7kWp_8~VNBxHUl{O7;;-RZ}F{1fR{KlR!4{cm|7^#ema=hYp| zqrl7tVY$!UA3GBy+n7^reQ&WmcW&-%o=aPCws_>uJJP@Sr=L#0@PB@&%ubdnK+4-I zx68fdk3DxGZU444sd;>;eBrWV_CE5qb<5wF)$6!@0q=7JZ$z+L*SeZ8?$hbW)Oh;P z`t{%~c#WaJ(KAlLx_?`@Y)(gy98E`#pHQ-!+PZt$3w;RTWgnjC;2%|NC$gjS<>1hH zgr69$;?U5-yLzgHCp38MGCqXAjQ28G51s(C0+%>!oKj zr2}R8ruCcBkrSu!owEDalaVGsrB`LhUY z2k|^_PusTb3=i~SqGtGRnKE6-yk2?Fp;CurzFQ2RxX>$3STy3kjCe4j+Bgo!tOrpg z4jep60Y-Kqat3?$&dd%1$86-LN0@TjGP|q*S zs`RFLL!s0qi!$XVB3T{#+>@yr&+3+lu0q|wW5;flEYwSU^=D;&R)@ExIv><%>8t)k+$sJm>RK=Y82T?&D-C!q5?gps%j%aOFht4w%LEzqkMc- zjalL4X`))H?9rR~u_qr(-|@pANKN`3cB4eXIH(D4>C02@J)1R)v6;A-6=>WLB;ecJ z{8T#f@*kzAzVs{U^vRc^2>Vu^Y`n1}U2NWfPGBvz9~jYMBy=l^CzDQK<-XKs;LBd? zWc6y}jPq*Oto*H&$70O4fWx*~?j(ZNyWjc%1_oTnI~0XJ{`}EQBRkfnV?(3qlV3cN zZoB1fc0@a z$52VCvN*i1=^uGY!@9RHX57PDXTeLCE=3)Cj6B2h7QQ1MN90H7eCq^;NgU-}^A;mb zMAm6wOGS7O?#Ft9Yx#9%k~ju$j$oP|V}nFy7}}Ct;PvG9L|uyWke3 z))N$`b|GARE{w}90csCD5$G|OX8gAtYZqf3SotrqSxAve&;0V*=r_xy$}91>t{b#0 z>4_Y)9d9*q8IG}8`og2h>g7Lg$W3_$q&*!Gmjh{{<{Lw?D#bpBs%D5`m9l z6lB}@YvO)soM2(r!dlrRjVt6zEXy+7>wbnhJ0?vt@MZ1=|I+X=>YMw?cZ9QsCymev z75?&mL-4F^@H1^hL(&UfoI8Kvd^&ORMB1@^JM`5O{W^Gv?s^`6ZY7S%oUci8(&KxC z@@pex#%ioPo70ig7eba`=T*l1HGR+gh8vvf!n3P!6f3kY7N!g?FnW|drg{jaIYGl? zKPe{3dG>}H~1F_!Yz?K7%l*> za=eL|=ptd###jWkv~*)tJfDWRHwPotM%Y$8*4wbewxKctdZL-Cg0*1ML6l5@%?d*J zCGx7UQfVLeyrtBHyGHJuf6B#Hu!Sq+0%pR`h1)EE3MKjqSzqbxfZa0n)%(k5+K)-h>?f1=;xAv; ze~ah!8`pp4WXbMVX%fle#3TkAC6#a}15^q5m?7K)X4H>?Y6y2z5Tt7azV&}4X^uX| zH733Hz3&M@NDx!%Wi^LbC~w((OZw$s{#g3ypZclvAOGX8r@?1GN#v;usdwjFQqRWy zOjOH!mv^oE*Hdc6Li?G2{fl@Eji+@x_osLK(1%ki)}D@8C%t(+Tx3cilr0D;Zdto3 zZDFC*fW@An$sD)hLOG_Z{Ux!U;@yL6;}Bbc;%x>R@ZK`8y@7yAiweq@@g)Wn{qDka zWMm|~g!=kc<;6bjks94hHz9Bn0z!c026JIhN%#Oqx{SK>Z%I0D?9qR-7q1Tj_BB1q zfA?*i^{a>wKx*IO9;TTNZad}e+%BBoNLNg zYtPG%MLE_j=kVP;e?zn@srFulCs};2l9^MVWp66W@ekg1Nixs1CPR;z6neVAl8da@ z)%(Q^Q#LemSAMSjQ{YnpJFo0P;Fa~!LK{}JX;T}~5_;2-M=z%HFN~(u?1SFD3Ux6G-4J4o6Ds!v9%^`| zui4(2+E){PI{KiXZ%e8%J55{s(=&$es61DZem(3Cuc466q1)Z7)f9V-g95_G=P@{Z zKwYG@ud@3sX;JbU3O_VZ4$RZ=)jvGQRicNm$~QQT5bLcnK~%=-dK5;kw7oW@D_-kp zhPWUt;j5KL%;RO>K$}||*QVhygaVxB@sr!1UtIpzPeoYnwo!OQBJjfM-L9A zjz<)D;@L&Lszp}wmFJFYL+~FveL8J=kcd;%%XFH$ZQryWj}{D$-DBE*59BQ06gNBv zPBj54_=GU4EL*LXetqQ@KR6u2%HY6XgLDtQpP@4yT7O*tWcq za_}hNCGM5pQ`9DkaDDW1Kl6d~@BaPc>0kW*AEyU*?MiRjx*@f*ro}NBh$=Xyvf@|Z zS<#-Q6)3M6b8e^AN#8v{DDY1|`Fwir#dB#NVdHbk-?hHARB3zdUU72lwiRTPd@j2`pLicp>*j>2hzExPp4j-FZvK1Ut%n+Wna|>JZ3>A z+EuMgS=!>G^*wUtOd4qEBJv^zP`u}wRIl2@;N-WgMJZCeQd6E&;Q$#w@dd)uPT^7h z+{i@wg@5<2(?9$0U&JdLDUOZwd}UvF<`3_vD`g(naN^L}6KM~^$ZJUo zw`T}hJUKCew|Os0&)M|km!C{$F+v=|0AmDM${XJFrnGJQu5=Eihih&HpVJ86+mQFI z->^RQfE%5708445iROv5JF>UBP&z}TM)RCM_;XGaI~~K~x58on^ahK)Z4rbk6Up0U z@D5G2-J1!ee2OrigXhm-05Fnzpg(>6eR#R8BH#v!ed-uqeniJ~|K_2g3&@7XQwMZl z`}XZ=U^R+tZ+($Oy-g7!T93C9TG(!VTe7 zb~=0%9VsWKh)6L#aKGAu=3CxbYl+I7xv}~5^dEjUt;RX5WzLwIAT@BL1x3E{SbOc7 zPf9qIC6pwlytd~SCtd6aI^;*FpecZLBthLOd({afP|BZoj7BmXle&p>0L#~3pv=BFFqlZ#C8T@Eu4|<%>s=xL6 zm$bWl8c~|6V=xFt@f5gd(4~Gz+NRujhBisFbCeY5vA9sc&$-FERa1k}G3Z-fkLXJi z<5T3JJpL9+!(QHtu~EF}xKq)a@8!akbw}O3SxrlLrdB+S9!xL#NKL2JYp&GkB;TE!%;4 z14dUG(mDE?z^hoB1K=6-ZH9@LM!L+Kr!C@N{>w0;N9do7OD%<*qXd}-1ED{#4=E$` zdVJ3{V!0-8{h=YN@HX6j7y(d#vL+1z?R)iq&3fAl#7eTCb7CD1?w20wj^J(3L9F5Waz|A-U}{ASpSXM(6a-Ry~O9Vao6pJYyN z@2N%&w*BBk%Ot!rhOkQqa@mM$IbO@V=5f%4g(KE}TI;Xv9ZzS5#$h(-C;%W*UTYFq zmn8OB70)&?0NE#`ske>r$ipzN9bthoz`hqUz?Pa9*bD^zbvAdW$qS>YWr{^Sh%JyL zxq-k-s<7lz+7soK^_=1T!O4*X-yg)eYt`y>j*aSv5VCX-fB($k!88gn*t8xC&4%$9 zu=cd&W|CBvbUjCq$%@c{;}F0ZtaM`U?YLvPD%3MU55;m(bhHmd3ac7kFXoc#`S9|2 zMLyePl|X3s#|mXX{b`s_Ej##smE_ASC5NVM24W7@l@ia}SO~grkOU|bhLtkE^81F^ zkxn`3&mi!b0I*ZwL0CI;Pgv;HFo_^>h7f^6}Xp?nEs(oKlxKXogRAVE$Nqj>0hSD9(yc}AAdSsy5&u2{T=VbvUBsIvTI}g zO5L^SjT`^s=pX%ubo#lkVA;MV{h7b{H`AIo+|IayI5QE%FcW6bk!A!NTL-$+=2bly z%n+W@hvaczI}Ije1_g^Ss^K2v;SeGAE+`OZ->qQ&nNITbBVON_DO$rM6Gj&x`vi=_ z&@i-Ybd+#c6EHmNo5N(cY2%h?z*4$+W47vMt!_f#s|SISY)cbj`s2ho-*fNXOkW=m zDET-SGcL{+5Zv}|+mUX+|AF+GU;lNC(k@B5vA}lE|vHILQlvgX)EJaz~%g-WH?c7kKF+b)4ePdCo)v3HoRSh}oEV&f_ zjgI3Y#|4;kjteut>z@m<@~EF!Ksx z_=bk8p+M)ln!jG>70xKH3q^ismkI#a5V>u_WeM1#fM)U(K^IpjP;4*Y!=c(0o+}&= zfe_EcLF=lRZVpfSscHB&J?K%K&j1I*5-ac!4WnAXL&4b))(F&@JYH45Kmp_Z`iCfpn$=Ei3b{DA8kTfjHUyA!*PHgkTJRDkFzxvuos z%3NDId1xrDeFP(If#rv<@~Ug_DU?%>A3U7?;K`@bpBz5Te&Y5?J=sFQgTMulU`$|m zZO6^$K7Tmv-L@T%XTu7U3qhNyG*$&r&|6>@h1n@Qq>m=J@tGqh(=Qg~#7q1L(Dfx<`@-jsr2V_Lf#-bJM4l@q+DCWBe(GO5 zekASLJy0uaDLuGiIoJ5`IThZ!H-XQNe$sM-Cmv9#0)8PB0w+%suKwHh0r$!~&!ceO zzF{-6hD<-AJm0G!-{pv)Fuw_<;L|T1N*}rReYNuPSgz+Ug@q+-U0_T3e&GAxoW8L4 zX!_Zo{Jr!YBlo5E+%Qz_@SX5KbG#^yO%&62=jDXy+V?HsT_f#QtRgQrNd{^osaBJ=`DApp)b6g zp8ao6q{qMfa@w`FFZH5CRw=*e<4emfw26w zf{rXLqqq()Fv>VRdMW*bPyA-ueB0{u^r1r-8L;kGb|a9lhSmk{WTGfKaD%RO%%8$L zeqD?&wOe)J=wgT=vEo}hc5P2jKK^CCsV6gzE^S2Pz_|VN*>jB3F%+699Xoy|J@oc{ zDA7mLOVASy?EEi2FEH=q%LYBq+d0VDqm6>lp0R$MZhLT&}K zh7$>e6z$1)$y#5TfY+}39rwJW;(g1ejcKssBFgbg>EZ>9+kEsd0`#Gegw1@z+|Fe+dW$So6@qaNY>L@)y75nV1*;40l(b7Xd~|`U{_#l zeW$>!IU3rmcRcWQFZl@-6#y~D68u*S@~UbQO4a_#b)jCu!LoqY*w_RzlP<#2_optx zP17T_B80E?l2)&jC~487vQHM>tX&y`jxPWJKmbWZK~z+0<4yV^o-MsENv8LKZM1>9 zq86u5!L5yL>Eifs+R8Q>JN9f#CmubJPQ7?CO$?6m5{h&@Q9Bq z4j>%g^|Q)-EZ_Z6+at{OFrI8gp5$JY?}@IYilt+UJVf&jykk+$MB>_^GdDP%29KUe z#4WW{ZZ7SCoc*=wJ7BF<3wfXroUsX*#TdpB)shpTVXTXux2~|!r^q_*FKTW z^9+ciqZm^wb+#3>9Fj3KdN`dw`!ovk&!;md9!rDJp-2=KVB@E3oyHx)YpA(DU2NGz zS*!T#jtu54Gqy)aYi~d=eSu^d#c7!>?qAQ(a=5kJyyV+U#~yqw}5V*o8@Gqq1DuClG)$tC{e6^>x1$N5Z zxfCe27z-e+RKKzmkFPAbx3_q$B40Wj_(F$7bveepqG;<|(wg#X@*&OxGqm4*pXX2x zh5}t+QEhQ*r6g~WqpVU&48$6mtn^AKM~%Six>%*>1a#4%sp8nRQ7;j4Mn>6s8Ru8m zO|wJ_Id%F>(7`_DNBQn*I(Bl1a#HGF)lRgRfi#LDT$s$TpqND0GCebh7kXXJlHJ#>XtYYl--Uzr>$v%zHTHW zI3DdFh&ruk7xRMKF1U7)8&iSnoRiO;x9u+TfFT*Jr7Pylg}hx z%NyxeE`Jps=HQ3T&3F&OVx88)J1yKd!hlJ1$q~g+f%U@8efcpz|HRkGVI!>(wdqWMP~iu04l zkEJcE2O`wTC}A90+61x|A`nJE>ViR_kBv^J^CvH)0X#_??c4yP$dTJ2Lnn+>xyK_b z!>RSLspirOt^p_C8N82Y0eV|^XBwv5G4@jV@}cL`0^tX@?A*X0A7tI%f<=SY8Cs24 zRvsP&I$Qd+B}R_~J_Z=@)T_;or(mi_?K!$$cCP?o6Nxrwr7!u!Oj_IIpqG*rsoG!F z^YVFl^cy~}{`oB66%EVa5}svmm&dY<<&J?L%RPvD*4vY^q{X;az9xF%D1$W#eZm z=cx${ivlxIxBQH6)T!)8#~R}|hO^JbO<&^>mf=M{k=CNh@(h8Z65nwg^w@_!Czapu z(sLKsmqsq7^H|o8V^OWb+)-_K)>bB_KEpime!LeiMKL#jZbIND1b~3^ME+rz#Kldp zd_6)SXm&yWJU2vVJ6=dT?!G&H;S;}`&OY^6>RN~QUCEDKClFk$*HSqz)aY&|-tvQy z%KP$(-cT^=v)bd#zj(v5%%9Y`Q0IimAMa8^F^@zW%W}wLzH&Q)`0g@4Az=2tpO5dm zcxiiN4=n#w*>Q0}>F zl11&$*=oPe*|7Vp0dghe`xj6MD-aPS)&Jaf|LXLaKRlBTK8bR)ix8P>5ga36nnw%X zfcNz7x2;KI?0xP&q4FRKn5u2EE-o~&V-BIQN_4$xUc#%r1NL=^+@Mys^2GOD;C2$W zT_Y4d&~4WgyoL)}liw2t<&ok8&aMs1I(Z|nkIIsZcJr-WPtObu0bti+Ef^lON-)SP-j-vfmo+BRfSfTt?V5|q@Zzj%g5IrZ z-P_(vA@k|PfBW6Ex#1iVQYy0+Z*0ETM#y}VdPvdUnyyT z@v71_zOGVs2ceUDQS`8QpgqDu0MVA^lD82+34`B%{7dOa{_(e@f4FDeaygg1cjWj` zx_`@F!mNt_taZT?_dSnM9ChZ0wlCo2S@OWs2t|hIi#zWuy^HHbKll8ZbjOYzsn5); ztHL8B5UQT1GI#@T^jpKhNka`i*b-xq7P1x!zp-5INJubXWhDG><`X5C)!!=mth`}kqkbHVaUh>FtGq0Fe{)Xv5o1{LfKU za?4#)TZVhls)*K8ExJ7bRPaV6LPbrMz`wZX+%}IOTkrD-lghV^=Hp)SIuE&jx%`tJ ziwZDR2BQ%OqXXeBA5s3zP#056Xa(d4g`xOXjFsY>9^~=dPQf{Nj0grJmnKtJdsnTW zscr7;tMI;lyPA|!Hsd5u#j?qQ6A?o#oR zo?Yu_d~X`%xpMz0=1J*Nh!+Gpa48P8;=&k<2PI1-JNZWm_iAX? zf^n^pn8xH`h#I33S2#O+_m6g`ZupEf%=P`u>3!Cfdbtm`SO>RMn@7ueHDD$H19tJL z+E0$QC!AQ@&>oEpRFXF`mxo@@GE3ldZvIl&YTL47aL(g>;ayA77x`KvvT8Zyc{zUU z6O%?@QXln&rS7#>9w(&?p&aS4C5_6E7+LTaI?sZi>Sh=CX<%Saqc53+r_dO^k?p#4 z{#9k}Mk#unYoy>-5suEXw*!{IV@9JjN_UU;+TQ?BLAqHhB9M(i#J9v$lkneAf0Dht|4?BvKvMj(g*Enx-eTmZZ`)2F}NGkJaS8 z7A8ygD*$v%EFd2XwC>G)>G1jEse3KfB5gfbrs$0g>Vr%ojYvJmgwWB}m5#rBI&EYz z&vJosKmv-&rCFpGd{_J{sY)EpkAbz_?w(I852;ljrD%&QO4BDHwI6KjK}E*ObVX z!+%^;?pmgX>GP?3xT1UyeiRZvUz^>4$&hucmjt>%HltANfdn z>ZvcM*~4ET{P?qJ_5MfFs@vbqg0hZ#wU7NNK6&;({&JeSbUyX2-=4nXfBw-l2rRm> zI+jS!AtanvcuAY$&Um8rOPo0c+LQw)Obh2(I zl;*&OwW*IVH{mT8WkjX_6l1~7s^5gb>i~fYsjQs74j;N%C7Mhe%kg;-wJIG?*7`VS|Ckq{Sy2_Ifqkte6P5+#FC$gZ*$*!<=n!v zDi2rkg65GojAtP*arUt&$|q%hA%Dwj@8@!So`t404+t|XNo6@MwsIRVD&y7cg`UM3 zmQ*xz$=k2+vbKO zJ05IG8`u;5{FxCoPN}tz@VZFdNRIaKnyDGV)TNUXcxSRc;=1IUm%dkC zm+L)4W$S%z8|6zx4wd$B?ZMKM0IT0)4FDXEojsF!cC1R>2sRy; zC5}H&xbY9{e0zp}j77#HFlTYHw8Z)~`OYAu+Q)wCRpDM%D>;75DjmDLg(b|)(GA@H z$v^#`^vnO^Q|Wg;|9E=u-ET}AS*x`0?Uu;+|FicVV45DsVP;RxVRvV9&d5s;06_vI zK!QmmLD32}Pmv-e>u6H4pVL{gPIveC&SyEukI$BMcd}$#Cs|goW$F<{(NrKsikTol zf>;2H#pX1#d3SblzW1&Ezdy~)VizDq`MkaR&zCw@S65e8RaY-p2MUNX$RrA5EL)!K zL`fFAlr5kftjiKX0#Fs6+dq`v{qVi1gM7-mzN+ulw?Th_(=;?<=mM~~Yb`E@N1&yw z9+4L`wallJlb6$m{?)h=&M940I>#bas?MtRp7vbe4AvHv04*FJ*o2U>3GpBXPdGtL z8)sKyc%p)K`8;gZ3~(I8OWK}$@=m?s1Mb9w>{~W+=238NG^A`#iy169#ND<~7>uULx zuVRSv&JA1B8yt6&3lD&V7WS{wdj6~rrdX+s#_ zi|bD}DY!8Rt|?%p0)EcTG{P--mI6t0n{W27Yjf+UB3+VfR}^z@HXM^b&59RS`tAa= zkNp*OFUrhvA>u4Et_wPB4;Hl+Ml%%b8SX3kkelGzv|gD~qNU1xJK&6Y z{>eZ4e0b8FVn?Me-6H@C$BqBKl_3nGD4;mIwz{ks-Zgzt{q-;RzJNlD3P4=)rUg!~ z#xS=C&D-x=q(E;N*chLSnMPVNci~d%LKiWwhatxNH$z@r)Zyl@MXPekX6Qm2uVy&X z=X3w*;~{Up?fvh>?J%9d_>E!2GNNzAuJqRL{`K^gPyMgy&CCPvU>I7GpHY!9dlw;U30D( zF7_K#JL(WJQa_gBinoqRLyjG{LEoBI!E;(bRX8&;mfCUmJ$(%WINCc4pYLX=q8^2@ zirzZr@h&!c^_fth$B`IOLe4PG>~@R-&`=gri*IEJ7un1?hM>a|m756F%JW%pUWkPf z);Ttal9;hLI4-2|#<86RSy~*k_KiD-UHdCTW~j#c%cDz#qwh5uR%z_q+tC5P3EiB+ zBT9iG-Q5~?;-`>`NyK?Gt>B2?um!l7Or_p&Ao&>60oa;@+xkY8U-cuP$ z5x1+WBaTcP!SK%S8s9Zimunn*(>Bo_x*WYa&mwD=hD$3n@;EkhCJprUrtRz3r`dkf zaikL;9FFp#(re)qJcDzhGJNog7g5i8J!YZbEZP`)I}PDrDxIS(w>r3?x8P%(kBYK< z=Y4h1;5bH1sXn#ea=vaZt`3n$;6e4`Zi{LbSQe4#kk*y!=8r^a3=%lXL{O%qvO zNFByFYuGUi6!mly-VPii0*v1j9tZRUFpa^aifd`O^8k%Na=(l}=hrEYz*d)``*wMi z9`qTyTX!>}@{A_>E`EG-?P9B}liL}T$u)yl9?LRMeI|Pt$9*&D_{qU^V(4`2c;B#f zQ)=aW^DCDx!^hK*QoR~bq{{!v8#cpJi)+>?g6%Hd((t&eg<|pXTX@w{#Gn$U6M@m* zja$<>cA{UnhU*&vkMdl>iHt~QJac7aR*TRm($g?TKs0+!0%HZo2F;KQ^)jbB9>acEq{pa|`3C4`zDv7AGiOOmOZv9g;)Q1)1QQUWBY>B+G-t z&hy9M)ZK(cTlWRNb1|S*ER-oaSPK%}TIGQtQLn&DOB7+ksAIj< z(D-hhDtXj?$r1dnRaStD2%>Sg&#*m~V4_MErCeX`g^aAKo!hskE^xr(2^O~*j1Wf{hF)b$W*MWGa7%Lu z>!zlb%-Gl9p#90fuwP9hdOA+LHT^V}cjM!TSva3;lsw#36JwY7(!8J*#?J+kDATtF zw+@&W<6e9-Kb7KPosY#_4`+gO@QcL;LQp67S>iGO#kuAx&WCXcD8nO@W1U;E!qS3% zHB7Y@_2Kd~awcVlv24Dm)kT6<#LDytl;3G@l3O0n-pFb5iNMFC)LI_{MXAP!47o|Eaq9 zl|RHyby?0mMHx{hd23aCy-=+%F>l*|V;*=UZH==+%zWjD>WaQzw%>wp!m!}SUtad5 zZdfAmjq!T9e}OSvxp}oTa*k>jf(F(XO~Zrf@--~$QT#T+XS*v~0lbP}7vQ>L*NxfB z4O(qC^fsq$_u``c{8SpgIGv8}zlw!+Z#q9U91F>p%3GYU3X||otyoF4jdFJS!Ligd zsVapJg7`YYbxIp<<7a3~2cEiAj0+S0xW-YTUf`qf3Eti-;H_HXELnmJ--*##cpl&f z%;b&OSdxX4S7+I|10GXncjddw(KVDiO!QjDKxPdEpQIp&f*k|Jwff$7%Y{bLPr_Ga z6oYSGcUOALyWgL_^1Hv5E(0;lDhT+T>7RmI9_j#gW_du5FRx*X{`HwRHB54@ubJklku z2w^C$r8X3@?|kB`>0Ph7Bi*xcEk-ZbDn}yJrwP2M zyku0NWJXrQ``njBohxycytDJFf<_JloGrgFG7Me5zW7X`sw=T+u15w3)7pnHl)=@g zG{c{}^q+h2Y@>_-^A!1{H5Wvp8f>(ORtFbN^GLAzy1rrGH|fJ@djD6lV_*K?kEG8YPV ze)9@6MPY=(L%2r&)Tcg`zT;i*N%z0z!St2SemZuUxyIG)JK8YXRM~Z}5Y*P>Jh{Yu zWScRL3LHCj3`Kl*TD5Xz8X6i3_`CL}(wxo)-`$n3&dp+&E-;UR}fINJiubjSJvK z%>2i( zOUu^d;rzlRN(uzgO?~Ne&u>l-?|Zf?RVgpukfxkvXjpAEuz@Q3xhiGeUkK+JZs_Reu za=%9EZ_OV;00^V3X6D`(pW2`9ed`^-sZx5&t_P6A|NEK>G_BfP^Xxd9!&s*Y&0fZT zUcAEKSWs5ifh*|nqVY2FD_WtV$aCI%8`{DyBe5ePe$b<^1y|+_4u#C(CQaYg|u^MD?wq_OITGF{0168r}J zEpB?Qu{772Nn9bn8c z$ITEyorV+Udz%2d-Pe*p;EsA6W862<PG$LmRS&NU*0zA6kNfY#b|cvYj`!yIiAdMFBL z$3u-fe%yO~tGIqkJUX-UpB~Of;%|xAGMzgna?e;`}22;5szs*xV_^%SfU=P#(lG?860drGy5S7D{!m_9eg-c3~{R zyFxMFq$jb6lM{xQ7UC8j&(t>tzau|GSyPm)K0z8B`bc>p;H~E>733}OO5)fkZ5h3M z3HRn4NyC^O!@Ix~`Z2)87}2N#SpjX+15ZmwD|(Wve4oOr1D?4YOO6}TsjnTM#_)l- zJ;2{1ZaUPZ(I{6tjm)ziS){UFZ@|;SlDcWMZ#_xQcVOO1{TZv*dgs!{4I9&QM^B|Q zgBU|>SerWG`_7#^2anbte4j@#>)QPq9?Vy+Y)h-)-F9r=n$}hs6$Q}vGc%QqJu?)G zx8H`Vo{~1K+`yR#qa5;n5hP~e$lzLln9i_spnMi!scxds6j~p50mqhpI>N;sKD2SS z)|Do%&ZH3*-JK|l=9uuCQDQZ-{eNM4jP7xv}N-;EFy3fgIf@H z;JlI$iZMD^M3hKN92=Q5WGQ`KTDTg{_Kr;I64*uTb3u9b_Q6un4|2Nfa&e% zpK8iN?0Uk#D9frBQ6$A$yrlJ_J^t?W_P4$@{pXMT zUiyvS_>FYp#EEq5)4!RTKL2}Z)0@6Ob#A%`*OR!1XAJ(=7G@_$)A^@9lV({Mz4b?b zB(2%^04`;)GKTOsgB)?LVw1v$*|dYnzYipk(Vm4ii0k4(ZJD78?AG52xfN?K=|?Q~VJeMp!z@dtMh2y~Zv_*`s%!-Y9x7lK z8>1Yq=5s6Dg1{{Z+=9R@2vk8pf{yZY$G&~(Yk&6fboxu5cxeTCRq~o!=zZp)oMYtu zN^>?>pAGSytB;lY%C};UFQ<)Er9b8$b6O?8;&a4@&mmWSk$Lecc!l!A5;sLXDxWX_ zW$~#pE2fW0;3UIo{|Cm0T*7 zTG{!%=Yf^!xi4Ny7ZBt&j?ASlt@5#Y7-vgkYcG*lUn~`1`C~ylg`&EdCO47x%7xjq z+8u!k`j$#m{Vq@|E76;Y?~kUHaoKKlja77S^|iRK&aUR32<@gt=%T!U8l{QLGwJeK z&cMS>d#4Hp4X25h1r@BRC{O+j?4(Q@L<8k}igDz%xVNn3``<)Z-=901(xF2s-F_cS z6)f%dJ(eDsY)@bM)n7`d_K&19LlbG`?W1Ykdmc}72{03PQ?O|u15WUghdFA(QTZ1qJ zS%7_Dh_yLa1Wq}~@A@;}tgsztyd1wYoIdd2-Mp$5U_Se`!L;fQj6mUKXO#=Y+NH>= zlx5Y$(KrW>JaiG4-4Cs!y}AAe4xUdBZW+M%U%VGHt`opL{~6{H=A0S6mLBGO@%p+Q zICvpFxP5KfgaU8?AtB-!+DYCPxeSs|vcu*oc_018v+2A4<~tw*d1C@8(y61D(u%iu z&hmBYXSFiuf?R5Udt~rT+WEjL)*lrmr01XSTCp*$!q~Vu45x?~px{qIJfn#`$D+j= zSZx%km#(Ef>sQz0S3PzdYAUXT2yGj!&oi(iEqYfTLUV3d{5uctrc0B#iy>Ccgqo#+EA8EE> zzbvphLzz(^N0F%hTI3zknBONR(iEPQkE7_`dpm-2cK42*9;Y74ViYy%4J}Vu&i~TR zW{fL#{VLlw zp*S;>z4p0wc5dkELI_Vg>}!SFVW5@p6vrk8$M3aa+=OGe)yD3*c78=&it@i%SB2x% z<4PQ|PGtoOKo_Peu^bPEfCulDcev@rpJ|L2W0E+^g_aJvU$Pe>>2o$3m_o+dnfl4o zFtsABhOJ=al%QAlP9lL>`Bn_SgN$|K3fRvh6HQ<@O zBX!UBAYWvI5(X6R02C)Yr&mvtZT)VP!Y~GJ65+DFpo@`H?sW|X$u7uH;lABIh<*c9 zV^2R1m#)Foms^jxe*f_I<)&5vR*Hl23=$eU9m z4s_(LrTc}Kk=MWN7t;F8uS;M0)X!%HYtbM(k*JPs=lBWmYq%LBxu#zFwaW|ufVfi| z^rR6AVdTjR{7i2hGnVAhZPqsujF+)fjwFvd6?;=NxYypiISuTRk|_E((Rha?yvGN5=iNWXec6Z@*rZdm= zRL$?wQp>i@?m#Z)MB$(=hV88Z6ORD$2%NSicE0n?O^2Ze6kZyUF(z8r4C(Ip2IS$c z%k{vkvBxm$vVPV+BPiDOHr&e2Xmx?k2bLq;9G5|4sz4U?=eu=sUak+-hIqomu@`ZH zNzCtDT~iq>N8^p^P_)%|-W$iO)rl+j@okB9JTVyqeD{AT-YhV13Un<#%T+^x@FIwA zVs0ku3G7HwN4@Dd?H{2|S6ROZql@RRqB9Ymx@*sKUmIfz0AZ}gQCqBqn&|^KBpVt> z$1=<$&d{S-HX&*-(%lKgpenC)25 z9(eu?){MCE(duFz1Rx#g1CX`y!&-^w2qlo4uZUh)mXyA}#3fhC0XxkEpj#>5v||}K zJqKZ6;AKWW7vh+6P)kJP8-z-@=dU)exO?ehWvF9^D%Zf9NSX(#NKQ}1f+7qNqFoNn z8_fTD#hXPS!Qx25PbQ!Zrp2+K6%Tg|e&8S>sw+p8pZ*$~?mN=D zhrTOyZ@QB+UbmIg-cSXm2O{Nk_SNMp7g=my zVfBP#(euUBCBm&Sf|G=`skS1rF;9Fe+T0 zjBDC*>){pzZb9G{1a3hfAmIEt1)sV1(MMC?fB3a@`N_|vx$pTHig()WBDL_g+bxiUkMXK^1dOMhaql|NL!&UrGcRf>>Tg+E}ie!UPp zSt){Pt=cqy6xzeCN898@WTBi{zA1q@t{h6BDL-HLMlSv3hYXvlva9P+lWkQT+Ma`b zr!c+(1s7&a%h9hL%_~{7cBHNAR;1C1%ed`5pT^kf-NL%ah3FK!p|rqum$th%6w2L1L@g6J(osMGS81A=;**z@ac)PZ6lt#XsBz` zGBT8M^1L&3oRcL5`og%2UvLIRiqWeuxTfsl!8ILhM(XZ>U+1O9)3!g_pdoeOc?rk) z?qjrTnT7@I>{3AluC`DC7unM&^{<|r!Y$@p>R_SJ${Hpg^CkQ=R>&TCbe|g5{qXh* zSrqyd-6ITQ?2%t_<#yT7gfO8EqsSwF^6|8D?dFsQ`1PC)%esX6?oY0G=xiK{x?YYtz=sG$=D4F=)tq{xt5x)^!8zl?C;>w{_QeJJ`6prB2L zcLcDNZdp_X&mNv-ZGVyaZ@ZoKdP7CQTOD~RCCv-C&)v0Q0|IVvu#7?86Ua9sbqtbN zx9j#0U)E{7xifwJ*qO9xQy084^^5rP>4k$A)9naEdR4H&|EkPWXnwu5plknG_~8Sm zPNnbOa}T>I5T+8o_@x)qy}Nd&4)CHRvx)ah{sE_=uJYNe3BP*aRQh`e_=~)XG++Ai z!F1n_J-Fn?bC|n}7!%ZG!5Pccg9>)dus14qcA@POy9 zp~d7|4(0I!O;(8p-d$$5$BuOx3+huukJsT{?@+R%K3fYk9;B>dVVzNQ>!Q9mUD~JiYnR9_O8M^)XnL~e|%^9 z&#W7GRH1S6BQu{Me)FuyflPHpp-hgpao+m;^R{I zSCy*f_W1)R(jDwb2^ZY%KCdpXCT8Wq{l=4Q;P~?KL+OL-Hqx*3aj6>)9U4u$R&PkH z$`qj8O|CsjsxVV2gE$&k46NxT+=?P6LufpLY~zKq=hK_Nm-Bx+Q9STZS%r;!asO~y zbw5XVnG(D!VCvUun#HOvox_Oy0ursR9t4#bNu3`b<~&e#zq;83fg)1unl$E74rc7n za^r`$5L~q(>Pn-WGr8rq&a`Li=Jbu0*$g-nL>;E@M;sgPs7RIHcteR0l}xgJQ+K9Al|zTBXKr}Qz7 zHW2ValX2VL?N}QF?Z#p#2;&IEF|MV^mqf3UtZ?66jK_Jr^?dcuKaZCK;OU$Zy<`qj z`AE(E^6)e!#Sn;F)UhfL>r;hhQid=NQ>GoRhLMktGuMW^n{P$^Em@fpCryCw?A!%s zloe`xW_xZdROfbMDVB>BMGAK6-3F03ha2{Jlp>9N$mvRhqmg;1aow6U4}B~`c?Wud zYFsbk!9!!ZI9{T95EhAU@~WIJ<{;8d!}l?IN;wpOD&SC?@#43v2dbi|7tuQjnx?e> zqn}Qv4joBv`nexZO*q+UfIk-v#W0OocHaIyY3;_>r7wQ!=hA6ix{H5~WAa-y(3Yk< zd(zdez3I90z)NK!o#=*~OhLS;0L+D}ltPICGC&J~b#4ys4PSrk&{5vw z`QzC0Y2$15q^3UL1K*NMZB1Vry1?9`a)3hR!I752e4e?+cg1)pjE|K6R|os4IyjE1gLJz(sBkR@ z(#|l)IPStwi_DytiXFnS>)dq;@72Qu+h`hiof!<_JOes*o<|WXxCJ!zi#l0P@drvT z9|CYgc`n`rQK_qVxl)U73gx+No2EXxY**1dH8YrcIsVBp8oQXGKy4VRdCZBP)zsPa z^!5gAQGcNkR|oS+CotAnCpg!#B(zQ#J3{MU79tBM>f7g&R9gn#2EEC)da`)M*mlW)#DcYrtpJKGF*SbZ~@w*VJ>Q>1cODGe(H;ao0SKc5D>h zK@SAXKj+TVKKY`|=X9`EQ@6W7Jg2^eOBdJ(y_WvK5P~vQWJP@HEd|rgq)G zp3qFbVfX@#fVoK<*G;A#cAa0oIFfgnuf?-2o(Lx8bE&@uF&j2+O0RkK1L+M9KbrR4 zbq_`wtk>(-x?@+L2^jf@a+U{dIo1+4B7kXMZu%li=|~S}$jm^99004@2GZ&+t8pjB zS-dO`bvdG-P5Kf_B6`>bMlsN7B!U${NY1+i#=c{M?xfss*a(Ouc%$AwUyU?>pv>9SBj@u!Tse!FLP8_2k zWG_MlmB|abCX`4L^1y(>2a$VGw99B01I590vq85Q2J@Z3T~!1SI9plT)*BDv(ef!E z=w=mha=+xsur7bTcQ7zr9s~hl;5Zm03>8y>oaQ<*iMmX4`K>Wq~BINN(3#d~}9N=$ueOBd4s)$TI9oJ**TyBTS`H2tzWO~Ot-kF|y>L~*Uq*>C`8GAK}i5^gSQ`dugtJ zJ+)-wqHk4#hcz|==+!M9Y4^(2;Yq@Ct{i*8hT0d45C}zpTj@XxvPmb;veO#{xM{+L zpD(KeI2kkrtiODPv$ie_1!G|UbRe|o?&*!Q-8vB7X%yomsHLT-GXc|Z`t%6|aO_f| zf7h+wlsZ|kD-^I=GIGii+pvu9;e0s7CxJfHK}EeZOiRXKxFo!knS}*d-IJdTffk2h z$p{_=zEW`DqfK`R-U_!Ma0>#rAaDx;OF}>r>A6dNn>MEYb?ejB7Z0S12cAr8@2L_9 zESYkNmqB=gf-mv0^vXB}3ohShLhYPVrrCZgJ@`J7_#E%Olz6TDA-*sAV_bgoDxu05 zFNzg;6>p2Orr?8BxP&m+g`@wX>|EC({>@&C{A<(Y#cbtW-5gy0;1cYWm9Idi5|%2b z^u0#WS;T`s_wyp2qR0^*4WEtk80GeLt!GYOk*6*J+-s19{|e-LLl}%-}5U+wWhQj(r&gu8UUkp2DM7LJ&X4ZjN~s+VyoM z&Kxe#r#LH7o#ixqLm$d;%fFFOxNL7HO@UGh@r97a0rqdv$KsrE{MpWOf>J?N%{0Q) zGuWG`*EGfeBb;+S&(8RE_@hpgGIJUk!2cLmmvt)ACs}`5rf%~TPPM?-TZSt@yU38s z&+WP%{^!`aTUU0n(*a}ZL%;W%Y4_XzT1vav9nHESJ^1?c2uD5b|IL4oJLn7P?Edq( zl>2-dc}bNoZ01FeF_yf_2DSHXjkFk3Iq(HNcmjW0DWm}$9?XLCKsZt z{mxz+O9OkmkR@DBY&Ig~adzVAmbf9TM=qYFAK~lCtG|&Iqq;e&w1c0_u?h36^~FT{i?&IE7#IM`)Z8)%@24W zpNI;^Sj%mwj_*C(IWm&*v|(>2d5)1MMzMrrC(ou$7~6J2qq9j$yk7LjF{S4PwQ^AN zG=hNk(_j92`mulTM%K31%JB~z7~+iXjqLbCfh5cr?>TVwS=@_ybMKgpB`1Bs&Liyk z@t84=TWu9f?3z9{mVW8y{%-0gP9yS}R)mt(Yf?@{TJj;2jn{HzlYmX@^_HSn?*Ww(MuqQOy9UzkH|$79|NIo5 z+}PQ}TsAyA7JV{}P*P8h?woU{Q71B~HifHTqbN2P@XhrvXsz&R11I#V_QHYZ)5z7! zY3J50(9K>1we+iWyPY*G<44>^Qb)B=@PbQ*d^UMoI*dn06+jq zL_t)i?i^>SiWCNa?!Yz^h5w--$d6Ip;&c@{R=K16#Sxc$Q(ey`BfQL)6*$#qAT6{MRxxkP%!hx^KrrRT1=#Gk3N2xOa!%zap-S^8Q)wKlF#GvMJ^6Fd&WA={-q{a%hhK%$KTq&cnKv;o{@H*!^I zM}{*o&d*FO44`t)CXin^(1$Pii%$CfIrsAg`j5Ht_|fom*%}~o_v|3X1ba8Fa&7e ze0R8YjFOa}tDrMh4$(jGP?j^#;qWSUn>}t}&6YIJM$5Ig;Q<1@&gO;(IAS5CN3oby zC$4dCL(uaK$7jxBdFNb-K~oz>7cF>&dFP{drN91$-D$;Ma0r7>L!OTtQLb@(CqKh1 zhK)_=Rm7Bg?z|h%V5?)SPEN2385w!?yl(tr&hp++ut@odc9iCp;<@O9;<^4RpB!sV z>R%nQ@*ElxQQ z52(CVjyw(jtml=Uo}SQ&bzr#Aj#6D+iptFv^>X}FQ@FX)Uk7q%Vb=<*rAgh$#EA+W z<{0F1+Z)5+O=E#DX2WyN6!bv-m>a}gv8~WWJI~WTQ>PgWP%N`SJyG-{V}_Dyhw3_}(S89j2&`K_JJi4%DJ(XG4vs8K+(Gzq;KjYYSKHzf3x?5<8%IBlUH{?J|M z9c&@jojch=y&a84cO4H8%{g?x8#%J&D#r|M*|{_I zV+b)gI2cBjJGSgd?|=XM@ow}OvI1P}lgrF3UWrO{!C7c*_(kUGU!l|-z^M%A;>C?# z?Qqk+-1J2`?m(A0ZEa%LBUTGqJE|aB2T@wHZEd=A?P9t(av2MV+>y;%tw3;RVOScV z?&DZ8tz>|b1gl~!O8T*SzcQ9Kwy%#f6+9PQ%g=5m5EmIUF!*6^F^)9}=U{ZqZfD@Q zE1Qmm1CV&Q+)_{kX^+WOh3GuiSPdwpWfb(!54{H&K^FiPJ)NGw zQh5buq1eUjv8RI(GR0YTQaJ}jF%ZnekdZjw``3J_NBQRfq&}seF{T+zQNLhRKoY)X z%Vlzd5Y17h0fC>IQ^rD^yGl<;<>gV_W9Q(;RX-?jZ{H7bxLd z&N+wdfWzY$do(jZn;;f5SR%_{s>HXF63?it#0jFlDA*u^{TprK8paY;OzNUE%e-*1 zFrQTet70c}5zT(~y}Md|?tl83^!)SBrMJSN9LHr`uo}ddusJDS!4=sm z&MEuO_q->){*i~%_kI5lk^cGg`ycs8dg6)ylCC`eh17&_x2dBybq>Icui2Wq)@@21 zE7t=L+;;pG2=>9r&wf13PYkDrfB1*fmizCGGZP`zSfWC19W(rEhyLtdvmOQ*t7~9j z=SvR&9<9jzRMQ+@wQ`u~EDQTVEZ9a_Bsav_=fW?Lq&_;_LIVr-^PImi1YMB4H>Qmn zx3H7ED-0hLC;<4tEk~8->x{z?oj!X820?3fj=fmF2`jihss&wg_Oy=v2Vd){pzZb9G{1pdlHAZWLA zJIEn(ptLULba#~S#4kvm@8G2h3-XuSFex$WOcrj<>7F;eIUUDq%bCyp;SDR$gU(88 zV?k)mB*)a#57J|<<>&aC|J1xQo*^1F>&ZB@q{a5($lI3{)mm7VKxwahnI(4Y2LM5Jy*XxDg z%S!X}Jd48>oO#&SGr?JIXIbay=>}dDKG9tUDtrYes2oA%`b+WSc6}?0%#kY?{bJ?c zu(2(z+t-^ee*GHO-?&4(z-~c~)taO1Io(Fq1^I+I;?1yQ-7rO&eYi_QUMmXQ>C1;w zcAkN*B3*a4@*gF13_L0Gq~v1Ts?jBIUc9af4I&!G(Q}tkJ)<~3cVIlN=*Ei=J1jMZ zl*a=NgNK@Nhn`#1OKYg|nRD|RzoOuA&4w^eeyQM}y%zUX#V&ap>&*$Q>=FL-p?E&> z2fvkezVmxi+HogKL)Hclzaibdb4U8xFaKg{J##D#J#jQ$I(;hbefz690JAZT;=XRS zjopsRZgr;qvWm4JSh6m!^w5f3&}Y8D?3U2E60OwUa=Up}DR7>%_cm^U&vh57f%U23@ZpP`6OM~# zc>G4z>LElT??uKS5j+1ugqzM?8%h0pIuN3UI4C|m`~3Ozz@B{}uyHn7K2SCSIE~on zSO=cu+{Ddzd6=C?Fu(py?joHSw5b#h zzHlXNTem9|{2J3%)0gU;6gs(Er-_XNdR*`v$c}YQ2s=IdHp9&<&z>1iuVO7ZuiT`j zuksEM*C`nx^4h^_&mjamcKS@ZgY(|~=9oQn_;T8}Vtv}idbyv)a|^puS~zDEAo0tg zy4(qjOfI$dvoqyVTF*|A>UhT9b5|eh*2`)4=Jgbaz?SuECOA2-;&0#(55i%Nb<|Zh z8LZponzT}Gj!T540<@tB=kdmI&+37YGYIl!QWVkYYhZ$MV-Uskz^29P;KMHt<63f8 z2m@nGxv-0B#fmIE9K@?Ahz}t z5qO}fwChbf)8O&*Y2xryTG=vyEf(u)>WavlBOc}ud}n?}VRi=s(rJXW3&c^rA})nM zIqFO;fv55ag{%tB-8H_Q_KuE@re~jhHf>!yfGiM4t?Xu;E@XPHqoMPz#jhgAIC<(+ z8bV;Ye#3^ebJs2eyQ8tIs+S#b?u1g&q_QGBHa1Zg(kUEwbB{ld$Wy86{RF#TPn|i< zPQ}sGwu?CiqxVVb5N_UG zlqk?(Bjz#8bG+7flYE&xjiG7NTjKkInk|%m3n+mvJ^dmwB#epRu`^?w~d9)F^vjLT^vz3zkWP3!JwUf2Y^Bww5nd)AZ*m3iRex8>5VZuN26~UO0|79eoo?R#f;c#`XAk1AhQZ z@E;dv*ueJQ$5P9MXVc~V$5Q_S${q$%k#kvYUX`b5OQR;<+6}@gcL#V=`mTHUSrn4Z zOlad6a{b%C_m9&L|MX9$o=0zsoz|w&*iw%yhI=0PpVQVI?@GsC{KYgfd;&Vk+N-H6 z9lHubEa;)fYt{T4^Bm)t67w1jTxD(H8em~uioNtWDc&xDK2Z<<_^m#ka>sGJ0yncu zyb;eOfs>87KN?ZARR_mZf%Zx(BQpU*vPKMV4felzz|Q2r>!4M(%fwsqbB4wXxswx~9Myo@34fCYDc#HHhuveFJM1D-eoacKJFl zIyb3|oQEk6BZ5-8f(F@U`M)Bl(~wUR&Oygv*jm7kf_Ea93`^5tnV=$BnqS~a)G6li zN}jXul&#>8n=P%cO7vFv12BrQhF1mhX#q%0#IsL3P_#SOYt*dk^bQoWG0w-XGS)d5 z8AZCA$+DiJDGhAf9&@TY(x>4mFJI-1brjvR%t7LoJEApQYk^m=UFsEuvTM?5yu-+w zdA7Oq-JR#XJzeZXUkUv1#zLJ~)CPR5Tfe*Kd8e0&zSVhyn}$=Pc&zDc>Cfv#fE#cm zzHkw%;!Jbeqkc@{tIClIoJ;@dCP z_(fzOl=Blt_Lq4D{!@;9t)gF^NIK#f?Ne^B<-JFkX|yQZ0^f`JVq|a)r8zyGM&NVw z3Vse_su9|(7w#$a7Am=?_<7uzJH0&`c8Yn;V{m+L9iyJ&DtxefC5sMV&pGkvZHo<_ z8VG2-DBq=FW$-`7Wypnmj=pLl{zY_bJ@iu-xS(mIQsSgM3N3T# z+z#K2Kj730Kc;b)BA;>Qu5k>mC$HimVT3c-S9WqNK!4i0c^kTDbjAF0meH7Ase%0U z%+#fH_^F=}+~x4?-GNSHL^jXxwc8z(c4DViNK|`&T(HjuBUi}TGR57Gnl8BURJL@07;Y&dnH*jxn-^!y^}E29M~IT&!By4$+hiF+lT z!a9A+t2QyP>~K1bdKd}>HE(xry4Vat27=mog4Niw5a&26kGjucjnsg3?B+FnX$AFU z1dtKJ7%8k7=B!C2H5JYI=LlL999mK1az!lLs17`^28$lZic$lfL-|GKo$OdG+ zCJKyU8VtfD%>Nt=n**^ZHU`ulZTY?z<`RrdTCZOV`z93V0q43p)mM3$=WZ-WL#R;o-8%GOnRRt| zgku?BOlMKxj+X37tMy0I zY9^_RoS*m23?rwHrgLBTFKHc?hWEecU8%Xh17$jW1ic7bCKv!waTA6DUG$|Pa7V)WAS|&3ti7aZA@PCQAt+q@Jz1}FDS z23p$Auu!-*!WnHW_GiGWwd*#d{vIZEX+e}wq|3#`Qzj=Ee6f3tY#=Q}vS$V=O z#Uw(`FaOOYl)v4&xdnk+5V!?_{|X=w^v*@3`~ZfIE$~e8XwA59n}){AOU3R*h@^3O zL#qm^_wpJjf8hM-LiCQ;y*_=6#rEu}Bk%)bSp0Y2M5ffH!~))EqJoz!^K>zfhb0;2}IqU6yBr^UgcFno}>zp0OdU%ujL7+b{-! zxMY`4pDlPH%JA0Zl0p)NY;!Kic{k0=E_Sjnpumnp)1pSp|4|sz)y;a3vDi!{CUxxu zYPf@41ArEk_O``%hEV+R9Qa5Y-xh)%7t75P)bkQBIe~&^2#;G+E|_&G$XM^>o}KjK zvx|1m;hP3-3R;A(LNM1h3eRE(l|qXs!!aGj$F*`#KIB#2A)TX?|C%J$jI6tw<|lx4 zW7_|b-${2r{#~4jzE9w#1h4z*zw@`#!tecVdf^M7OAAA@>FM8oB6aU*PwVd7h&Q(W zG}V%EOkA-~VXH$q7VA|j6YJJ;vE>^vdoGN;=^xUV-X){`v~)1{#o^Ek7t_Yon*%1w zmK?c@l|QxVEc@j7b7>U{X!PiWrN@Z|q4nW~XD+43-`2BSvm&}HyTZd7& zfp^8XMOU&D?(V`k$8O)fxWI3yE7vqmJq=q7#2C%j^EnT}nUp zKF)k+Z07YwC6`RMEx@{FIfVI5)80V@fhuRs&v59)Yv~@&J7wQi>auRq&APs?ZlCV| zr)P%KxwEI!p5420CRKl3jq4#Tk5B0Z0?L{RlkpsK2ihp!v-Y+hhA{-_?FrFaRc_b0 zC2f|aq;%xj;q=~jv(W>1y=32$rR@gtj%oS8_sarB!8Oj!c}y`f!! zB9xJh^^4&Rw9$%9(~c9kqP_RE3jb@v;e*3z)9M{*4)>(4F&k?P9%|!?(SuhmrTf;i z4z`Wp*#f&llo5@C3q7n$qur(ct4+;Q@m^dhbuuhg8fIPJFn~amO)e^AXI4(9M}F|( z^toSqB8{-)enso5bbjhQ#uK{!)YUO^0m{}TuJc?AZJgB@OdP2zG|urxhGB3QnTqq3 z?Ec=4QtbN&@ztl7!Em?}*TUN;HO7x)-q|0+(hHqv)9Vg2N<+aj) zfDiDt+PN$X#?MvAoOMcU|Vne_=>Q0mA*$g>~*U*8WJ?`vPu?By59e5OZ zFLf1GGbr48*Rg47ds}+PhkhXa#^3$NC}<`DvpZgub6y|TMZ0R@UiC!XjN{qw?wZF` zDgDQP{;$*B2i}-o^MUuI=CxoC{H4ZlxcZ2G>gl;V-Tm5MNk^Xl#WZ;Ci|HzE+lT0* z#-{$**yL_n4Sj@5-~?9o}q0M?)U1p3d1&`(434x-WRD!bS)4+z6K{sw1 z^!6k96%f)3Z_perF^kq@NU6mC$ba|l<*G(L&O{Z(z5O;1eB3o#;jeOuwqwht&1vV( z-RY}OeVsmL22+MmLUe~$P4P>V8t|@qZ=Ur*-o{{DX>2vm;kr|gC}Ehz*mG?rf1tu# zplD1n=X1`2YleL8XDe7hE|;oqq8e@?i>6X}PLWmsR{_C|bR)(JnKNZZ{R+B}bIa{l zwryP3Yz3_`zh?fZ32EV*ie0_*TDnTlHs;>|cR+~0E)<=fEw3Wfe&7~<0l7LjsZK*f zXLqJMrsgp+_DH!t=J1j6QCzHZK0R}@M?B05w-NwYF#|v13ut~SfNhVvoF_PPX3jh? z;!{6j(4gCSSe|lnoDH&Uiu35Sb~f;~v2N7ZPo7f%1>ZoP)?ZzpvLA!@#c?0S`ZYfA zC-+A2M1RqrwymBH6}&)UoK{Iudl$RZDPN_10qY`$c%)%PxPFIkng^CB%rN%jxL0&K zPD5kxC!SgEu6bbTk>V_dJMu!pDLe*X01<|g;DdeQan}L+u!^DYsna;?^wVbt z@hH&{d{?jDGvFcRu;o8(voJNi9s%-EC>a8}cWm@y+OH zwI!Ovy^}{B=)-{RxCQv)I)3e7I{4(zV#LJcQ5BktgXyc@-QX<*2c=JGjNf3I`e-f} z4B9agK!D7JWdx*+oX6zr=CrDP4ZneOaTB{-@5J3k>jLg%PHSU8G-2w0C2ig+Ubm$DoKSw+eQ`Dg|OC zB6;4ROtvntKoP4Rp$(>8_fqV4Pit3qr@nq%D|>E^gcU@LbCS*4Ht~!6i$Zc1HGiuI z0sUVTV-EZpabv}mofdYt$m&7&-JCDg4AA0i7vWLLUt+ib;&!4aZEFKlswuJA-9+#V zf+AxPw++I=a0|ksTl{9=nh6R6LFyV-Wuo?S!EX}!dSHkHdE#iI4AxqN`h2K7u4U#K z$m?*0*1|$nMYcOv3!%8dz#;^sB>;9P{07l*NQ>Ps!` zI-kKO}~rI_V*m_E!>&zqRSe2=C$9X!XNw+@k z0u#CJcrIVQ7?W%#i}nrcHU{og(}?PHx9)F2;1&dKLEshySgfHjQlQ_&?%HpB{EyPV z|Jk2ScfI|g^aKC= zVcZ37Cp>RWV<0llVt)d+hSMmbL7fQE@7!fP%I~6FUc^$sT_$wDy*rIN_a=Dgb$9lp z7mtr}RxxX&!y~D453X@>M?O=ED_?9{7sU!{E?s1S4UfM2uHLXvx7y0IO3R~M=n{Wh zV=+ry_?*}=U#g_uv+{_LZ_RhYz$Rs5RfQwmm&QjM>#|nTOrD-jmtI65GCZI9+1Wk~ zoX`iQhOu0k1r$4t;r5cc1v*nM$mpUu<95c&P?}Qif`V;eAiM%*rMeVNQ9)fSFp4-4 zFLJ}Hk;)+c;h7MT=UiH|Fq)2j^gpKF15c!ZH@=C(DK~QVBID$q+tTXOhfp$|PYt7_ zIKYl|&X8_n=X@)>g1c9=r0$hnJi{w?w&DdIK?Gy983B|agHlA5EL%ZL6KhnY2JB!* zID^!6su`gKYgBi$>#SZ&|5&F%Zd?~+Z%e|UJ}jgmb|F8wawYvKzA$3xc>7+evs};{ z+7M%YV6&dsZaj>RLN~57rL`+oVfcWna}jfi;F{MK`wO@u*n08g@$}u_gG=hV@T5xM z5A8@T>@=~~kt*t6n|+)I>RLp6pwCa8zm>21EFg@Nr~hn*QT>4%UE8dMB`MOIMFF zgek^BtcPb=@125wf7SX*UPTpOJajGHyJmCh!SHqgA)d1kVx{;Tdn{~VIaCU3!lTro zp`rA;y=##tR3aVV4D26y8^S))Xi!oe=#r`+Uc0_VaR{y)ICd=UeszDQ5fO_W?n4t8 z6E~;TxI1kgXXm^bi2uUFA{B6{HT8kl3J|AR_)Z}7I5aqv?t5#c?*|9R)8@X7;1Eg$ z&w7X|JJ%KS9a+TKkHX0eH=P$Rq;2;o(5$I=L{R!-$ZKfupY>BA^v!j%o)IPfNQX4; zdEvyd^aFdgR<*MdC*M^iDu0?oS&L%%+-w@aU3ja0Vx!)504~K3x=8UF~m_pRz_&wL#2Tq(we`D9}z`{1qrS01|ryO_l8*o>O zP$So=3LFJp%ehe%yMSLPVyXKKGP0xRE~K4zBWNY{H0PAhG+)M(t=DIl#0eNXHY<*ji;Td!XTZBSDt!K&o&peavz3cY$ zwzs`4ja)dJu3b9E&RC97V_uk}g6?ecXfy@PcieSn?1bxv?+d{=a4&*#E60LDf7jbr zFor*N>?+Ey=Co<^hBOK7n7~VeuoCXN25m!DU|sY`sX?LjmG|)|G_UeK?uJwDD34j+ z|MpLH@VR(b%-J>HYX@+t-$($OLK2?CeM!-&Var!uhObaF8nVcO^Mj zDVJQ|3Xa+T)~hg{@|crm=52}zg9dl)D-$A0UH(3QYeJ#4dU?6aLqNYu^nGz2jPJTW zs)@t5dHD5EE~2y?8yybFDTJ3yf)v36Den>{&D$Pih=b37U&`SolNpR?E*?3RdfiD% zxL$D);ktk9SAQC&P6Qt}3$JtE8y`-Mx|t{UP{e_+G3X-Z%ljiLhO&+uU2qFVE8lj{ z*0kyVyVKy851}Aq=OFJa*;*}4Enm8P$3(!h6xIAmu zjHDOXW!SWNQ@o2mqB2dNA4cH=t}X!cyi<|y5(RH?YT9&7?vO3<@~EmX6E4P5Q4u}*#bv+2xJPp5bP+)t*~+u)g0 zo)c!_|Kt2$$mXuwe>(N7eL8*R$&WH+qliS_m~~UoByiOuBHiHRT2lpFp%ao!XzOe~ zFWG=7b@@NJR+aDaoS|4nelD%1Bg!8KkNt<#(|=Ft+4ocgAhfpjaXcmcX*U6LyQ~s? z>HKM^hFH9aKQ-}YNCWJD5EDLHVxt*f!$ykZu}JG9wsPy4!k^ zpF7QCeFy6###l@FmKFwp*GZJ9vKBMY%NhE+57*)v@@e!ohtkP;Q(l455q0RKeBHx$ z!_#X3;I3x}lXc3Jjz?fz^j!fH`H$-0oM0&8&QOW@*vv;R;!`a+BW}TeEy`QO5+=Z) zx}3rQLmqGv7u~|6fx1r6wo!~jSn9J=9K0cIoK+A1GmYL!4>~i#jY?c%4QF{{oNYdi z5?y{)zNS!~PoZZU2M;wY^au+LJJhze(if#B0(Ibrhwi`!c_I2bqm?baT@x^qKUEd>eIY09Ra}3M2XN0!BV(z6#F~;F|8=DNS%u z=V^>^N1{DhVV}obq%~40oIUaT>G*TMQasjN(G^w2toihp^iWfLfi?N1f8CKD4MIt- z>xbr*JrMMHcEN5>qga$);Vcv800f~l9%05pBSeLThnB`8v)4cf%-gAkfIVSH_i_SsfrEyf%*vu=?*g?t<1MOoB}i2H4R^=~w>s|IH5cv+1{g>$lSn{@@Q~p*KYHMnf qv#84)bK@zFP@ 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 z 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

      glwJ@9x4>$WZoDX#k7 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

      _Ib7eah)ld3ZhSCl+NA9P_W`@=1iE+{3+(A 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%0A#_pHX@! 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 diff --git a/docs/img/polaris_architecture.png b/docs/img/polaris_architecture.png deleted file mode 100644 index c18cbdea0191e29cfc492acfe4dca11364f3c6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63781 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 `%)dN>U!=SydR7 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 MYTYTk{rJWI0N)zZMgRZ+ diff --git a/docs/img/staking-example.png b/docs/img/staking-example.png deleted file mode 100644 index 74752eddffc25b53aed0aa3efccfd3d72cdf2118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335775 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

      ob8al)%Y%650AVdF;o0aB4=WRu*(I)YiK- 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 - -### Requirements - -- [Node.js](https://nodejs.org/en/download/) v12.0.0 or higher -- [Yarn](https://classic.yarnpkg.com/en/docs/install) v1.22.0 or higher -- Basic knowledge of [Next.js](https://nextjs.org/) -- Basic knowledge of [React.js](https://reactjs.org/) -- Basic knowlege of [wagmi.sh](https://wagmi.sh) -- Basic knowledge of [Chakra UI](https://chakra-ui.com/) -- Basic knowledge of [Rainbow Kit](https://www.rainbowkit.com/) -- [Metamask configured](../using-metamask) -- A running [Local Node](../running-a-node/running-locally) - -### Setup Wagmi Project - -Run the following command to create a folder -that contains a sample wagmi / rainbowkit / next dApp - -Run the following command: - -`yarn create wagmi` - -After running the above command, input the following values: - -```sh -✔ What is your project named? … staking-precompile-example -✔ What framework would you like to use? › Next.js -✔ What template would you like to use? › RainbowKit -``` - -This command will create a folder named `staking-precompile-example`. Inside this folder -there will be a Next.js project with RainbowKit and Wagmi installed and configured. - -the folder called `staking-precompile-example` will look like this: - - - - - - - - - - - - - - - - - - - - - - - - - - - -### Install Dependencies - -Run the following command to install the remaining dependencies: - -`yarn add bignumber.js @chakra-ui/react @emotion/react @emotion/styled framer-motion` - -### Configuring Chakra - -Before we continue, let's configure Chakra UI. - -### Creating a Theme file - -Under the `src` folder, create a new file called `theme.ts`. This will hold our global Chakra themes for the dApp. - -Populate `theme.ts` with the following code: - -```tsx -import { extendTheme } from "@chakra-ui/react"; - -// Configure Chakra theme -const theme = extendTheme({ - fonts: { - heading: `'Open Sans', sans-serif`, - body: `'Raleway', sans-serif`, - }, - styles: { - global: { - "html, body": { - height: "100vh", - width: "100vw", - backgroundColor: "#000000", - color: "#ffffff", - }, - }, - }, -}); - -export default theme; -``` - -After adding the `theme.ts` file your file structure should look like this: - - - - - - - - - - - - - - - - - - - - - - - - - - - - -### Adding Chakra to the App - -Now we need to add `ChakraProvider` to the `_app.tsx` file. Navigate to `src/pages/_app.tsx` file and add the following code: - -```tsx -import "@rainbow-me/rainbowkit/styles.css"; -import { RainbowKitProvider } from "@rainbow-me/rainbowkit"; -import type { AppProps } from "next/app"; -import NextHead from "next/head"; -import * as React from "react"; -import { WagmiConfig } from "wagmi"; -import { chains, client } from "../wagmi"; -import { ChakraProvider } from "@chakra-ui/react"; -import theme from "../theme"; - -function App({ Component, pageProps }: AppProps) { - const [mounted, setMounted] = React.useState(false); - React.useEffect(() => setMounted(true), []); - - return ( - - - - Polaris Ethereum Example Dapp - - - {mounted && } - - - - ); -} - -export default App; -``` - -We now have a basic themed Chakra UI setup. - -### Configuring `wagmi.ts` - -In order to point this dapp towards a Polaris Ethereum local node, -we need to modify `wagmi.ts`. - -Make `wagmi.ts` look like this: - -```tsx -import { Chain, configureChains, createClient } from 'wagmi' -import { jsonRpcProvider } from 'wagmi/providers/jsonRpc'; -import { connectorsForWallets } from '@rainbow-me/rainbowkit'; -import { metaMaskWallet } from '@rainbow-me/rainbowkit/wallets'; - -// Configure chain information for local Polaris Ethereum chain -const polarisChain: Chain = { - id: 2061, - name: 'Polaris Ethereum's, - network: 'polaris', - nativeCurrency: { - decimals: 18, - name: 'Polaris Ethereum's, - symbol: 'tbera', - }, - rpcUrls: { - default: { - http: ['http://localhost:8545'], - }, - public: { - http: ['http://localhost:8545'], - } - } -}; - -// Configure Wagmi client with Polaris Ethereum chain -const { provider, chains } = configureChains( - [polarisChain], - [ - jsonRpcProvider({ - rpc: chain => ({ http: chain.rpcUrls.default.http[0] }), - }), - ] -); - -// only use MetaMask for now -const connectors = connectorsForWallets([ - { - groupName: 'Recommended', - wallets: [ - metaMaskWallet({ chains }), - ], - }, -]); - -export const client = createClient({ - autoConnect: true, - connectors, - provider, -}); - -export { chains } -``` - -### Adding Utility Functions - -We will need to add some utility functions to our dApp. These functions will help us interact with the Polaris Ethereum precompile. - -### Creating a `utils` Folder - -Under the `src` folder, create a new folder called `utils`. This will hold our utility functions. - -### Creating a `utils/formatFromBaseUnit.ts` File - -Under the `utils` folder, create a new file called `formatFromBaseUnit.ts`. -This will be responsible for parsing information as it is returned to us from the chain. - -Populate `formatFromBaseUnit.ts` with the following code: - -```tsx -import BigNumber from "bignumber.js"; - -export const BIG_TEN = new BigNumber(10); - -// Formats numbers from base unit to normal unit -const formatFromBaseUnit = (amount: any, decimals: any) => - new BigNumber(amount).div(BIG_TEN.pow(decimals)).toString(); - -export default formatFromBaseUnit; -``` - -### Creating a `utils/formatToBaseUnit.ts` File - -Under the `utils` folder, create a new file called `formatToBaseUnit.ts`. -This will be responsible for formatting information as it is sent to the chain. - -Populate `formatToBaseUnit.ts` with the following code: - -```tsx -import { ethers } from "ethers"; - -// Format normal units to base units for use on the EVM -const formatToBaseUnit = (amount: string, decimals: any) => { - if (!amount) return ethers.BigNumber.from(0); - try { - return ethers.BigNumber.from( - ethers.utils.parseUnits(amount?.toString(), decimals) - ); - } catch (e) { - return ethers.BigNumber.from(0); - } -}; - -export default formatToBaseUnit; -``` - -### Creating a `utils/getEvmEllipsis.ts` File - -Under the `utils` folder, create a new file called `getEvmEllipsis.ts`. -This will be responsible for returning shortened versions of our hex addresses. - -Populate `getEvmEllipsis.ts` with the following code: - -```tsx -// Returns a shortened version of a hex address. -export const getHexEllipsis = (hexAddress: string) => { - const accountEllipsis = hexAddress - ? `${hexAddress.substring(0, 4)}...${hexAddress.substring( - hexAddress.length - 4 - )}` - : null; - return accountEllipsis; -}; -``` - -#### After adding these utility functions, your `utils` folder should look like this: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -### Adding ABIs - -We will need to add a way to handle ABIs in the application. ABI handling is a common issue across -dApps. This is the way I prefer to do it. - -### Creating an `abi` Folder & Adding Staking Precompile ABI - -Under the `src` folder, create a new folder called `abis`. This will hold our ABIs. - -Under the `abis` folder, create a new file called `IStakingModule.abi.js`. This will hold the ABI for the Staking Precompile. - - - You can generate the Staking Precompile ABI - [here](../precompile-overview#stateful-precompile-abi-generation) - -Populate `IStakingModule.abi.js` with the following code: - -```tsx -const STAKING_ABI = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "validator", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "delegator", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - { - indexed: false, - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - ], - name: "CancelUnbondingDelegation", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "validator", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "CreateValidator", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "validator", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "Delegate", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sourceValidator", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "destinationValidator", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "Redelegate", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "validator", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "Unbond", - type: "event", - }, - { - inputs: [ - { - internalType: "string", - name: "srcValidator", - type: "string", - }, - { - internalType: "string", - name: "dstValidator", - type: "string", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "beginRedelegate", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "srcValidator", - type: "address", - }, - { - internalType: "address", - name: "dstValidator", - type: "address", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "beginRedelegate", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "validatorAddress", - type: "address", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - { - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - ], - name: "cancelUnbondingDelegation", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "validatorAddress", - type: "string", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - { - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - ], - name: "cancelUnbondingDelegation", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "validatorAddress", - type: "address", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "delegate", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "validatorAddress", - type: "string", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "delegate", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [], - name: "getActiveValidators", - outputs: [ - { - internalType: "address[]", - name: "", - type: "address[]", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "delegatorAddress", - type: "address", - }, - { - internalType: "address", - name: "validatorAddress", - type: "address", - }, - ], - name: "getDelegation", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "delegatorAddress", - type: "string", - }, - { - internalType: "string", - name: "validatorAddress", - type: "string", - }, - ], - name: "getDelegation", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "srcValidator", - type: "address", - }, - { - internalType: "address", - name: "dstValidator", - type: "address", - }, - ], - name: "getRedelegations", - outputs: [ - { - components: [ - { - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - { - internalType: "string", - name: "completionTime", - type: "string", - }, - { - internalType: "uint256", - name: "initialBalance", - type: "uint256", - }, - { - internalType: "uint256", - name: "sharesDst", - type: "uint256", - }, - { - internalType: "uint64", - name: "unbondingId", - type: "uint64", - }, - ], - internalType: "struct IStakingModule.RedelegationEntry[]", - name: "", - type: "tuple[]", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "srcValidator", - type: "string", - }, - { - internalType: "string", - name: "dstValidator", - type: "string", - }, - ], - name: "getRedelegations", - outputs: [ - { - components: [ - { - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - { - internalType: "string", - name: "completionTime", - type: "string", - }, - { - internalType: "uint256", - name: "initialBalance", - type: "uint256", - }, - { - internalType: "uint256", - name: "sharesDst", - type: "uint256", - }, - { - internalType: "uint64", - name: "unbondingId", - type: "uint64", - }, - ], - internalType: "struct IStakingModule.RedelegationEntry[]", - name: "", - type: "tuple[]", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "validatorAddress", - type: "string", - }, - ], - name: "getUnbondingDelegation", - outputs: [ - { - components: [ - { - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - { - internalType: "string", - name: "completionTime", - type: "string", - }, - { - internalType: "uint256", - name: "initialBalance", - type: "uint256", - }, - { - internalType: "uint256", - name: "balance", - type: "uint256", - }, - { - internalType: "uint64", - name: "unbondingId", - type: "uint64", - }, - ], - internalType: "struct IStakingModule.UnbondingDelegationEntry[]", - name: "", - type: "tuple[]", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "validatorAddress", - type: "address", - }, - ], - name: "getUnbondingDelegation", - outputs: [ - { - components: [ - { - internalType: "int64", - name: "creationHeight", - type: "int64", - }, - { - internalType: "string", - name: "completionTime", - type: "string", - }, - { - internalType: "uint256", - name: "initialBalance", - type: "uint256", - }, - { - internalType: "uint256", - name: "balance", - type: "uint256", - }, - { - internalType: "uint64", - name: "unbondingId", - type: "uint64", - }, - ], - internalType: "struct IStakingModule.UnbondingDelegationEntry[]", - name: "", - type: "tuple[]", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "validatorAddress", - type: "address", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "undelegate", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "validatorAddress", - type: "string", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "undelegate", - outputs: [], - stateMutability: "payable", - type: "function", - }, -]; - -export default STAKING_ABI; -``` - -after creating `src/abi/IStakingModule.abi.js` your file tree should look like this: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -### Styling & Populating The Homepage - -Now that we have a base skeleton for our dApp, we can start adding some styling and content. -Lets start by adding some basic styling and positioning to our homepage. We want to -hover the Rainbowkit `ConnectButton` in the top right and centre our action items. - -In our `src/pages/index.tsx` file, we still have the default template content. -Lets replace this with the following: - -```tsx -import { ConnectButton } from "@rainbow-me/rainbowkit"; -import { Flex, Box, Text, Link } from "@chakra-ui/react"; -import React from "react"; -import Staking from "../components/Staking"; - -function Page() { - return ( - - - {/* Rainbow Kit Connect Button floating top right of the screen */} - - - Polaris Ethereum Staking Precompile Example - - Ensure you have a Local{" "} - - Polaris Ethereum Node running. - - - - - To learn more about Polaris Ethereum please reference our{" "} - - docs - - - - ); -} - -export default Page; -``` - -Note how we are missing a `components/Staking` component. We will add this in the next step. - -### Creating the Staking Component & Adding Functionality - -Now that we have our homepage styled, we can start adding some functionality to our dApp. - -### Creating `components/Staking.tsx` - -Under the `src/components` folder, delete the following files: - -- `Account.tsx` -- `index.ts` - -Under the `src/components` folder, create a new file called `Staking.tsx`. This will be our main component for staking. - -Your folder structure should look like this: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -### Adding the Functionality to the Staking Component - -Now we can finally add functionality to `Staking.tsx`. The following -is a component that will do the following: - -- Query the Staking precompile for a list of active validators and select the first Open -- Query the Staking precompile for the current delegated amount of the connected wallet to the selected validator. -- Prepare & Send a write transaction to the Staking precompile to delegate the entered amount of tokens to the selected validator. - -For more information, please refer to the comments in the code below. - -Below is the code for the `Staking.tsx` component: - -```tsx -import React from "react"; -import { useMemo, useState } from "react"; -import { Flex, Box, Text, Input, Button } from "@chakra-ui/react"; -import { - useContractWrite, - usePrepareContractWrite, - useContractRead, - useAccount, - Address, -} from "wagmi"; -import STAKING_ABI from "../abi/IStakingModule.abi"; -import formatToBaseUnit from "../utils/formatToBaseUnit"; -import { getHexEllipsis } from "../utils/getEvmEllipsis"; -import formatFromBaseUnit from "../utils/formatFromBaseUnit"; -import BigNumber from "bignumber.js"; - -// Default Address of the Staking Precompile Contract on Polaris. -// More information here: TODO: Add link to docs -const STAKING_PRECOMPILE_ADDRESS = "0xd9A998CaC66092748FfEc7cFBD155Aae1737C2fF"; - -const Staking = () => { - // State that holds the selected cosmos Hex Validator Address - const [validator_address, setValidatorAddress] = useState< - Address | undefined - >(undefined); - - // State that holds the amount of tBera the connected account has delegated to the selected validator - const [delegated_amount, setDelegatedAmount] = useState( - undefined - ); - - // State that tracks values of the input field - const [input_amount, setInputAmount] = useState(""); - - // Returns the address of the connected wallet. - const { address } = useAccount(); - - // Query the Staking Precompile for the active validators, returns an array of addresses. - const { data: rawValidators } = useContractRead({ - address: STAKING_PRECOMPILE_ADDRESS, - abi: STAKING_ABI, - functionName: "getActiveValidators", - }); - - // UseMemo will trigger this function when the value of rawValidators changes. It will set the state variable - // validator_address to the first raw validator address in the array. This is a lazy way to "select" a validator. - useMemo(() => { - if (rawValidators) { - const validator: Address = (rawValidators as any)[0] as Address; - setValidatorAddress(validator); - } - }, [rawValidators]); - - // Query the Staking Precompile for the amount of tBera delegated to the selected validator from the - // connected wallet address. Returns a string or undefined. - const { data: rawDelegation } = useContractRead({ - address: STAKING_PRECOMPILE_ADDRESS, - abi: STAKING_ABI, - functionName: "getDelegation(address,address)", - args: [address, validator_address], - watch: true, - }); - - // UseMemo will trigger this function when the value of rawDelegation changes. It will set the state variable - // delegated_amount to the amount of tBera delegated to the selected validator. - useMemo(() => { - if (rawDelegation) { - const castedDelegation = rawDelegation as BigNumber; - const parsedDelegation = formatFromBaseUnit( - castedDelegation.toString(), - 18 - ).toString(); - setDelegatedAmount(parsedDelegation); - } - }, [rawDelegation]); - - // Prepares a payload for writing a delegate transaction to the Staking Precompile contract. - // passed in arguments: - // validator_address: Address of the validator to delegate to - // formatToBaseUnit(input_amount, 18) a formatted value of the amount to delegate to the selected validator - // this payload will be used later to call the Staking Precompile contract's delegate function when the button is clicked. - const { config } = usePrepareContractWrite({ - address: STAKING_PRECOMPILE_ADDRESS, - abi: STAKING_ABI, - functionName: "delegate", - args: [validator_address as Address, formatToBaseUnit(input_amount, 18)], - }); - - // When the button is clicked, it will call the Staking Precompile contract's delegate function. - // on Error, will log the error to the console. - const { write } = useContractWrite({ - ...config, - onError(error) { - console.log("Error", error); - }, - }); - - return ( - - - Validator Address: - - {validator_address ? getHexEllipsis(validator_address) : ""} - - - - Delegated Amount: - {delegated_amount ? delegated_amount : "0"} tBera - - - { - setInputAmount(e.target.value); - }} - /> - - - - ); -}; -export default Staking; -``` - -### Run the Application - -Now that we have created the Staking component, we can run the application and test it out! - -Run the following command to run the application in development mode. - -`yarn dev` - -This will open a browser window at `http://localhost:3000/` and you should see the following: - -![](/staking-example.png) - -### Conclusion - -Congratulations! You have now created a staking application using the EVM! You can now delegate your tBera to a validator and earn rewards! -Prior to Polaris Ethereum's precompiled contracts, the UX of this task would be more complicated and foreign as it involves -many moving parts and having to use Cosmos through Metamask. Now, with the Staking precompile, we can enjoy interacting with -Cosmos through an EVM native experience! - -You can view this example and others like it on our examples repository on Github [here](https://github.com/berachain/polaris-examples) - -

      o29ByXN9lw-UZ?)Tb1^?HUH@@0o7X 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�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°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⪼|`_{fXVV{&P0iiXsAaR7_(v&?yV$t$Jn9$3Z6J ze^q@Yk-mcIpx^SC>NH66PB5YW{CRb`o#;wpOw?*Mcn~;ViR`@#Wh7Ct;LH?`q;;xp)-A%3UZSx7)_9PJ8%)UswZjs2Q`*u-48lyWrwWyv?DaPgHA! z68RlqSc2zA@T)aQX#hHU#ubY!_mX+;onR8Tr%;Tn>@}`gti6i{Zw5B#cg8V+G3#hY zukG2|YJF|JwxfBgEknRwK;PtOyrh^wJrx8Y3s`U-3!~=a=pZGbIrx_X6iQe^bhRlp zyZk%}eP2s|aMM!&Z-R`V{UaEx29rizl7`3N?UVmkf^;c_L?GrOqXX8zrNe&p4_~*+ zSq=8858Pt$xp=71o?3K|Ac%g7=N8*veEe^r0ebEEB~JoVRjek+6ASR>P==T8SiU{_ z&=ZybpB5EHFowm@^n4UE*d5i^mm`1NZM9P>kg4VpTBaB0cX+hPE4Axi{RVsUo8C;% zDsTiynetp|NPB+48!0)=0AY}(ycsZH0gLfQV1YG2H?k`$ELzQTyuL>8_L_yP2Hgx_ z_gwKI$i~-QO?2$Gtc-hCpE1j>`0z(<$%@tX)o*{xy1^CMC=d4aGxy-g?B{&bC$+f`^dtC@0%R_S~ zuLfazzAyZ3C_gLZh&*$Oa&0dz(5(RNr{V&eGIxQsErlRq?Br=L zR|~sVARQs(xaCQjU;+U#X_u{EXPt0t?|kS1>%g^2Ye$<^v52igV@1~C+K6b(1rN$f zFr~W7DnAS1cL=x+%skUk?U$8|1mo|1_q*-xyYF_F`BEHM{McjG%J^xsaQ6I#wsn1@ zz5eR!ZTqgBXmOR>x4!#bi$TDM*&?l73Ft!$eQiMG5~ipm*ZLT<4SQSd{^c*)o6kDS zVow*_NLi;Pr!c-5@SSS%%jVGC!5m=YQd&19*u-cgVZO^Pkj97qr(6o^txY2vYqZR7 z`ty(5$iT2I`Pq-H1?86i{n*Fs9sm4AE39e20|9R_r`W?=l#m09@43sCJ@gx^#O=u+ z{{GaL_1I?)Y=~bn?`58ccsldmseIl|sDdB;UyHRP{C@Sj-(l5fo(be@4Fa!$Z}Ny0 z^QMpgIc~3Z*^Xsv?d~70M+-k;pZ$wVZD~jAQ zqC;-_qDb(PC_otHTNlg^m|`&q6OjaRB{i%Vb`U4g1jMDhg&^P`flG1kl5YF2AN<1J z_Q!R$00FV^@h$JHwSW1?4Ypufm0d9(iv^5LB-|DelqKOg?UwPz=p^zgB2KNC&Z->E z3Ya2ndUUCYND9dk$@4r3`KMBFI`KO7@Py-C5lNJ#?)AFrB8&K@Ll%cneD3LX`_cE; zuqGw!kKZ|$^)_A4R1Hrbe#d&?mUm9GC!fG-d*?RWy`_n`Z`Hs$8wBPk;Lkb0Bmp+( zA>2>wq7=ww+?EoTHWql~y=Nu=XGIG$VE57kO!rHC+WHJ8* z)}zp=*(kJRBPhD}hu^Xh+YCBzLAQI?hyHw_btcv)O(trK1O z+=?y4KHtKIG6(uI4)2&vmKa*86s(DC-kb@o{@17;IEBx{quvZ%mS)~l*uv>^~_Ky-!9Gqz6Lu5NQXmgnK~MLoTZ&oK&}jJ)`^j3oRDM zGS;49ETzw5ShuMQHf?US*>mvx@~W%tzK8C!irgCZIf8Ziia*tJgmqa9ikU@aw!@iGlc@~ppR%D)eHMh?}hg>zd5$^RDXnU6CNGMDChC@ z+o!CF-M7yR!41`Wd`mQ6fFX@xYQ8xm6}VCg-p9HC0eT#Pj;yn_qa3TAzcv0x-rPb( zbbTKxQs`VvWGP`Q1$mR3$^!4nO|=9vLnHloEx^hgD~Z1TPGYX3xINs@{6<-huxV~y zF}}#-dX+iO$2H^AnVs%|!|Z|Ci`I|5x#IDKShIH7;GSS!B{6~+W(|~;P9S^LoD6tR z;TjmwAps<3u4xiXD}~rZ&mz#vvK$wx@q=FBzHr{Qo!jlMU)^K1Rk#T)l(pa>g7mmm zV=z)vS%pB0xSR-3C0I~ip(71yqhc(M>+ybs=;Dtlv_c00cC9&sw4tByfxGtLSr3nb zlklLEWb((^dnr~gtz%6_c@P1NyANi$)lu#GZ6vK>Vc#A}`7+oMKT9}q%_x1A(WLr2J^Tj`5z1b`)+$>#4#$CXhUi4q!P3eK?HpJW1$D{M$Y8DVGRHT=2w_~H z*qgNFk3H>5Z{mC;rI>;uPAwLQzyA97t!~X)yZk+WfKUd-1Ly%aYfXWv;Jtq8P5!ra z^N$WFNEct@KuP1`0H6nb|kcl)fd|h?|GNq_0Rufh1g^c z^$sBL0>}AmBM18UU^I}*&|fe!J!>CVdFhbi>9iXz32y3Fb!99Q{UbKGWd|0%!~zFL z>ic6&%0sJzaOV*49h+J$M8SXUeTDb2K;OL^`W-9+(1vq8z!d4y1>2dp#P`hH%f!b{ zLxQVBr#Zfaf0aO4YJ{*MBe(%q9~R;Yy%?{&`DG>4NeVc)fChimBYOyw_Zbx!*}02( zif|4gV=f_O<>5C>YS%%AIDGA>kJ?|yMU0YUs1)=UhA4u0=0Sl%lVGgmh9yV{6SQUZ z{ZH5s{HV5q5&Q6M|Ad!c@H=87(aWrmR)}KQ2=2Ef8;W7XvU}$aTfJt5omn#(c&@T# zOP@mNzu7Lo`f9dP!TwU)5(zE0Zfx{Dzxqa7t;~K`9gj3Q3PcGH27~n^1}$1!VUc2B zE{r!$|I3=5k)!V5G@2q9jTCURx{ATcvW5$1yI^%TxaSpFx7cVKyh`}6of|h<+qT`d z3Yk>*p1rchL`aOn9bQ*r>@USDRp_!L{1|qMK8`+~v@1oPs3@CMjh8D4wMed{2J1!e zB3!p~%Qo0IdQ0FO9R1=H`iX#~vRL19fd}!0WenM|s@eYcBY$hx-TeDD{neL)1My#= zkWwjZkWB}D`ZHg&|NP3Aap~V_^UkccX*26=)~uQKz3+YBI*?yxVfhtkQ$7-;DwhC(riwhsH~UoTC~qLA zwZQ@6DC9_wCD7vBx^*i;Z#0$=Sj)wetiG2rN#FG58(iQjB2~od8MDr`JglMb{K;Kb zSv{Fahg%8=&f3~qi|&b_RlD0pa4TL|gllmu)^{OP4};k2du{OZA^h8kdoGvk5~8cD zb^#}yBEnI54q(l=7a#r-qKg3|L2poUvb0x$up0IUl!-8hlnhdCqgSsvP2T{ zP`lF1(Qv$i;~=}G1Z^JxxGN@CS`P#@ux+z0y2Kt>wbt^;qaC3_7K?NhuCpizx4#-h zC#xONb}_ZEhl#@m|KNs}Jk2Li@>2 ze(Kto+BhZHY^lE~%3~`i_Pj^{!MxnxN0{U}lZtG0TdU1PAb-J>YKuIcw9YHKEHYVG z{^gmn{FH0BkfX?i1e@tdR*rSkzPEk)Gq}Ks*rPwX! zJO~*WEu(DILzk{ns2J>}eG;NTAj=)R1bCF@^-EP*mnUr!+T5F8xiter~ zJeusXJ$r}jmUm1>F)r8$pR|oRU9p#>2js12YJJQ$?d`EgzyAY!{m1{#y0GNVW_FoZe<5lQjJtsVrP%w`?L&SaK_pN}2I@YEAn zF#HpK2=ah)YSI2S+q?cbd-f+kw92A9`{u2GYOlOx_Sm<|J996P@!(~3s!g%lDT{`m z{_1(#+1kgZuo#+JVV&fj5(}7&uGKh6P!}?}54NdRzVfh?nSv1$S_zQ8m>iiYq}9WE zMG*L9rh{4gh*sVo9AtifEazz<`k`~lgdOjrOaLGExvvakcSc}>l(7ezHFGxfRuSI7 zYGG^yv1qnDPiG*BL!c=E(1C_$Q76BXkx*i1PgIH5aXg&fx z!%maT!Pk_nkTV(6K3(YPGw*>AE>3sH%clnxT)y1;9-fUN34(Jh6O(-jlt=q~F3Ih# z#+=#V4Gx8$;w6Q!5FULFF)y_t3D?d*afm!b+$i~a0ENP}a*eVtYC}-lz5^o?x$k5? ziU*Uo3Befaz?m~DYKu3Ej)CgUA*YJI&`l$9fV#H%EN8Zn^76O0ii(RtZ0v4;`t z${x zx+*g+sWkSNQ9Rw{PpP(+dC zV~Xl?F@>grpewwauFSzL~cPf(o-D1pVz9b*-$q6#fQAQOsv4S|kvj4{xSD8@E_V5*{@$8AFgJ zOUjXcLZC7i_B`@}-L-t9z3zQCTi#`75L+7B$SwFOK!v1+!3F6JH<<+K%}w94p6<3I zZe7dPN8#DO#TJ}*s}&W@^6#BLLOHpY&aoU~bPu)mqp&O9a!@c7OA0muaeBJYiSQBh zn|~)|Y1%5ef#!GuBaaBY_8_IcZ}_!^rR7$@A52~=tANi>9x@ckN6wS(JvI?fceQL^Gj1-a zXi(oQYwg)fNS3`QyRc`XpR|W6L`L<{1NT|w4X?B6@);;YMXaop5WOfD1fxbhWbsSd zyQRgC!Iht;e$u^`c{ex@;cwq3YKs*7hoJ>xxb=>oQRRw0J_ss=itB59zmEHust1ii zj?VJq^D@FT*0x!~(b$w4%Ux7ssA<^T zb?A&I?(svKW#X4X_i9dQe!&3(cu*x_Pn1B(0B_c;5l?>iZrin{$u4^TA6a}lp;>r0 zhxwDmx)OzW`|w9UVT!0Ry_SI zVMf8<42ImJ3pzm<4);dLOa&GYOI&W%MOSt%-DvIPx#3s8!HOKY9dqT>~b090Cb=f!s755^gd1WzcEi{ zLUOvL`=soI)Phn;&m3s|tKa}!K%>8=6J)_Rej|9E&LGSvB;3Nh_Pq|D1jmqg)b~0M z@=4c4->a;QqQ_@&9IqyU==Y#$BE}3R=m^M1Z1c7jYeo}dD)G)2oqvJNojb=?u3YKD zTh+H_@?>|zz6$H}7KGvwe(%DhwVkIIrJnHUh|N_g1u)nzwGT0w^`gJv~;!ChvAL;0^y~ObpgXPL=US)f*!hh(I zhuLgF#6ma?p{1q`k~EfETU&ix#hg<{8y-klE5~I!wp$(jP>z*p-ZB>K zQlwOvD635`w1#3AoGE*1w=zkCB+L-f7le;8@4A>%Z~NTm5O(z1dg6jK zy|~nV`GtSB8$R)O#LbyujgSAvzWvF+L%Ac%KKPy~R#%%AD4yEAak};sdtguNu>Jk# zR#`Td50~Hg`&Kn?K7@oc^>`CF0nMTP2CgNp!=&0N_Tg`S$-e&K_t}osE9@sfUSmTo zBlg}~=GpA(VXIC``x6GjB=B!vfCnW5$%6RJ?S^>4^~_K^a}2sSoA}w$JOu2xJ|AHh zq79Y8O9b&aIoC!bBWa_8LZ;V8d}rr9%d(XBat9%h@VGbHH)7eWXK}Oxvl9~jC_ge0 zULynHTxbN#25;x0<=IY#%eM~OU;pcO?CcB5?6V&{*VmnlVtsu+b54={;@2(qgI{d5 zkG-WHS7U6_Mc~8WQ2X-9CzrO3b`M)WTCxc=WJlmYsZ3wV$2TQ2`;+Ee8zH$2(xye$ zG7;)80YJO}t>32y?OWe@-Wuw2?6OPnDkI-Or_<>kpa7y0W3@ zL$Z|1_=%f5l_WPJ|%&G?@5B&0Ss_Hs>O(;I*FF$*I`7kmAUWAJogU{@T0mN zO$r6Aq7jvx_UBZJ2TF02va~OeqO6kE9nq3X>htveBlte7ul6-+cOOhK?W3g3JauXV zmW7?Z{|Vpo{?_{Ji<@Wb?N@s;+oaqzM%o|kFa5S@_y8}2HDm4t-4WjKwuEiYY}eQe z`<$fbZz#A9gk3@3Yc!OP@(jl#+=Gg-BJW{Jvf$24Vc8)@3!jNOqolp4QdrlqbB(+1 z^P{$g^TeA;9YW^B2o`OcBO3EOLPbc)Zx0NZox8iNz7_^(s?N$cOxnLGsmvhsnE-NK5jUYIWA~eS@5X#y;9>=e%r`-kSa{V_96LOSy$lCWj9)nMLv9^zZV<*Nj_smcK z_*k6ohL>j##9%hYFxSZ$hCd=EGLyr@W2Dx@5I;${oPl}|uQRk($X6^I9a$baYw{ zJSrKG#Bebh&BFMjq5w}a1+eC`JbtPK!oqO_@N`Bnnh`H*00jXtPT5&G9&tpaiaF9s z9mBTk{s~M+YkjUNiC3m^5+01x2VH&rSk11%4fQUot*(KgU1kOF_44uhsP%OchCRMD zV@;MQp%=@2#l)3i&&Y5euJs`u8HYIhj|g#Q6H;vA1F_=$L&xXhs03?CX154t)Ru59 z&~><+h~7~O_qgdc`-;F5tDww+HsL&(70 zR+fE<2v@}fvpk4k@+u*26wed`y9ewCU;3)ey!2eV{Eu$1*i?AHA{BEPD-H@{ zAn&qdJZ6#Jx@R$h^zSgYR*kE}p)Pv52vhOw$Lzw3zJ-vg!e4g-3g*@1+4Z)K{PMC3 z;61Co0X?NNjp>mj-;Y4YDGY-w-N%v|qzpm59k_4T?!mnR>fSLX$0aF+sp^Khz@lH} z`KTmq=U&33axHJUvIy5+m%^bzgLObS!r$f?o{#eGC^$ZNpdMlFa50Qx^DqW{NsRJ_ z2m9Ht_1ZA_PJ3s0&?u^?wyL@YE5UO~0X%&vPDNq}&zXZYmDN73VgD-cz1s8I4S{!ElUn10&VD+w1%wlqHB*Ha!=hg7h3|)n?q|GZQIHX zw(Qa8fp_*5bY27)$;V)GBqc2EB%XS#9?#O0IfAlDHp&HVeU6AnHwOsQEL!K(P4o_Z zDb%Ui6O1PUYUUk&m@Nk$@%Cp|+nt;L(Qf?GU!mZT8z?Mj9}j<5@O9}cuC~qVSJ|C+ z-evdw`d26*q6kBW6qOd(wAnN4GL&Q1!S~8%O^|VKVPPpA#D?tR3$L=b-SiHG=QZAa zg53z^VLj%GJ%i1y_RtT%V_P0wVK{u}592Zk%&Dw|{qo45S_@}uzUs=yI|DX^6GWe= zT{tbX)xTbBkK^%WBtLFfqA+sSYp)@+37D=3_(n-23SJ*(J;?zEFFxx`oAoyzx3Ast zV|#kVa%j<*E6{jBsWLK(qJ;5joCnhV21`!?jxU;g>+KnzhhK#VkGAYLg@jc2aO_$W zBIBdX{59aT@q{InrFP}yLb!`L1{RVF_Ynl>)z#IuaZ|HB`|J|ii6HsSZ@$r)H)86D zXbG7y+YzivSX_fE_IBb)i0L3ftTy(Ft36{{gA34QQLa=3GM7+SsfIEn=q@gvWNpNH z$V_tiu09o^tD}hHZelSgZwZQJbuO*ZUdkDve7S+|X0cpUzlbCjO1 zxe!5SA7_>soCiRfUpmR!S&$+UG-5Gch+FsqEi4ccc?~eLwl=y(s4Tg=_I6ky%!VAO z6pwQYQRN7T#Z;S^Y1O4Rxu*lmy;d|Nam^=}P`F8P(BhkH`rQSb%z%E%48{UC9Jnr# z`zbNn)lT)#J;W$hU*)1OFb zeA7>R^qw<5d8ewT+TG@>oxT0U)dKKx*~k^Zs2*aX55V-<%7Xe#%Qm}i+Ej#S%u>be z6HWDUP2ejDntkEc9MoW)z`1y0yHOPnHhPM6=8Rq%Bb40QIc)Fz>_6JQwGH;@H@_cDwPy5m5Z?#pAJ!1DfzKKv3 zJM68mnQb>-GSkj#D252{g?Srj`^j=tY>Mb81OiRehEVyBvbhtpH&%!?Hw3KQ93>$Z z<&Is9r4g9F6B9<`7H3ZpVUy+Y%sH1vcvOOOTr^9gSo~w1>FZz~vzBmE^I3GOTr;a8 zOPhx5M-MdG^5#|cj$3BfISXM_YvJ8bDn^L>q4&+UPyhXsXt7>m?|L<{mtcAYTRZxR z&twH3gE=<36PH@0tf?im8)ZJK#q(g!?I-J#mJ*)c?-&cC?gU# z^vv@wvZ~o<+K^~PO+qR9P|2{KUKBqPbV}Y^2(8tPQen&5b+&f#!*>6-za`{gxBUL4 z_9t(<1m-IYzf{9g&2u4rQ1O@NuNaY<=WQK*b_dqyTN^v@4wCO$(ypaMvqg7GI4Jjo zQfN>po6Mv!bK07G#JCdX%}m0lA)L5E4x_7-bn}zo%}{{p_k&yfs=RO{#y@d^K6T2B zlj?8Kp3ME!SXM9Li5U3m5B=rSmukDGkg=JnOK4>>26L&l7P6NSZ7vJ8JMOrHjkw~i zCS1AIl@L<>AFfm3_wsn6Bo9@YDNYPc2?d-{F9ETSQRW*b|GD5J88VTNvASd9k;+H? zr@nMXZbsf=|ArQaVLyl8r-m!zi~XNU(B&R)QedF@q$J4pJjqBjid+jSDSwSs56rCQ zmJYl7ffwx0ZhocDn#|eYFQ?{OpoGFagTBv-;KmV;AJ{EfFIJRY?d{fy#h5H3WX&eQ z`Y=NC!9Hj%n9Fi&ta;|`qK*PrDG`q;hy(?l{!NX|>5e#lJrJVCqOwyIf$pgHW;{+ueDqJBBd-W9reus7EDQ8 z6w8t`3EwI&fxwu0^$hheuZL}rbww6tviegV!maX7;q#pa?Xyeq3Z{j@L5saaFE?y^ zh#&nXKjHoGdgAe5&nM=kYrQ|->&JLHLz_N5SDUnc=AyWlgMwWT3Q6n0fra@6&iB%q zEdEz6VG^@>A2LEZmRLLTEqtvgeUO_YCb#k@Px5dV-5PU^7Jckq1cbMFHv*$w^>esj zZ58gO3alr%%}oi*dBKJA>VvRtA|dp zbOfac4^aXMA-HAp4-N@~6S6+wWq0T5^fR>q@F*k}uDn0UFyKTc_08&KFWTg*7vTvm z=r@s)C8dja@;xs)zp%v0s}Y((r3)T~hU9*E<&)1^IXFZXtWn2JK@Y3nmE_u4UM?mL zM{WD!7wsF5JYm=0^hTTdw(AkNFdhZq80Lk>Dl=77U4c@;74V^3agY6=H8&ofRk{R1 z-CgYEdYZ=s=mLcZLY+h&^Ncw=EX8Y|kt#7Y2RRGtth;;ORa8yjL>Bv%1jQx|a|pi=TMP3Ry4bU30y4 zbq*31rP6cu&!x1%|K}DzVWlwbRK8#%gG+ z`~Dy^$Bg#)ZFLAqaG(_SOL(rkdWB{JV~jIAN4d4nu0cS01p6Z}1cqKC_C18mzqcQw&MV<{)fvE3{nR4u4D!Q!PH6~tC;u$GepZeJg$(GCh$tCE<5mRtz(_yV&bW92q1M(ObVM$fNUK+0 z?Zjt4f@^77G~hx!9b#03xm+L#c*JazC3sz3oo(E>$yTgb&V2@R-#)Z}_PFr9iC7?F zyyeruveHORvOt&Rxl(ZXu7yO5AX&uq^fdc331*ahW56P`bLTFPAKry9U&43MuR|QO zMGz~UM1Kll%4)HXg=7nE8D>}4pe=&?M1cU{NmUkT4kN^yC^J8HXrvL2VUPZtYnIt2F+i1g8Cp7eX!V8lT> zLvcRE;EVH}7&$6KiVj+^&H@;ye8%m+_->ekD!SUPte9w>n<+=6b-uvoo{l<37E1zz+yz{+Q zI=#v|S&X$gjmUpsg~q1AbREKFnKn0rXliDb%(b_E?n}1rM|as{Km4X0-m~BS>A%+7 zV^7uDZI{om_uP7+O)W*!8OtYG4PqNWY$#127H{$sL}ki+RCGbBEX5IW%PNWmJOejk zzAqKSR}(HVC%K5|AgsLsW#V~3WWeZ1msX!%1Hb823FQYNnB;O-H(+sqi}?WRK``Hs zBEUC)iALd?UAFS79Q)WOml1a`+IS|f$0{#5Rg`Dh?QffFU-{3qws>ZlU9${J5VDo> zU7RY6FsJ0LIiN|Bhlg^dA+0m*0_4^u&q!U@_)F+(4T4v~;526v|qg}*+u==(Z4t(kaiEp>;j=Mdp%(Dd!a-DrDL z0|N9WHgl~ui1s~DYqJ(Fx9a69Y}SeuR(;V$Y*eOs?6VB4umtB$6GEFEZD_N`{d?@- zrcKuL+#Wl$Z8Q1rvx@8zyYtPjvYW4(Y8ALv3vCew5z`@+#(y~uZ4jLO;*qWP;1j!y zXcuhmWW@k}b*+SGY=@x*rA!*pM8_gA^;Hn0YiyE}1dw8ANf}3QBIO9BF;}*nC-=4R zS4etaDICLn9aR@sR872-{OrX(kLn*){K%17tOUhjIVP>Z263nzn@Y3pr0n z(KXJ4xvOn^x~*CBOMAl`-e9};?||7a>%_!*$Q#k7TFYKku6kA})fFJ(QkyqtE_*pF zRI~@s{1{6U$7<~MIdr1F)%fce&L>nawHqfq)Ur4Jf(ymP97x=Y#x3Q8vve8qcHRMb zY8_U&>FHQFs6B~l3Es6=)rd-QZ5XQ}xo*vbR%vbTw+EisYQJ^!3Y%S7=I=>p7Sb^L zOSxK?YxWqz^8u6=y9rIv(oye1a}h}rnoF=Cp`S<~x{*C$%!>2zl!lOAbs0uELH7ko z%3gc;&_|)H-}K`v{qdUt0W)S+TFsm)Td)MT=7e+$&I;gK0t^`uNf0nT zQ&g*Q2pp?s;zVnsc&|h7rLKSb>m#5=`CgK3t#w`9dx^W9B=lBxXOQCYuJNxE6C^KB z>$rH-$@J9tYiH|BLOdA;NdBEBAs>8Qr7;}A`Si-`9Y)oEK&cC8hH5*lwYJ{!F-w#; zBz+a;HmCG;)W4``AkfIxd1@p>ornqpP_c^ig0Zt zE)`DWo2W=t{dtq-sdz}Uumo4q)^iND$VaHNv$5Utbehl`^}N|m`ht2)^5!8=JYMGQI^U(fPUS@|8z6wW3a4zFUc}SA= zdK|^_LF5U87}WK4_29V{nh_!G)T&CGGGn?GAWx75dj=BQ$cr2D2J%smMJ3h4&p0`9 z@PJhy<15U})z+DZ+Go7*N&Oa5R4eb2h*upRa2y|d?>+jIe!=r&(UMslqvtX#wrG-AAl;(>8nb!G~<#jR??rC64D~88JywLxxXu zp3f6mpeGma1)YUIkq4frg^^Oex0IZtmQB2h3iQ5AlpUVyGWsI%V3Gr)I@aZ>@2YK? z^yw5lyc~t^dEeiD&2IbRM_9|?Y0wWy!RX5&`|Y>A%bs}r*R~SZ=q-4Yka2ENX@x!c zMEg5BY>5{aSz@ZlvUXf_kUC zd1jaS#G{R|pn+mQ)&q9&#TVPOS(QGh4?Xy(J@Uw75S_&C#=^U&hnPShr;ele%txpz zqP!Qa3t6NK;b%dtN}#M5+ErDvtsX|`h7B8R@#1B+V8H?gjks>SFDvwVtfGBW4^dEv z+i_`#YVvk4Hgtk^q`<#g((Hc}lxo zeA{idYs*F}Eg~j68m`>~Xt=UirITNb#VrlON<9kt2BzY+pfKMK$i+Qz$cGT5%T=;a zUqN1xb#`D~&Ur5VUz}6yF5LSNg3HQAF50DFAPaN}&(rDOJTzyeK|6p}nPRBRB45e{ zN>XAFu`hwq5JLT7-pQt4D`!u$&g{-e(+q9u0+az1d%XvOrJVRsy?x!dm8q3DIa%>F3OcT+pCO`nU%A7O=dCUA`9 z`9u=1bF?3P0fidy8N{6M1U{0M;bj=C+${{&lNy2}m3&w`!mh z1TMZ10V~i{(H0l{2J8r%ieSG6!ea4dm)ZSyeaqJU&rfXq&PEviEw<*_T6@dQOYDxD ziRDUQ@@#OCu#_tni5Uf<;pkV$T#6mwT?wOQ!95}YIh1Pztzt6x0_xwW|0IA{z1;m4 zFZp_q5H4uZcP(FE!S$`MFa#8HU>H2Vw>8`T;veosnW@9x@vfP6@yaqMI)$o_vlOey zv2@dQ752!34fZEre$amS)wkJd)$(ETL{G|adFworA3moCAd!NT(HuRyToR8L|EK*_! zISX(X)Y3L!4?S6L_ujV)3)F7bd5C@He|L8rCAo<4A!`=7%zMo(Y|OC4j~Xyu2d~&G ze_r$+c(HJhPqzfTX`|KMjM5$(2zhcSN2^t7#qtvS#K-5_=MbVl`rW&2+tW|lqRX$e zxfd=24v9Up&@Qu;nmxpcDbopohlkhklehI>mJx6(ci|LV#QNgr*KP_h1E+;7Pu(Rh`~IBuzip+ds)l7@p3c*?Inwf zH(Yz8-G1$>tZKSK40YQ*_dI7SFDbS~^DBK?MM5_ke5SkSQ2BH4DA*Cst!wPCAN*oH zN|izvu&(H1hbu=?Om*IqRh8U9OLX6?!a){n?yzUz#@Q?(B!sR3{BYMT_ zkvNTTxnD%@1==<|Kc4k@c>Yo!SD?^w#~pVNa;ltmMb`PMQ?zFhBR_Jx9qJkOG~rrI zfAy2B=%n1*-P2{i|NalTBCHgYBbSfhdQD2D#BMrVhhy|m#)>V(XWQ)i2j6ps2Yw8T zP_)uccyx|kh~{u+=L=b{Kp!8sjFa!DvA&MLn7K9n?f6;5cvW%o$RPT|UAp^xL*UIi zy=60&5kFgJAOGOZz8}{3dfs>x%SH%3FocWeu2yUBYO-!D&WBLi7=e&V!$L>MOe3r$ z>yk{-2f&Lg%=?JHmy3`_g`yh+JSELZmBBX&2=nhJ`;!W5lf84Id(W5uiM~A>&&I}R zlFZJuZIfhq&fN+qf0S zE)hDE4Gw!9DHrfQZP)TDVTy!W64C^V+(>8<<)!jN-HxeOg5F8RrlMn{*f1_|57kQJ>IDXyvy#S7NHz`b*_e~@Lh#vzS$FFw>~qj?$D zHw_O9H_pTQJc51ab-{V9-FNp3&`%nl#AIMmm4HPqY{kO{LSBIKqAW9*_uHP>XsdO} zehY_i9vQ2&^y0BHr&rxh&E&?HJ_Lm6KHGZ#uid~PFDnwD>g92%#(0fYb14i<0Go}l zHJ$k~+Bjru{_%TO`J*T8%Gcd!IoB^W^g%7XoV?gmrR89Jg}5@&8_EGMuybtg{P+7$ zWp#D#LIB*!@j0v`BL#$<+?iHfwt`R-2$+S(n12dcI!e6ujsvamr3mjQ zbC?z5HCFD&rZ567EK?^y`4p8EP-#wOND;bYR_MY9!pp*2vNo5SZOsFE z$kB)5oe%UO_~L!VGarI4-%YqydCAb+DJ1T48SdMQQMegKHjpEuI(ar>Zsp*iqLK>b@<1CnZ|W%3J>WL)IIhR~($6RRGd>y@a9^VhxBIs-PP6v}VGqWKPgh<3m^f)@JtNWJYn++@X7)s%quFZ!epC9*jE zT8_cv%$YNN9enW7N9-az*r^_Z7qAuWM(KWkBcAFAd4eXnlzjA5FfJHOt}BkI4Mi>yk)=bqnK&$i9%yujGbQv(ICKBvYFJMFRF0{KmtS_rv zWGF<=zP_Lg5W};BP!wH3ym(r}dG@lIHebKD-x75)hD*X_kT&p8qW!&a$VkVK?c1`` za>pkjrJj0nVLAP&zI0fkGJ-5u7H55wj3tNA4PF7>k>ZCGr1E5(%Te+eJ(jDGO&`dfHRU3)rWpd6|s>l@Epd4 z%T``(OIKWsf!6>^DzmH~FF%_%8Y5;Ky?hXS!hG3bGXg| z#}5Jv8gs!~rUIgq+(QbmQaGG#od?_PXMg{nHf4E@-TH+Op~#VKG5GgFLK3gaM*ffA z`)=?}w>^byvsZLe7D9RQl~J&FnCHqT2^th=OWa91sM5*Fkry|PA&i9lX>ioQ@h<|h z;jurLRh;-ox<664u6qo=KaZa2JzaaE9wD#s+>_1{uO;1yK0D6+)b~`jQf^)hq=HZv z%Y>V5y3s18loS71ZlBVuqI`<2UAG7Tiw$) zAw_*KaZsF~O=_nIEDL{JC}(S19_{z3W!(LgQje6cQ0Cn z(}{o8?t*;@vE_!vCj2}4X+4jcQ&p6+jcual60wa9kX}tNzyqkI>bsY%LwH`QGMV?}c zgJRChlm(9Xx352E4P9vBPn&9Ye*BY05Dwpr213TE6mK03_5X>E^nMhB0_|E6ZzxCI z@#mkk8{hI~`|&@2)%LDki%a(o+jig?`}ZGhw71^8*xr1@BC9Tim`9^lmf9i=xkXI`M)bVk3nuh;W&EOn^=H%VOaHjX8g@NrPw(4fYroGN1{Sp;6thqpUTyy*9M@bL&>Yr%rea>+ z2r=-8O9c#8%`3HwmlxX=7Z=#ie|p3Y*DIvVh;_6dvO7QcDqFmCmTg?W&+h%{20OAx z77ySFO@PD{(}q!-13i$H%hk&+vKueG!j{in2o09c{9sO?P?7^3lpkMck3D_JcJA6_ zue)^xf-2fc-A+h?ig2u$Ixe^bCuqO#xHzfp+T2Ou zAnGqYNZyvJ`+26FIVqyEBLytalY3f2llwV!pCzVIYLY^g!xG~UDS+z8~9{jdf3S;<4<2JMCHa9N1~U^E+>|4}S1Y;EMG?%}y%E+ZKUj z$lmuSV;7tZpyZLsUQF)QHf-2pKm6ej?LF^#r_G-~-)Z@%f1)-B;?um4@f?DS@NlOO z4KPTA=w#-)ToETg&F8*@1pVW%mS~dpnA-P^!$|@j1c>Ax1ExHMX8HXvjO3Mg z9%5Ij%;Xf{1rUu=;<4`?{5+Zq{+J48qL>E4ai+Kwpk)=KJ)IQ3vte??Q853(PoK1f z^GfWsw=5@5$8xkUj`GVPV*R$F0F6uMG#IdAF6y5Or>q!sPe?-uEW#XhVY)~k-ccV3 z_H|Uo_Pu;Y>cwq|Jo_E(IqLi<%^5LqMH>rVMxa|FxEY^YCtJIK z8}z>TPRZA)uz1Wf%Jz36^Z}lT<}20me8M^y>Z0%6po0B^&O`pm`Rd)U9)|Bu_jtVg zPdC5k`!2an$?pasdh&DaXOwhLN(-Xzgw|E(Q4CyUP2PZqqmGU?3`&Zv6eE&hJa9^= zAj@+Zr1&ZWUUlVTT|*ZMfrkDhr>Klccw$lCB*rg#i?R~~>DQctyQ3szj4%_yp7@MQ zu5aMo#G`Zk(B8hz%BEaHEtw};M)jl5Gv}6DX-&CZdc}OZL~PYg<`m(W4sY9GP4E-9 zJigIzQpz@+y({xgyf%gLlmV24L}Y?MOH_b!23%O#(BEM<-SI9Lo-sg)gu80oiXT33 zf4Fg$jv4@smp3Re9?9c(mWr7q8}aBe;3EvTLYv^iU4{%0zX(9!FTkVCLg-vrFprz6 zqxMx%|8D*DvxpEQ#a8uSYKkB_x*NHWR@;#8F)>E5#4S(Dw}FGLcHcL?W9@en&-aZt z+M;V$S=LPh8i!%LG}@qTzu#nZ~Q!FBwsei>o>`Z@OC?MH?xQXH4kh2v{J)=@&XAV7~{ zsHG&uVYzUZ;*R4F-jfyjF#CgEtb&J;AM_)Wa6>sPSc|YapNc%7w4xlNxtz$&G%&({ zep&F%(yWB=Pz+r(izr*64+k1CRHVH01l|h$>6Lg9{~W(ujj4VbL5W?(GZ^;R)6q>0 zAoGL2>$Yx(uP8++wTOnYNJ<*hiIL-+Syk{8R#@$xohT)DCq88_kcJ`^S2CI%#po~t z#3lZOayT1Fd26pwgwbL;GL#WQCn>RQX566x9AtqM;5Al=+)E8%kn~SOA`)I}OSCVK zzLhskU$^$?|mPz&wb%j_K8n?#P0g`cWuYc{mfCb{kt3N(7^^k}ggAaYw zDr+L#C)|h>nz=`t8%OO|fAufcx^=G=4-sBQ{AtRJN>8n6be-6GdV42-W8&S2&X{=5 zWjrX`pcVqIh+E70J@)N8|I*(6*^gTmdrErSov3K!1#2Jwz#rIG?)ndV_~~b@pT=cK z7@yj4i6RovGO@tpT?IlZ`FX}9#M0Pv3Kc=%W&7BIOtoN;G)GP*@i~)#spQAx^XOg{ zZfn9j%1@I~R%qco2<&|(`dyx@m2SvNA8g3R^A&Tw@arNLe@6R99o6bC132 zUGK4@SPm(rL)b+1iXmKY!~HnwX(U-h=OXNF#d`emE3UA$&pc&w=FA4jhVAKRp0ULU z&`Zn8oY|!BW$`?K`+gSs4inuCDa|DPv%?5GD!@z+Cv8r z8W-WhAX(1AO^(=$Pr_TQ6C&e>k46q@)j{I%bGM85P5~TT?k%}Wc3qbysHo5y>Tql+pVa$2%Lh}8N&RiKjdN`MhX40 zbm>xSYHIXzS$9d8t-jay%CD}mp2?f$mi)yqiKS_G`0!y{h$2IK=TW!jpTA%({SdSI zh6aR5#V9gN$Ax<*$Q%fz?P;_}F29*Ygg<7&vze&tYPZELXn(cUnU(7$jr_|e&8q=v zj`Ud5t{uPz{UC}1CZU9OqrxyRljJQCu`Ep_EmR0Z*4=-<^+Di$_zx~TFIp)rV0Wbk zh`P%at|gR_bxm(S8k)ebHo@88$sB&NViZF}-{`%JglCJ?#%kdbs?i*F9HbYx;e<>A z=j*wqhK|Qe!dxdxW8WSJteo+Cq72U9**E`dkL}q`eAT>6`@}cChKtY|TTe(1Ay$F> zNhSJI;Vu+^PXt=YvK976|Mp+jux*R|?CbwxJJ&vIdz-rKGv9pH{^q;u?dk>7?G4vo zXxCr4$V#&Nh|kweS!k4lgVd4aNn&hd zl$*XECBD|ah7tRVFaOdW-_~w#e%n-g#~oEC)x6`rME-yGcbC`)@7!pg`Nl)`=|5a$ z*co4bQ9TY3g01AF%hXosIyvc`A?3lxQqYQAV@GhP z_&Q2yV#M$ZB=P{2iH+u2eQmG(^64FR@7k@l^PoJMU=hqZfoEX)jd=G+Fa_G5{IfZB z`K4?EPbQ^SFnp8Jws1T3sQL3sI{h9p;x*ccTRj3J?XJJz8R)`rsAzgNJJE(Wee_n=m#AYkG5u37w0gV>UAb z5SDdKAshYWi>BG-mlWFUD&P+Q6zB|NW+4TTQ8pSsy{F#lY7w5}?rJ2hANpj(9(#DL zEm&M)x8642R$o9_Lg>=UR+^ItLNI>%1WD6Hl4{R8W;R8JVO#r z7jsz>;SLleA#bcaf0pfJbG_%lz4q=quCt0V+-5@FMAqoc5#AOJ7E7whUo~f}l|SCYoG0!Ub@N^)HkRY3uzdi~q^m zqrTQpN#U2s$TvXYo`YFZo~dhI#P2Tcg%jE&-U!yWeXS1v&BnL`Y1(1pX5v1`0Ea%$(Iw$F!pBI zR#Q_0{6;a^rMUb`I{6+DjGZXCk{U0B81!Kdh;fme+yb2;*Ii*Afrl7tuuj2E2zA&v zDg;+9t|rrCxa0&s$(_66Sk~hu;v088YMuS9cJ<}ugcrj#bN^BQR)Tb8DwF2InllB+kP3@ahL6x7JqWdC^qWUE_NAIPM&3Jo~b2;|>c;BVoPyI6L z3$9A5Hq~G;VI&{5iYwx*q~-ayd`ms&iPI zJa#u-F4{%W5Rh3}`jj~~{}O(@b45S&_`#!Ai-mgAfm(ZN%>xL3@hF9KGaG(sjx5np zrgxXiWI706u55OtRln*Q_OJA_OcE36;J$B#)0f3j^g<@h8*X8rQdx>T2Do9|6wkV_ zxSCL&D|jPnzc7&Kk%3KnY#3g><`m9m*xM_YlS_ixA$ZQ2*$H?2SUi`*BiwZN1GfHq z_uKNTSJ~oMU1`}D&X3|bV}Pd!dMf+*OVL}@5y86zdoFxuj5q)29v7ZxvF}S0ui4)M zMmRe9qRGdlLB@wZ@f8Oqr;OXQzl*WQ)G^dfQ(~y08R%kGbCIyI=K1L-&2`CL3zh<}Nf1jv9z9H7(AP=m#AjCO+D?`!DJh?n zC%VkVD~A+LzVkaDvp6vi^IWrXt;WeOW6}+O)**CxWZF};GwRqwt#0ujhqb~HaZRxU= zcGIn|L4gOp1pONA$1)E&;^}9X(TKM5o*$LQ%4ELgxJG*xUZvs$EVuF z;~~M~Xf{bRO2Tnxm;pIMAoSP2{&mDM-(n9w_#oe;<5sZBX3Ut%!d+@LHPyCz?>@_u zfR+tF7KmR$cWL<_*uUSdzy5lA=9y=0=B!!dn_)+e9I=Ck4!Naz147%`vuFF}K^q8t zUtC=5medjgtB$IN7)r;a@hvZr*Cu=<4rx6j*ovOxuDGg0cArJXwM=y zpGCzvRt~a}>vomZ(b3_=_~F_nG?s9KhgE$ZljiAXpS4w2UFpK*euVr}(eCN&9Iz=^ zly7GN>jg1pu!;>b2^32~^vx&;O3M(_9#8{t;cgVtj%qZ(S~^;+3D@W)Soe2AFb@$M zBRgM$Z`?;9*jE4b!KfYr$w+vvy7l(;;?BJQAs~ntLSOO9-NilqJgwzu-hHhVQBFQg9K{+PfpE=L zTqt6)cjIE!E&G{7O(;#w+*x56S2Rt)yPnZ`{%6_JVn(gO_HWs0G5R$fjmR{#h(-{| zDsKJDCq>FB(BX{hsMW4}()Mk7#(w*aCBThV?ei=7LIKqz^eEisi~$I8Z6FkbWC%h% zla)@m!QF3h9O8LkAiSilO~Gd`bX_)W?X+L5X|to?_cy%%4{ZgmmV3cT>NpW?-iaqs z32oM-Ev|3?=p?X?Cnkmp^ckytKDb6bzAYt3(t>N!B_6TJbFM#6c`&GhUSQuT3zb_i0?s<9XZ$sDUL>U zY_PzxMrNR0I~8|vh1TAE)CSnuNh$BF1D)DDw~ZEJqK-aStDdZ|4FGZxGi-CYGRZM*t~W@ zL*)=2=b|MS+nOgj?PGs&x4rXi*Vs+hu*vp*7#~utGfqEK&$A&!AJ6%PKNB6O`b+36 zy!!RK9wT} zX~tejj1CXQk$6dUOiro!shs4L`aJpBi*=q{2Zg#ABJ{-&UZ<2IA<1}uMRigeQtw4i z)~d);lXv$-%^R>3e*pJ^YEoW{JcjNMG?A7E6B5UmTtD6(ij zacoN7yzAR&+>d?lrN5)SpvFJ+x6ZZq6N78)o@0s0>l$E3Fy;cNBsiY@3&E+_Ovx$g z-vGbv(Jbk4sE1o0q}-1HRzRu0n5Enl9YfN)+N-%WJo`F@x)8@K9i~w_j5bl>3O!Sb zB}m=jW_$Fp%~oAA8>J`fLE$A&HU(jeD{V5az3{r4+FIN@WEVWY{G5E~)ocVIU}We-=eLT^Wv?2>BpgGT zy4FwQ6Vk+Y#_#KS%+2n=>ns69B^cWjm)W8#cZE;Si(_AJw{2dJr<)5u1K$wqUz$h{ zQFr$A?8(&^@?s?~YD&K3@mK=(^rBLmw}g;SLs#16ANp+@s%^8j9lNaMP`zz?Y@KyT zfQ*1ciUxgYgLdr=H(Pok@QXq)VCrPWFzkZIuyf6` zw(0S8mNuo(R^GbW=3aV%6)dduv2@-M-vlE*Cvi1A`YDO-aef?mGx)-#JO2CUwi}^Y zDelz8FA=^CAE@mKQ1Q>7_m9StvIgmde)fGCGiM+$gojQi1gchoqLEg7E$UtFM#3(M zkWWALc?@Gh;~_h##@H_873#lp*G@vQ_E|?)hvni`Vt^23AxTOgL2jHpBtVxt>kRg^ zZh_7^G>jYogr=^+;10!g+{MdlneWYgSB{jkkkfHO?1KY zuSn0=SB$Ob3F=b9q*YAnp?%Hv+}fe6BI%{{?(+~X$9!!}n zS-#RPxqOx7PM^v*vYG*}I522Jk`F&$!$ngFX)s}io7!3PP(Z<@{n<#Wu8PXWIJXA_ z)~QPupoGKRoD#FjnU~s(S6ynW``&E>8+X{A_1o;J2OhC@!crBcP@${1F<+*TD48M8PqmSA0H(zbp7qN~3T)v+h?X{b3yw!ej-%o7r+-fZ6 zw^&~{JS>WqlKWr&<>ygWB0MtlGlMp2jD}m{_R!z{r?qU^r8<%T$l{K6YNXsZ} zye+3!|Koink8Rq+%8!mKSwe;uAZv|v4cNCo_hq}|&pvF$s~1}qYp{|8|Gk{P=eOTx zyLa!mPVh&cuLU$Rv2P8PJujtU0hy?=S(4T!B`ru=AOxn7YZA_QMKoOaE;=8-?(ZML zbt6cGNv`;O5}->PRtrm4cbCmTvnhsk+Tp`>2)Daz!^U-X=uoNMe*0VOHLrP%ZT`Ez zcdfTf5Vn{_%}vd|@z}rr0K{y}RHe)#qaL5X;X`>3?fvP z?bBz};O1tE6%`Q!g!Z*{62l$jp~Xhu&YVficU+<<)i>08-)Ym-%c7QtfZ}j1uIo#S zZPhhbA>8Rj$XsZR2%_gtud*XgKV{`~wp`>&8389NOsL3B6t^7K3USju#Mmst-TR^T z7V86%*W+?s3tR#NoXM)IkyA?C0!zwDu-0f~7E;+K;#MRW);LcqZ2Xfnk8yKv_ zwRmdGBs7<>yR5VfMlo)7VHQhxt})c6O=HrDAUKaW?B(TUxTkNV4-vxSwpoJrLo6C{ zSyfzIik2L%VQ7npCv8YZu)H3oj=hvDH#HJoWwSVS(g*#`WmeRV7E{IPBQ5XnbL>w| zb%8CrAj7upK4K4i>pOPC2kx{!kah-Rh|MOoojB*tvFe{fb-)!cRWoDxHj2lHhyLr| zZLn>hz446~JH9xDj9#)=HNTQm@&*+&0i2^v%R7V2JqZjXz|7>MEO3B?=psHvlzFIy zT1t*^BfJj*5~ugI=`-|yRRefW=T>%;fqs_kJLL`kR_MXC*~C+q+DVQ-$I zrri$lbOA(hS;+`m|GidSSq9@c---)zFsLRT4ll_HQpAABjnFj#2GYH=Ae+J4BQQKR z9q6_HAcofuf4$9KeQSl?`R=)vmlH9n&Q_mZeR-KZ^>nlS!?!lu!s%tUawe{!g&z{u z;BxB~xo(XJq){$2P4WH;XWCi^k#_rWJO)9=If!S~M{ zV+i@Dr~7AOm5-ZCph=GVLh6IiC8_tH=lXan6e!}Able^g0}#k5>9gkIZ(C~{N{GZA z>^elanf5`#&CF(QR^pMT0^EunrEfxup*xrXz-FJ^&7mCFU#DJ%u{ls>yO{S)UHj48 z?Xa~#b!>c#1j!ttHAS83UuW`SDws*o}EE` znQh=X3?cAV#5`i#kcq+#tQK2Xvk*bmqxQwG-eVLrU^6S2l~uHk zqNUGP3c_vAkA7DlD*IEJBU=Ab1<=X$b8BrX-Hc+>cYpG%J-YS~G$go`xP4MImp3M% zp{Pvmlb`7AkOIR$T>DYJezeVSX z0F_*1r^9fRJXDs%+LMV+A4BQmC&x5H%E#L4Tz2UtcEuH|P&RIbp6_QLB8wmxeuKRe zz8MX~LgKCzMaGgg&up9IvQR9<;|V#&-v13a32=9^O$|yT=4_ z;Z&dhDHBoanv%99TEnz9dOpQ);UlFN z0(1jh37?JCF@X+4xvBNmyZY`#Yn0POPIrMz6K(hJ7z3HpiGEQZNr4p9ApHa=6ZAjn9`M4sQqLhu}>>`6xx#LIEj|h1`NS2*i=Fs~zId@yOXGHXvh8g)yZQ~d z@4g(q=_SmcJm*`gE~>M1G}R@(L~`_6@+S>`whMx!Acg|$j0-A=Q$1=IeDuu-)Vr*C z*CA`EYqF=FA*9J0Z(>^!+7}&b4}KSVmi|1+c1wxwWKu?EWKo}}DOQCDK%mn^Yh~aH zT!v;ZR1%EI0=*M{N$yDX808p)*PDYku>8Cl-iYALJD28fdHgBD$6;HIFilfHf~RCS zk9HR0HI9YJz%A_`GBiMAN&6gVN(Kzc06QfV`v?Iybfm{N|L4za-M4;vE}&{xdUG?|C`OdZdpr?DC3Z)kNHM$ul$63!$Q z7ZzKaVr|n+1yvZNQ4xWbvQ_){?cEIyk#~tq+^%=i4|IecV(g*!qCJst0rCUz%K$Ob zhXh|JzPcNCgjiW9L&Whs)DM5H=V&WlY9(q-v!aS}tC>H?_oijgi+KoPXR`;MS~}Hc zBWIZk&%e33+1i>L;ioYWh$qjybvUA@a1e*0$PIxvcPvz4O4kkR;{=c}m1RRuup=2lF2uW!X!nq6EOa%%?BFg$$>ACdiyp zZso-YYGI@dVT=@Ss<#dIH=v00kmcdk_}ZJUCm#C(%a}2ZMKcXqPP6UYd)QW7aU*?7 zpJQQWNIMi)l`IoO- zL0&oZ!k{Y%$a-J+Zu9qlX?3)r6c5ITtzCGoI>`7Uf@o%*cqo1m!OPf#V=H@7ccS)0 zuR3m{Q9i>dL!JzzP?bwZ$Ef2EKKoUB$7lY;a#qd3T|IR{Aw!&o*@W}`==(olU-x-sQ<<$^P5G1s_p9Lt5$$Rm_ zrFP)nUlFqbqzKkgj9wmLe8@)t9j87yGeDYh<6g?0`LfgkG3_BufOD_Vz+tMc<2ALF6T!T2p$H@` z985ibuK73&;XJ5#M4T5CupwYkcqxSF2{54+FJ9Wdv&;V9Zy&a;+q!HPF@gW^^M7UY z5E!N7U7>%d7rZ6RmsrG8sx?`C9Zu4o zy4tF*x(=5>eRgom7ThHrw2t~ZYd&i6!kyVk5VTN4#J1?$wsHI-OMqx6I8+T#3C zn_59gk&0}a1+K3Ihn3(aH;4LW^R8SFDUOuL(uS@PyX&5<_QMBuTh~aJ{qH|n0Pa3X zm*gpJKAFqkd)Hk1-~a15`|GbgZvXVjtF5A#FeGqaycYp7xpdd0)-=wfjsa8nMCU4k zSKbF7O94*nhTvBpIFn3^JV-|HDi0Xgf+Fl1#Ui-Rwi9<}!@f4FZ6Cq?bfazFegq5P zsMd0YmQz%2)925%8S`qalC^5)(hF_TrI*7f%7P&@f->9#_T+rvVy)~7V?DZERnS`_Y&=PYaPbhHOn>bT07_)03p#W)P?W!@jQh{-(fzvznp=jHRn{4 z2;K?l6u+PF?XefGXfWZn_p0AfKM9tS;Y)4sjaK3tt(oEZglxEozU6z-*}?&=r>XA- zSPkF$nj9`TW{R1@EQ!`?pDkQRYj;pyiS|#?N0HwQz7Wrpu9CHn_P^>y#n+W3krV@$ zFI$R267ft?9G3;n-o1OR5&CG_)akSjJV|JbmcyfV_g(vO6F9?`;3-QXc5nn~dDiY2rWpPhRh{-AJ*~jov0$79KII-F!fAW%_2V6QP z45#g`Kuq05H;lCem14J<6e%^=|Ry= z3Q8Uqm<3ehB-hJXtk?2pq;PN*c(5$Mk}s1rH=Q*nzfkOP_MnNSx4$pVg<(>h5G^oF zJ^fK){q%JUm`YO!4ut6W@-Rubj$#-K(9T!4vlg=Nuercxu(!V8Z8s>iES-wc6Js5H zC_e37oS*$vSiEFHrgD$nP>-P%yzn86jH1d0-r;>ahlJvoN>jd4}-w7R33&?Z@HW+5CG1wI5Hhw1LhG_~ZmdJny4E_Lw8^#s`?_ za>JdR)UuW%cu_;~)o}$CkX5{fCE7o7jVwX@t2AkpfG=dwGsK=j61Wj)f9-*K+vV91 zMXWx07(Scm&}*+*&73N=RjaSC`3o0X6`p0wFwQIBJ?WNcW~ltxh0`rG@|N7ei`pvkYy_7HDaWhW^JAM7#cJKG@_P&sUNu2&^V-Irk>)#UL z5!DlKpAs7P)iopLXRjh)ISWZ`SCZ^dp*8a=SqG$35VGe5_ZE@I;4;`*g=IE-)>Zbq z*Ir=*&+N9xzVkC{*iBeKln!#)zh$yE4-XBv;(*5M^iou-#PIl7TA6CEEXo0H^7MPeR_{Q{{5fZ zEGxuZzx%S?U3PFob^A#>6+isECQZ@DbzOb9*HMY`1IfU%$MvB zk{FHv06+jqL_t(NfBz}VUNObNR4i-sQ|z(@3+(1=uC-sTT?cLxUnuHj(MUQMemSp` z+!8C%KNC_|6vF**)Jw@ic6Dlu$(4^VqN8KbHgDZ(hwF;bY(s#HpgRVZ$^w`&_$d|Q zeq;fNS_~Okipvsb)v8svH29Sxt~f46v{BGEJqXjAu%NE0s#2*gylw}1$xS;FTYpdW z)I0sSLT^BONZMBt`f7tQ9l^So2?q}BM{5fP6wf3q&&kcU3zvy-KogXD6k=Je`ba=r zfTn&E3v>}$aQpV{vy0|Uv#T$;)V}af-?Z)lh-zuDpbgp4#)6mDYljDkg+hJh?j%32 z0A|G$YijNWtN|1Ua^?=FhYlRTHPHskN4a28(NagqGp9_qj&++X4EDJxvy0B}VxO6DUpU*CSfW=@@kTV33=g8WsF z6e7K~wcTB==M@xL^_*%uitt^Q^ICNC5qM`3mp!u32RTdV4Phrsb@itNGisx>vLry4 zP~HXVC>G?=Z;E>#r(egCU#&@A_4_^m!z$PMQ817lE;{Y0F|Sc!^@Hhr8<2Xnuzr!jo`)GDk<#j9VHAJf=AALZmDP z(uyOffz@t$+ov`5kKcZl#$w%u zc6;iHX4{D1{LqoO&AD*7z5RcE$}YTcrRC9Cf?mas8-*|tYyd9DByU1$eFQ8}fFk*{ z2{?+9lKPq2J3jNcHDXrlwP7sN(L5GR&$@7#RbR9m!2lMjXykU))w*SRXLFO)ZhOw^ zP#Ah_58)wp)OtPiRUUnlj|FTg8UT%h!Ay}U`qZGki%zp9IA^Y{l zTD#%qQhWPvUjR;rLVE#I87`@R_uZBDr7!NcuYUJA`^yhqN$3wcQ0}N9G_o02jkOF7 z($e{(zU6+@DI9259Q@IPM)45Vpna^Ng9x{~LCHP*y1L>hp!FgQ?BLjA2amE=b`IjH zWWbKp9kq`3enXMa%TP0mD`(l9fcw=3)cgVqsTs;P1WKRC1VBkqlmQa z>E~?gx=hO)m||7LHAL;t8JiN2%A1W8{CuMzb?ZJcAPc|+Sys#jq#KuyBfZ16{=qIt z4qVBxDQfRPnFnEeEDQH?eMfCjo_e62ve@j!@Rl-!1!h)OiHGLcyS>M@Z#rx@TyqKd zCf5qF+KhpJdb@h96K_fVc=qYzC<{*sd6oK57IX_G7_f3zUV!DfJO*V!H;EP=jDuHT zLMUv_0P912+mIb;ueF&|3UE>1WA!LIj)F5UTrkrX&SwLdv|t7S+E@proCs`_-w%&< zZ~fLowqsud_&>v%TDt6lMKkR371h+^TP_ zi@7X@PEtx0phk@5@fW1@;N@uips%%GI46?0l$tnP5r`iEq z1Lg)eAEua??aeJ2HV5V5tlSu3HG0u@C+rlkC`)$Dr5s$bh(1tCXP?#2e9*kfz_qNH z52F&qB;iMu*~dDoBte7rHDVV1CMCg;(|$MFN<_&A=cRuSGOQjy(C13UdoFc<6OL zS{iOrv*AH$T~!(SR2V+s5WOGP^KnXFcgK_Sti~@{0wQ`R+)5RUg*77JMZK4d8{KM} zdqH3yo&`LZ`dxTGlc zq`Zd_KKH}#O_@5-3e{ufjzUAG5kl`d+@Yt72IPOt!^n|Cfa$TfPwgb^5n|$r`$#x; zA`@A0!~FqKiJny|OV6=E_HeDw;e^NTs({^ylhO?zRX*B zXBAIGm?4zqneitX2ZnnmI;s|8GcCDvrNfG@9jc=0d0+H&93{3g^Any+ehva}_Nr%+ z6jnfrs&OQuS@UqSPk~`-qM~WFYFoedXLOwQv#wW?XpF;-&LR6jG0v~{ zN8&&6$#CbebslN9BL1C?6u?a7o~oIh7ZT>rOi5P%RCMUke7*cj`Blt-XShuH}YbI3_b4B@{Yh5M>o9QWRw1IX0`v z8aH8xieZ7jOuI#z00>GYApjHM00pF|#%Lw-2`h&&^t zF-PSIWVoF*wzG%zPPIJ!r1oe|t4*PuBfxDs#-AB85%#M?cqWikN;I805M8rfvRED# z(>E-%n=bp99e(IpyXULlvI^#m;)!R2Z{m#OnWRL~Q6EwP_a;qWkHT+_?`^QG#VDZo zOIXd9&160A;F@ryC?n+1j=%WK|8eCMDa&i#D^`8Hw$Z-%`Mt3GDCF95Mv>? z?P{ZVVk4YKW39}`YH=n_Ip$lHr7m_nld|v6f*#2m8L|p^)%Sei%Xa&h{>(DxfD6>; z{9wV^op;<}zaosaIzaPFcw7qnk|&+_0(4n(2)Rs_bU!?ss6{{ifj`$Q#R9#*U)_=B z*5a+i|0%}Zcs2}4nfzzrLPAN_A&RLj;kYztWzN5J@e=#~4}Rptu`Dc#5atfj$)%+w zXz3mC@8-;z>n_~u>gqiH`TqU;BWnzx?a3#eq@2i_T#JJ85V0yonk=gYtP3w$h}+Mj z#JJc#U!5k3ty9eR>;+^K_9p)ZZ?0JQG&gdD&N=87WO;ntTmJXpa2+^;& z=yKPYJ3wsoXE1rc<;)P6chWiZM@aCkZ>hqye~$g%e>!Nt`s%;hQ$PB--SCcg*tIv` zVrdBRdYOBJdQrqG$Xpvd5qtgv4m1YINmmi64Y5U^YU3vF23lNvV=gsQE_5C(w)&c{ zi2dPbiR?6IRqRP8y-U7g?qxWU%UB9NAjW!jY`1^^)Sp^GalgIwO>==Efc-p5>Wh$c zo_w828<9skk)pQyxPsdrFrhrdq=1Cou=MzuG?cSg7w3ZI6J=^2f-O1d=Li?guzuDgOu|KuNi{@AbTJIwg zr~+d25dWlLF?kVU5T_>9myh^n*xJFvgXAT=Amtr*=j(tP0c!-aQ63_S2lxpG=Rn-1 zv(`x4e>ym-=DJrwfDBqX%0KOg_S=zt`>lT0E^9n^$Xc6Qt+AcmmkOn>PImB}h`+3? zTE=<^!P&6=pFdw#MG)u#KZ~f8f5r7S|6+vqSm&q1tjpl1jcbIL$O9q?eQ|I(aK^u$7S_$}yC}o# z4?j3>Y^^%GJ@ZO#FNYq8=C0;>qBV(QR!+LDTwP&(v1WVV$4?{h?zCyeGjN}V8%h|^ zkc-xXHgpznXecm_j!3gtIGMGRb+Z=%bwAqS1qcXBr%Zzm1ZEZb0ftdi!x8JnRUN*H zVJv7vj2M_*bPi!1jzWXVjaNQuvQIp;+ol&(W8FT)W=gTV*&IS=X^zS5R9=1&G>wGl z1MUS$Es#dPtUo02rl^F)cji6*y`b0>SX*0u*|#bwL@lTZEs(cqsd$C<{FP%szYk**(_O(Pak@w9{WvTlCx+j^Gh= zi>#|pcm|jCFox9!eF$wQGPJ`0>&wZL=;F!V^0k0xvO;GNX@``IdyCCXN^p3aunKPJ`RV63LM@ z3_Px}$bgCC%4a<9Mkro{vPc1RIOHJTBLqj;E?=&@*`M^HP^^@PrH{N)2_6DWj50?A z$05lZghFqL4KpN*E%ms+uXnK{EgC;mqBQ*DjvE!fbx;3s%z zXGK#>N$^xtC?_1F?9qkd5uTx7t z{&n~+d>*ck|Hb4_lD|_Q=sMgRJ8Gj6mKL%J_mguB0&oA`H#W&nC!Pxr>%9~8xvbIy zz83D++8`yh=TAu$1;mk2{kT`sqya zIGt~Mp~riBpSHTgPxJwKI0!0 z+xU&dS@>2Z=M#tg*(aW|iw52a0THH@-2KmW`p`)_gy+Luqj-{h(h4B<(}A;47Nqu> zrG%hIinvOV(h28IYjK0qT;v1_pC|7-nb0fg2w3Fz$O$3N-3>hNjl!QPM))TthIkJ= z8sm9r`j1mnUernc3B9GcjwehM7pgFc}(?+a9QI3)KF_ai3*gun$ z4xWe)_Sr?(Ul}!kqEwE^RIL+B@zSfF6Tfj~O^sWR3nM8^gc1=8Jn0?%*cy1SQ1yk} ztxL&(9RyaPQSaz)7W=HI)~pqY0UlwWtal{@7HV)MC-9bp`${9kh1XsrjXlDsJh>6$ zIvZGV@2Al#XXUS&m1vTxF`mNB#GOf4iet-#`XMCE5cQ{IE5iteGpjMeq!ZK~>PMCF z^t0-LDdy{W6SWCC=+-cLx3#^$P;Zp%G@K&gPPgZbP4hz z?N=y3Fw;`k7

      pu+ITu~>H^AZMVQpdwWT~4|FZD~ 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 Njp=5bE-=_<_$J-NL`V!e;`>s20 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≠r2M=hErV z{Im4nkNp+&nzD<4ta@Cf<33kci>cq|MiO@gVg%I}k4U#HeuY8iDQT{M zEB9U(gBu_orR28{#3gfLX5+a_t3R^|)t%iLU7 z!8M9Y{P7_+u7pD>M{k=PL$4FeL8f_IX9U{xBb1q^?&sc>2HUTui__;&k{n5WSSu~C_L+w%vCyQC0auT%Bx@l$I=}V2 zxiQwKlgO5PbO(F~;j6!UCO!M)eW{J~K?mLcEgxFTa?|p2hB@`zz+gK1#1aFwM0)w_ zSJDq`c?5y7$Q{gs@@erJ*#|zkhIVb-gn(=~?cR++Kn;1nMBV<}(~t0#w#NcsY4e-c z1B+Sa8}f9_pTBw~9eE7TO{;{jK7T3w%rTU*V?iF3SS1#(BnZ}p|KTG6KEno-YU<(g z`Jwc#&VJ4iBrbUFBHdn+r%(^ICdIcaob7!7Bb-%TeTcb&1aH1{CH>I%ZK)@X`;wpZ zVp*V^S^DD|=M*1%sBiJpOD|naKXCME+KA<^^{PVfI=FAPZT<&VzH3IwVd}<6>c!Y% zWjKEFS~|SFA0Z(E9h5#s5L~p%gpk|0N|*r#z#d0e9~4>?hWD=TQWBWZM>e*I}81E9iNdhWvf) z{Ppyq?FZmtNQ2j|gI`L^bdN7y?nF3Wf{bv(Mb*GJZ1p1d3keuEcgvSb}?9e`DrqzJum(I`E%*(FTb4bJ9;!7 zzV8SERo&JC6L@+z5H4N1a4t=ZjUrfoG<9+0(i`W_VnK?x6_hg_54ySSL2$37splBG z_imvMPe1uY+Piy4dif8&ihylOURd7)Jeo##{l4NF1l zIFBH>4JFZrW?;~O(gI+ZKrzL3#QaU1xbp0~)k5&5$W!LC|5|a)txNF+6cd>J68a`- z6ql==EtMyO)iSxoy9ID?Y;Ghy{^56}R?aP-M_5}d!*7vn%}>HW|BtfZf>W7|QLV%@>fyiV}rr@7&=XqiT z9C3|=u37nKH_3|;5UUvUxjhkVcxPQrlx3C&7Sl9CX09 zkQ>_F|4`JGD$+&+<#Df~MH2#$?k#B3j1ThSPD)&VTwA9h-kV=Pl^z1^6!2>WYF#!w z_(YQHwBFFRec$q^w9}&?ZbxUACtCfb6wQdh1^5Wqe_p^KqnD1zcS( zOr>`}{dD%Vjt*b?B>Dd&x9^;VqM!N)R6@*tnzz@8) z9`Uny?{ofhtq|XN} zw5uMJGu1;8AlBclbsuw#SU}st(ifVxJa^zJ*kd8aP-nfOF{;N5nx?=y`fQa#R`z8* zN*E_qFRX`a0F6wY-aq@>e9OJ?7ppU%kg>r9jGpWay<^ zS(Tm>4bCOXnp9A*-qIi|)y*14Wk1(Y3(W6&z$qcmQG{Y{p2Xg`*ZbS@-mGc4Lq>ibCQrN`@#O zQm%7rmdjd_YaagG2l6kJ@^I-irZ*U1u!SSVW*CEd@+c!h&sD~kmug>yyLfY@Z(V09 z<7=b*Mir@9B}d-~M;alT7>{Kc%9-Fm@L(vH^i558IU>b949ka|8j?3AZlrOD^B9`7 zS|-c*u}~`>S`$>zcl0%`hpIw{E1s(gh~Jr=)|xbV~|bZT54{(Ar|rDQy0;S1>jhWw9s)k##jNdk@HM-HB{8f z)tWsZMW$3Kf^{=^tqUtrFv;qIu!+A0H_7bMvaP8xD}76u z1Zc>6zSssfGM+_$x1nq}Om8j{6RRH^AG!o*`J%a>ZyQ#|TG_tnVfr@~smsx;mN&Ja zA7-(_`K9MyOT%Y57l&uNs)2>`Vjv%0$G7~>2fy<^=(R)4;F2PTCKNa##D|<`^@+jd zhK)hh(n(*p#m1w2^SZb&Car>b&owE+^Lo77-N%3qf}d-5yZG;XfBPU13ykOs`V9Y{of+3eW#jt3jy#%JdePAnb!;XUi?<##FcT&+TaEj&>&W5 zMsDb3L+QpE+ECIO)%5kndnAA7XLSfbzZB|71GzZOhx^Mhp!o9Z7t{TF`cfZOKuu_$ zwnL{M-VP)4^Z;IEMq*iz&mog0x26FY#XtLx|9<)_f8^OTa`M%5>NEc)9s1rsxq7+x z;;owD)h`i9RVpJRIrL|eK+E`JWh#Pk_r^+WD#n(Wv{N8t^46kn1 z%|nKK1J+1+mMFFIn}IpR;zZV)g3K1vyWR2o>LcK$WZ$AMqIH3HWxid$@pJ<`&wglf zhJ6u#D&97-I}6JN*6((OLR|Mlpa7dlyut9N%XY1$6}bD|JyQsK1wF9$UIfp~VEgdy z0T@SU)sjoYnxRDl*I3z8Oef6m^#u1Wu60a1aS7`hgy=3etgD`!Z1Yd{ta9S~Kugd3*1XrnD6y`z6k9AHu>AyG1tB9<{?B zhs{0I`mHwMn=U;V%30^*2nk2ip2z#s5B~5cQs>S#Jb0YJQvqk#VXgD>iIlz&tWd2RGlN}eVhfxuU|Nyo_TiP9kqFcbCb^;zmax6w;hG2Nz$&;k*nl5 z$pE^9u6Rr$1IPA!!|XI8JUAJl5>Y)ywJr zhq3^@%n75M_dYYgv3r~$*vy{hwgFhky0ZT-BM?0D-c39yifTy5Q4;8XhWt^&$OLaG zx7fx=00}XUsn0AHupRJk+C``p;p@1m-@fNCLh){3OFzN@OCb8KK<-d%V7_Ti{cTaZH6}W%ve4#Y;3@qzr7Va zx{(eIj;8Z-7eY`i4$2^X`NmlKi9LIQw#blO?C(`7Bx6u}q#2l~m+=zT1G6;G*HLib z@(C=(p5yqgX7`ZQ8Uf%eg@R8@Zx-+75JEd1dNy{aH`vp(z(Cx7WJkI>GnO{epp97D z&QFX6gK-fVi?)*a0-FW?bb0cV=m7X_pTj~-5ABSYZESn7hAJdM@*sW;xR zlJGE5Rzr|r`9NH6JZ+i?l{%i7^bShB>OqafS#yb+mSZWBTNS4??@-BYQ3X>|>!W zNpC@5F2;lqBd{v-H58=F#CP^^re6KAD}NhsIYXGAydhv#Pw$dw-;YJ6Ryo0 zDaL*<^z6AWHFdYAITRe$6966HCoTV3lBNcT_#B=Zx|quv--0K1A@2&vo>a^i`y2*k zD`xt-V{d7vFX_jif0Vy~i+oA3XRwPHGbb*knKv$_GtVFANRa2TibtuN2^#8%l8hqW zTwg9xMvUE?CU8q%J@}=JvbJjM3PC-qhA;_blDWp2bmWN#Iif7Xb{RJD(Amgw6L{ib z3719{7~8g}8M&`r^ePpq_iX;`T)%J)y8ZRha9!`96)xaB&v9%^*M*Lkj7iV$={Br8F@Un9^Q=sOflfRV<% zzVnS&bCAYpxayobGCaaj#lzG+V^q*YGSCRj`K1K=%-}p_{s!?j*4JD$GHZdbT22Ug z`5yfo)nxyHF+*{ePD;L+L;QG?GmC*h4XW4nv+H=*5bbTHG9UoR&{5GaliGigC;2J| zYk}5A9q310d^_(dtJ8a=w9h)qa|;7tJ}SivC3xOR!?Qvj-;L+Gf_MJeCs7~!ivNXH zJD&huK%&36Dvr6P>c;|4Yi6)X(JX%SRBHw73oZ3kES+RcqSq6TBvBn!+uV7T8LcPv zUYNz(n?}1;PK_wn=|$ONPlUY+Qj@HcTr(*+)~kqn;1XpL|u$W^m7hgI$Q3gfP-sE}ygEc2+PV*%hy zq)`S|PqVIta7je^5Zc-~G{*XP#*R=@bF!lYmp+$aR1Kh=Kp8Cv+|92D$D@E-`~ z+4qK}KF`nfUy*MfEs-u zppw9d`b6{V2^YbhVORfjC-*8YG@+&2guC7FY``WnMrDnGB0{qMh!CeNQw?HjkJy$?T{ ze)uo_bm~9$Xd0t$q5EN3A&Wz|bB;wdeH(Nw2vLpzUgSB5n-Fk2x*0`*?8Ngb;o>Un z`R^zWn%C%N#fOTD1U(|&0{H}8Auj(Txq@)VP&~wY*^INaw@6`B?ArMGU zs;bX@ET|u7lRrha4sl%!O(Dp2TPNatC!Z4w$ z?%mIbpH#|rsXVR%o?(XljNcS)8{9AXXBU0HxDRd94RQrrh5Dr*c*Xi2 z0a7n6_sM&B5JCF+$ux?)-6qbYY=k?Pg$d$zQ07vt>blyy6;Z0km0&1MtaaN>32lSe zu-;Nuj$`wNBGLvKW&Gm>euiKKPNm%s?Mm!Sl)=+_xuOm|BiY z*_Al4GB@|1m>Q;+-*_Ya#dl*_RSOEe$G}IGAl>r5Wu@;UNK=`@zB_uaSrY<4q#?ZiNO zV9(yw`;~m^A;tn_1bY=G*-IziNdNtjrS{s^X7IijMiC1P>I03bx}}~^xp(~`A3&?G<;rXBbKxefkU@9m;>GmGjy@F;tydFgVQXC% z$}KSaLi)hh;A=#z3S$)s}1r#LE8He*5M0>%aY*fqK%f0xI!k zWzYaea&Y89ylmYj*mm(l#-KrbnMS&G_Sz8c&HFI)V765l66Nqy2`O^6z*6E0B6zgZ zBsg~s#@@?syq-R}=RhbJ*)-uk3gdSY{NA={Bl(T;@)jLs=J-u@zoz?f-GzSum&=Cw zoPKg*I`#G99S;nFBF6Vc#Ht?i%N4(TGjF{pY7u=IPd&|BJJP1zThniRk>eX4e3-st z%uw$|Vp`8aSg@wm^85nI0{vYGxNF~4LY`0|LXQFb8|FN6nVF7{S;~dXu*b5-=ARP^ z_Ythwcj4~04+T?LJJ5WLL0G5Fkk=e*IIXm2;ls?amY$weuvV1{Tou5}HuZc^1^4YR zWGOCqf=z06tqAtJo}f;>{zkfTh2s`J@WF6jtAKihJqmI<6s9N04{LNhk!{(u zH9h*!(MU5(J3GMJ9ux>@TzI401U#EjN?;mHZ@&I&x=NZ8FTarb;2Cb;!g;zV*?Zpl zLbd+4-TuiqEE4*0aXui3M}j^>Up&lz zksmMZR`IYAC6I=F@8`yJ^tsA>5YLxB|ND5;$ZHJyFwVfO+Cgte8H;#cJ>A)5K0WXV zmgXdiHIn6qaun-6`a0fK0w~9v^Bm3uBL0p;dpVY63|vN7lN)$vMc*cN?imDl2%Tq6 zF~@T5(PGmnuj}ZeY4|JaKTaU{Qj{r(Z36@&{^;r3)MS011BT@7zVXlW~kK>GTc-O`0ceeLVJ zI|(s|RtY?&w9IQmQ=_T#(3aHp@S*7U2KFH2MrCG#!{SU^U4J4enuWa z2LJh2el^Yh+kb~35ThgZ;R-Mf=Iz*EYoAA4ts{ z)6mx2liE0%qYZC0&HYH*3rk+bfJMZ?t4iPf2+*I8+%0Eim>Rmov6W|$A2g-iPyBd% z*6^~~@lCA;@iuvdqdKRc)myf2!8-?@WTweh_~-8tC0D^KJ9;-77_Ph9)@eO_5mErh`u>5D;L zvz|(sPfDoI)%L}_ZD7orr~9;4))Xz^y`Fo7kzS8xD;U^j*Q>g5mj`cN9!Y4Mgi9NL zDiQXwADc#iJ%pDQh4jp3rTCchg^}^yFia~*rtKxv`&tO(XIe^GK!HA1Auad0Y0OLD zgdBole>NkiXfbXD=!0Pl-b~> zhCIelTGa3bNWll_h&WRy8+5WB%6MdL2*eewq_KK$Xhw!Nj$)%3%R`$%5wneV##7Ow z8y<~(fjQQ29+{+!MsSqbH}brjpIFq<7=r>s0XW0LZw3p-YeUx{bN~hcxL_3sB@{R8 zE*uO3qyF9ah9(xMtU<%7dwfnG`J8dIxdW|89J+&4YBo5ao6-DpaJcApqoa0!9XUQU zk%q3b8QDlZKoS`MZ6KWk*AN{Wcljqa1ilxU$fBTqZ1Sj-1I7>5RmP33EG8i?jUd`I z9k7K>(kx7|%?Q=zrl}uN6tzQ|Lvw-*$ToP;M0kWUMA7kNIfH>@6)4FTfF~<<82N0d&ib7i+xfGlX#13B{=pMYR~2U?XE%m z${@L2 zj93sTk3pFlEF#4T`oj$*DTxc&=R-b^GUr##YC#jNis?f5%YznRo&_SEGc_eee!)a^ zW~dV+BM|0bGDudmyfWBx(Ty<%Wk^+h$;)VyG$zMdjPGL=E8cyp{8;BQ7YL46AVuZr zAD?Nviy`6HzjHU%#MfDL;0FYuTL8F#Cepm~^X&|QmG~Xcwf?{9J8O|)ycakIWdinW z#^r1^_m{LQ(|kL_@1C|T)&_Y9N_jFhhJHfBnpjkyx^j*6+H~5tsW)}8*2IlXdic=3 z^yO1;!kCusO2MGHFl6CarBs)&&!>O%b3dET|IV+Zje8HJ_THOa1h2adD?66w zShql*%O*>L8MK`b>zdP2ntJ`Gh7ck*DbAy){*#|K8ka4{cmN38*8r67gzvH^EQD$^WP zIG#drSr_ZmL$j$9uE8W9952B{A&=2(Q-PZ*Lzne>ZBK1AmW5`x2TgboYlR^@JBB7X zSNAHS)mrskmH`ieXBBAtCS%3@q-Z`t8``iS@5LfsB?SL$ZwW3(S~s#UB=Q78^lRr( zz{ZMRCc4Z7l@fHx=3a$YF?XAG5iY#Ut1!M%=7#MpscTa+7K5{Ca9}14V=c<|n!kLM zgX6UXX}SM0#mRMAt5G-$eYT6WM)9BhXnygJ_X^HA zWQ?`obQ3erRO`Db)a1KHB{%zY*7w-_Qtlb9=Tse=#o2P;eSeN|n$y4d?9R7IZcb0q}LJ;2p z&nVot&p5v-XfR9Cn!Xm?<>>mlf%Va+KJ>oy%fI}!^pk(~iNzRy`6r)D{@u&qcy+&I z$aIS~SMZU$@;fh_PLCYLN{xHRDv{`STJCS&lWuYQI0z$2uhGqge8rDwRC#(6gQjZCu6`27?l}stmVp(F$)HM@JWU3Qscdg z`G9wsJ7Vhm-8YTUEX&qdYYs&k#0&^8@XWFaFC-!y!an=2grE)8gX3L(wnN(-mtyg- z_x&j9Dm>z-O~!}Q(e#^=l}Z2GzJf70UD&ypZxhY zXkD1f@Vu8}K*QQqC9$X!G@ZPhbJtU)633)#1-~s>p66QTK2#VE&A_Y6)8GF+cpsov zPG*J`84nHIScFk{!>Ag|>|V8dz4%z-C^;Gp67ls&;Sm#OS5<} zc3h1MbH2O-W*YN)Cb{`qf9K5* z7F%rq>v6*M5aZi1PTbr^uQ^V^vl2i0hI%^ETu-X}VngB>QQBx!<$-eT#wu{DL-x=t2sFP^qwx%ZU6|e*~t%N?Ex{uzrq$>kG3xEu*A$F}dpi zoA8TnQe9Azx0XSaHOF7LkWhdh=s@QH`0N##La;Z3tNT z93Tc}4&2;AuOJ*77v0iNvS@d)-RUNp&G<&n+1Z1ODa-f#^LAX)3zMw1z~B=ms{mqY z;ACR78sIXMCKH+ZhF`=I=AJ7R^{p!EWo22mtF)t3qx9X%Yx%zNYP_ZTQU)2Sv@qo` ze~W!y%Cg?k|MYj1<*IYl;6O%M;_5XTmJ#1*Yeru+kGp&c99lfjtHS+qwJ%}=23)k% zwK7_%+Kwvfx(W;pCGv_yYc>BCIgOluAr`wE_B?WnSnK;#+P1#f-+r-1&cB&n`?Y_X zhF*Lr?c9HV`oNF4b&bjB`D)Leq?(+Y7tZ$q9(oU~c@8!-E zmb{E}QtVg$oF_^!Zb@6-y>tD}fxudQuM*-A?%NgQiZ7dBPO9x(;+N}p4y5jFOK*Z7 z12GFWxzSbBz))D*?BOiMjgaOJXzzpDcBEI&U&ci%3uiZZylY_rJp+U5{_puVw~@aWyzn%WSMw{zT=XT*Ou;<>{18S36f zoZUyd(@-}Sk*CMQExuai3MQf(h--PP1=m<1q$b10wg%i+x2A3g#nkpW^5VSZiQ!Og zkdfYqHBn}S$Zp9jmy+$`SgZ`niluMWB3DV1$SS=_t@!O1y z{wkiU66-RJrTJ(B)(6Oe4!`?Qdi+C=rCmpNrpab3eCJ>+>jp8HBc%qp-(P)gARXPi zC$(9Ba5=xtr3-TjM#ZPBUgkCD2z%kLzxihR(fb}+t*UFjd*ziY>3#jrL^)=^MpKui zXD1x)+u!r-64SgyQ0ToAVMn;gu3l=9T9|(&UhMY+tkj=>BM984VZth)E`9lR&Qkxb z%|}u*bGME5pMeoZJ@dXVke$a+Dz`V7@2}ptmY#feud!|lr?6Uk&vwr0EL|#stPzUx zgiM_)Dkr>u_p+GLR;+bBJ3g#5z=v!Ry)0Th%)n?5wp{tw^iZ{1fc$vO< zuK!W2#yn%X;6*J${T9WE@OA-GTthhdz=KP!(uYTIElqmlvB3aaOy*#V09&sb{DD)v zb5Gq462JH0!SvZzj;DYAFTR%k#DDc@760B|?B6mUu9fr4xZZta<1u(oy2~#0<{DgL zVFSGfCqj9RMz}}wI1`T*cm#o~L918ydG4()VHC0hyliuz($>6(42+MsD}NL|&(c>j zNIf89sf#_L`?yTU8q#ay)9Kie1MC&2(j3PghP!n8pNxd*qQ3UZjLS1)LZyYR2%Lw( zpKZtXr0XzUUp;;$J-h7yHKx!yp(^R(>Njdbo6laol0Lj|8+zq8w?+Jou~JK$;ZFK` zkdE;uLtK~UVI2pPd}w$q1R0kuUP{*ouE)4^92Y*IMhyNbc;Bqmdedmy1dO+A;jB!A z<74v^;ihy8Mi842h-(FJ8M;o_N^6Akv%T-%xijd4?oK`D*8H?Wn?=~!hNaXoEY1%f zL@0wh_ZzGy0ax0{dl}iSDq@1`@*my1w}|85%bZ+eIItbKkRHK$StA&Q_qvtUWvOm} z?MrF+a$K|r2?CDqGUsL9+xuF)WjC~x0S=iiEbggCOIW$VV1^+rj5PkZRdBqCC%Rc( zfPXMOi+7i1;Q}9)b4rK*)UmYjmtGEoDeFk<5aN5bDf2S*8O7kK75>H5nak;;pZ;Ll z{@^B#dB*O%NoAS09<18}UQTB)VI7$pOS>M~lg^!cgZglOJ64FQi8{h=9mF&7#cK|6 z$4|_hb^N9e9jBQrO~?FKmN%J;1WyIQ<4AIF@=Z}=!mjqnA# z!NqBKztaea+y^;6l?TYb^B9XMl*hENmR2Z~3&E2MWbmXO#PxP>pfuU|tVFH=t)!F4`OIre1l@S($Ks&(^OI zeuqc1wBpIYqfT1&NK*wM6*N$TAL(WXG*XxeXU{KgflhS;ZTag{z}+Jix;op_Acl?8 z9Ld&!fIG-Qfgd$*LK#T@d{g*Fy|{{1ANbdUhs~7s|SVMz7wWlh*+ho$En|Ey69ZTJV-w+3eV%7I+MKuSBeb! z7UPVE5T;Y9xYBlo=b?ZGp5=Me@hZK@b8*4*z**uev=0Rs=Js&qPI~cjmNkN&oHQy9 z5p`*JsWi{lIj>cm31Vho$df7K-n>ePrc?I?_s)!c>*87=EaFM&E>kP}YPlTiJlh{K zLFy2ANoMw?-fhI;F~+mOwSjR(fO-$uVyj?V3{!D*R@~;Fs=u5MOUP>#c}CfDKzYBk zLv;SkFV8}^wo3?*5g|{l)CK^# z$cYZ(-n0AyK}g|5*2G404o%BxI&l)~B$-O>opdJe&YwA*P8{z_`ws3xI|-%=t7gwc zHyv5g(fq{th##H{>gGBKi)o0KlN>9=&>(dnTDL4THv^tP9^=J8b)Cqc2qEDM_fOQ> z^K2Y2PRec!T3Glr;vFC+`545OcK2ba#+1#2jGB3nq&4%!G{h-`Jn~sA z?#!!B&aHXp_ZAR{4UaSzkjbRFbeS`)(0FTM6QCxW-yQh|QQ#fO1}MJcf1Denp^njs zNf;0yM+eGSomkjR<0{elKNi&A@sPT=0B{Vt*>JoD^<|7+9-G3g_LX#COLyAdy&-Ld zNjtG+b2`Z)e4fpui*lJF^Q^fVdN-yI{>dLt7hZWYo&T+0OIsg)I`!;6cz2a_0tE+_ zf`S}qI%_s3SO1kz@MX1U1t^BHo-ON+#k`%HEJuRBB9wefnmn%)uZrsXydGm6S*=xN zX1iI*tDqGb)*nfz<+MTdR;m#}xU0zZofTXcb5sM07;4@JoC}cOCP2hY9{9z1tyl`Z z`L)6H*b`egUIYf3Wh;3h1R8R6TudXNt_K;xb6Akij>F(bQ0;yuJmZK?^@uC(#l=?g zAG|t^TUlrw`FM7wXK2Q9o%p%*6$x+k2;5rPOLc8(Nt?Dax1tQ7)t0afE4>vJig%>( zEHu|oJuup~5ohEwiVU8~&bz3D7yecm9!s_1yCLe#&bgD#{r!*ha4zp$oDV;66|3~= zalUJvrhT4FZx|0vd$cuIq2XHOsGY2MOsD_9|x`|!E2#&1j)sN3%SH`mR~zwo)!=?DJY_mK`< zGWlYO%Wq24{cgPTS2$CA_mahwv5za@?|T;(XwYgRg~dxCc@0(-_UR5%o`>zaJ}{W} z?8l*O>BFk%a~yBdvjZLi3}y3MJCHwutjs)XP3JCMOiw+tpXjE^e+qE@i|X8z5wHZN z)^f4^z^?_-*x{3=|6qt)$})B`Hl2H{q>LBl=>U-;?(ead6<7JDYjzUc?TG%!4v&R)2Z?tAp$vd=P1*A9MLJ#QJngPcKrg+12Q zYuE9HfwejBJD&3LKdFO1H*zH{>#|N7{^FVrG5AUZkR;?f`w8G z3|jHrvt6~;Ryb}LfmU6=em!mK?d3?uJ}l<3%3@DF$y!|(x}#X0Yw5Oib1!^8gzxOv zReWz}ZdIrvJy1y}1Y_*iTV<|;B+^x7W7Dnyz-QyPas0yYFiH-z+v9>%j%Y%dB+lFv zsxj&D2hvzA(pA)O|E?zrd6x1946@r>VUX+2wVSg+W@246KU zxR-%8FEr7wP4wly&FO6WDVUJi3SQpuD$rY2dd9NVM?nndWoTI9(MK_Ngd)8g?>BM5~M z@B?Py6c{3p55bLY?hTf0A3A2{;nOuTe%iu22Vcm{{NlIDGe44H{=nnSeVB8Nm^b}c zUP%!OZQzyb!Wn=%&@`6*^k4d!)U>ra{zICyG6%|?_RMA1GZk`}r@=NF%>Slz@nx-_ zszz0t@>-1ifJZAz?MrRVEn`&z65y4A_>=I~LP?c-k617+Z-6G$4%(+GkH;T$wsfXJ z`gYg8{Wn!^YV;}yYLX!zC3S2&vSYA9Z9#Iwra z;2`@V>OuMt_U4=y8(!9w+g%_H~qJ4sA9u#4&u^zi{=@LhLqtHX!g}d?%Wx&R9&E-G96*zd~ z^3^oi)tUAkI1pnzJRVg-^cWMAX&(*YSx5o8FpM!pja*Z8Y&ggzX`1 znn9v5cqD@yY4^6wdV%x+#q;H;&pinOTg$%2j*&Dxjs_|2g=Rr=wTK)jA*>QP0B8_J zI;M$JS}=rjujGs#?TDz0AiD))szl~4JZ3`<~;dj5H~Xw5HU(3bD3T+8=b zE)gr9t>9v3Inel&o4=UTQXBjry!%w{+ED8avf|?kom631KR+{cl3|+ zK}MI?AsB+L6GV)@z8zU`!T59WS)Wh7qXBj=8y|yE;wPzNk?##-b(l@}iHkSV_@?=^ zpYtd;pe_Klfbv4}b6fOeg-of0Q2o3qSvsYX~YV zl7^T+su$kZ@xW(8tU0RtlCb{GIQ8dze{)_XpHhbL$~#Mn>40|@Rq`|MHA9{di3?nr zTwE`Ivxd^l87!k1^ z&S~BAj9$mxExTFWzvKKSaH6DJ>#Fc&fxM=03E#m2q-@E>BiA=~iWXW(Sm%u>Qg7Ub z+gm(|&9Z}ys+uXm&22px-?5>~dJXHFQF89v*NN3%Q@U~nmv9qqw{vhAlySYD!;1SV zdlev9rbXHgTwm@&kiTPRd&0{c!t@EO5T`<*AY&FvPbSiO*H-RH^K)K!Ww-?FtD@+F z7;Cv+x8ARsXSAQ1!j{A0|eaH5v{-b-+&indse>)S_ z=98Qw+t?`+L+@@_7sDCN-U6yh)h=3uKeO}6aDyDA)ZCYYJ=R1G3X7vwd}LjG>Ef02 z@Vk}-(6ubry!EW>nak5@GmNq(t-NileQm*Z*s_r4Q$I=5FWwkTPkcC^;a!h*@$69A z{tRbdvo8vMLE-GxB1OB%Czr*QK`?{>?f!@Q7HP3{Q$eH=+?r)g-@q|)_JQ016^ugJ zJ@x~+XJk2`iXEWQiR@UNL&D@&anr{Yz`JTth`>|(W_}0R! zFJ4Zc{^&-w4#ago5Dhb37TX%tCxf2U7O=9Pf`4!h%e?nKy*GcTen&>9)9F_R)6S1= zNlmysjDfW*M*V?$K`$0y@=e2#y?kRh^&Ivb!X-qJ`5uA?;U5T8;Y-xfyq0&cG)a2a zi$Yr?YwaI;`UB}#zwm|hC;s?9P5;Bs{n7O9$NK9Pcw6u7r-4fosh|B@BYh8HqP-%F zA;WhGvQ_hF`wZ>8fHl_v_*YBqlO8W{Hu_B3fiTxI7h?{Nyw>{3f;Nwkv6HK9%0T2ON{e(+9rH^exw~ex~J3rNBH~Krn6ov()#|Lxj{U~Ew3wD|Ec8&tG8NO-!)7Z#fp7z;sf@5B~D+3$8qFyz% zaIb-h7&iyYlffR=d}I{I90<3-Az%mqxrIlH>v%k28k`%#iZJ*C%g0!~gtBiHPn!6f zn8Xqt6*Q#~9-%otI+-?8L-PvWBLMcQFid9o5XXPq|NaB%*s~9&`A%Hx$2j$~|M$F~H_qYo7m*fF@R)h?M!IqKQtF*j zq^@V1Th(Z(tUJAPHKH5$66&SoR%Yd&7>hK@@4h#MP89T%0EeoANXg~iU7Ze`4;6yV zUbvcC4sFFTqqSyDgCMB$fd|q!?$U1xq^Wm;?zrWF#hBoO>)1GEh<8h^zbTj7zObK# zjlo(Os>isO)~(fbrQ8x9z8>>{{^9dCws1 zq<1PZL5BEiNSn7VdA`Z9@UU~^G`FTEj$@U-7>|qh@rhEGms{2^#?^g$q^;uA$7k?f za~9;A%PB6gtJmwgn5Tc{7f0{hCRN0hevqafRGy7cy;nxJ7@+N8bV)lJb)V1N1d^o5 zG2DEka5g<9_xP=cuUp@%wmr`E$^yMQ=N19FM?Gf&x~^?IAld^2h>l=1S(>5KIG)n77@-NjIppmflNov+z8G<_vQAd5(=Nt6_b{I-q!a znuq5;PrX7(fxcV@fAV#oYM;rs&oqi>%Cz0i2^#)}vI21%6>wMm7im~isIZ_RZS+5R zxV|uCxKOtE;|oBjVt@*DCAfD`;IE5v%XhX>IKLE}8G9TfRvls=8#Drm zBWxXG{`WQIh=FFjv@g46^7cYiaiQ~*8#~ye% z)-mQ{*tq4fbm)CwGf1V1+ZdbvLXJ}ztM3q ziFkDas*0}Om5Ipr5-HOc;ij95AYfI;%PcF z8_h4~A7yZF-!9ha=48v>L>j42Anct%bM(@Q$ZK@qa$3$-SysflAL{+S?nK|>5wCvz z`E>lB{GHUcp)LL7-~Qjyp(j7Y1lG-F8|@=irf?x9${$N55(jo{vYZ$|Lp7g5 zpxWJ&wzHA#>1^XHG}58TsM9^=vt%g>8A=mWKDfKEtP;$QGp@&NHG)s4D;i+9^MuKEmSdmMrg zTB+wRoRvq;aBWOG`}Z(GqtF1Y_WL{GI~M|F3aVp)Lrr1D5H3AkxT;0l)zuTULhag{ z73#io;djql?iq}E;BsXQD~MvvI*tO;o1C{a%6YPT`gf)68@tmmjKXR553?))nv`y# z>oDHloSypQ-=B{E_Gi4R;(ZRz6av9zTZMuQ%+N}x*idjrCj8HCCuh=zK=8N4_d>)sAL zYN?;=``ZOkadw1#3LDNi+mL($rK@6HVrPt7J122Sg#%?kx=`!EZTkiU=$<*JR=#@< zh1u@+jJq<(mrF&J+IAVsH-cV)P(mjdSm?FzVgem5$zbB<*`>U)pteH`bOg3~+fX%X_eKfV~=} zx2d4%(LGvPw4z+l8p0ecJC`$3EH$M|X9rW)PB1wZmib*B^nn`!u+d#10qe9zl#R!) zjig5&+MeI7^Y@FK;r*cpA5I+;2wy^?YzI~OQiScVNFMv~>C{f$gQ0@J?8K$Z>5uI^ zxU8g6guvHN45n@0%bpG1f%s4li_gH+Gpn_z30?s6!d0xY4?eME;q6)K?|Hzp)H!B} zd}e{YNTemG9og(cFo3}WuoBb@FkJ_+Mt$w-X!`D*Aj^tidmp?1ew1lx8EFblu1B+u z*%OFDRCXU&D9)4TiSrlJ$95iAjH-}#?8+n-vYz>D9jG7ikxyHeM*Ww4l8{Ev8n$o|Y@Nz1-uj6V4SXNLal zPkki5TmRj=debYH&oPfSq;9+f+LIn(CAi#6X`$TUF;$Fh?spx6H^yhN zXxHtsJ5j8yFdVT4SJ*G^+|UaiQkHx&EOqU-P|%Kyg?ohzs}#gG5p2O7E_;|>&gmW) zoJ_X+>4)x19SBfcZc#sNbA~X7J`deHjB&|IhVkIo2$oqB;hu940ln~^L@t;??_v4@!pALdMB1k8#nf* z-~8O?@G5pC=9p2GXmt0ka#54}Xu5uO68G>MH-}YWJDyRdaN{j+u+S3s-mwJ~){L)a z{$#?>Yk)yJo1rcCnM`}F#TPg}K^MdxQ)wvl&HU}%7@ zzXB_;a&K-02bf4FCP#v4+||>|{uIG1b+En)9t=Lq3n;kZJR}{EpL!X^h0U9~(?&ee zjMMIkpLjO4|I%*}TL!;tN)&=;2hv#kWP0jj$5P(|+wgQU3ttfHblUcI1nb*`1^)z! zEQj8IUpjr_&D1f)*q|^zN%0nog`&oN78fqQzT=yWS0tlP6i#aSpHRqIy z6^iy*H)Q(Ij$D@5Vbi1$(wet3NJe$Dj!kE}eDV~YTQ=c--Tj(Wb}n^4^uC(~=quqw zy}S0^PyF0Yw{cpPy!^roX?GJ|74A|-C>#vs>b-Dj5-I7iTu0$#0XbI8ZN#Dli|I06 zI+vF@L9XCZFuP0#NNxJ|?ndy5P_&}C^$5#&|HL)aX}55^T`+z<&3fXiz_e

    (^OQeUH6*n?8M)Se&8 z%n;wVSi9Ff;xk#>1Vw)72jYSnlLn&wC}oGJM|Q zB&I2pKU*nyzuO+4VD|fHMa3V*a`-b+7zBK4IznTZ`ppUa0yjjZJl#LO))G$Tk5HhK z?kFRQW=A_gI40ukE<(t~Y&`vM(8^Lw7La_7-0d=U4d1mk5%L%5^h{ zm>}_#87@*qV)v`s;_60$&#d*`s}}XJN?i9_qUV~g^ll_I$ULdQR!qOdm}GeT;w}$f z;7C<8K+_?zatlMoVjhkRJWxjl)FEU^G&vH(rqX%z>(arB#urURuljf$GMspHOCTf6 zG*r#g(Whh+aiqT7J)=FT`9GkP%p1glpoOS}AegAd+b1`E>t0J>kr78i6tBymH%~aM z>%OhCF;}E>j9HD|mnTTHU#6}?)TQ%1(Fpcj0xRzSu{n?!zQ7NL@LG+ZJDKu-sdKbe zOV{O}dhlKN$fR+MBk7+tin*41ej8T<5gA+k4EwEyiu!U1sc#0g-@|IZ^DBYnq1ZZx zk#&4dkTr&Y#Q*eAZyVE>im_eyM|n3IoGO&uz`KaYvkX3@)D+xnQa*d21|R z;oBeJ8&LANd@1_fixNT2;Hah{tBwUNPsx*pN}##om9FC1t{zpRr$293&X_Y2qc7HZ zcx=x|M$G4JEAV#w{vdr=^md1o0@alJA8(Bt?D+{))y?mlS>i(!ERC3DHGRmD!)m5> z&2sAwMY}#QP!ykJ;)lF&_nc)!>{nrucWPSjN9rTPN!ppZ)D{qbVy%V&apwxe~LKf zn4V>#m*CD`lf|dT|5icYmsIKsD|0GxW5}}p%y`@2d>R!#F`D5<78NV;t&3}NOlu~C zv0DioB{MzhOk0G*H_Qc9t#Gkc@;I$5l^4)N6?{!uY!iKK8BaF!u?O#z97-N*+shk> zFSIwZ{*m=xOczD)mu?=^DK8KioH|bOyuo=*c)zQZsniykn1a{MyN&{6ILlL+gBqPl z!jOX}e)At}E%M3rz~@Rkj6e%tLmbI*kfhAC7v4kN3vJ2IpnYvyz{Z;>Ai6a~Rp+o|8Wsf$3DWA{Q?QS-ejO2-x9N*NHg#H%@K$D-cOI?Er0KQFMaHgY^6|NrB0Lx^W(TjaqO| zQlfE&r2Jn5fG2nZcO1n)vKA(ybim$J<4b8!la>#>5K5DMu&KjiH>kJD4&h(4K#h z(Zl%1$8=%?1`dw1e-nPj^1$`c9rXN<>`4wu;;L;D*QOw z+hmrwcgl29CvU@<yy4oyRPBq0_mQvpgG{6xnD$2z~Ux$L^Ks!m=Ziq(60 z1ey)utp=D5IKOR=k)Qp*q862o!1j`Q zZe?obT9vUtQH=hhL!AI=t4ie~|DF?dvsaCT@LTZy!TD?UJz0_l4t@!9YhY#Z2MC%7 z5#a%Eh!6%OV4wqEq&f$SbJP-BKN8AKmD;?t-@n3Z&}H!_DWB_H-(OCOH{Y)y+09Wz zK&Zbc5yYr{H;@ncf@f?D2_v-bA%?~A?^O{@vA8#m6cgIdVh*Eq@ zMONw-(NeAF35)R`5Rro%hXGrqKBIGEN(b5JFW7>w?WEZapX$rQI~U?-#Hctc1Mk7s z3%)lr9)HnFkUE9}8srUDpO&~WZCNk??;`b}uS{cKX;=`_VI{KoG7P8cW}m;c2%~gDauqy^~b`{T<)Y&gpZRY)9#h=9-+KBh4ZR_0w$n*~<9hWhjQ1vSY)MUskx4z+%lbqfDT zP8-2QanpT^gkXr+Ap9?19Qxszp+nqib_*2No}6XEx26OS51kP+iEJoK0*noz41+*8gR!v|(* z{rvEJN>=q@9WGtkTDpX)+u#ioIbVshCD3Z)zVNxRSOVqx*zs+ z;C_u}5Te5RjK%398vxsa^@IDQvlXJbknl^ z+JGHh-y_e>E&V|(xi4<|@WDJMV5Tq_+=)RnQ8Eq?$EVSW1G;EO5&-5DJvPEuwUL)* z=&M!jvlg*{zKL3ww)&)5q3kv)jWwvj0;G^2N)QXQ7Xh$SG0{IV3=JAJXh&g2Az&64 zqoxy?EV*DU&|6AbNY&M#NZYVQ`Ta%v4W(}UwJ*!onR)H!vRq%uk$$Na*zI!BG5Eo@ zIW%D{AQd&oH;1k8^>7ro&Ly^;rv3{o{QoBRN+Xid|{gsXSBUnzedm=V4AH z-z^Xx-RHjhWQ1Wb^iWO3B|1l5Y5er2{4 zwFiY{4Mbp-5``ioQSlO~tR#nF5%Qf(l{1PON7|*!o~a#zILH3>9@~W);;xgSOnmzC zKA0x5DbKwfZCgtiPAWyGo!dtG0P4H`Oh)zWV4IU20)<3X_em_s;vz_Oo-Ad4iDsdQ zh^Sg<&@lrPGY>z*(ScTDG-7M=Y@{r`#nZ~(NR9tMgY=mC=|HaS8r^x|jHRO-Wzn`j zr-t0XBahGpY-r(Hg)jP*Y*X1(G40it?-U0cNs?~+5f>}zC(2(L{dr0h;aABW?RoiO z98qI_bTFXol<0oqwt3cCMNX6pJ0tXq8LFGEhYEw;(HdS5=mg0n~_d2rRRs_~aZ+4)N;=y8;>+1CN4pkX;feM&%R_tyK{4I z8*Q{ma^rWdNQ)=E7)0J#vQF1eP5~8Lz3$ccUIQVV`#APPh_e^9U4f3KH6q8@zKlG7 zy=nf8IguOK0-@b4dmYs+k5HxYzkzj*dt0Mdl!PSV;mrVazf>9arf>E_|8ioKl}ax@ zAB!`u{6g!vC;2CNQG-4mOCHkKAKejA$qJpWRx%(K&1wd2j`YaaBLGAtM9zUpIs%b0 zQA$eWRZ#`nnD!(@BxY-lOgdJsv9ssW5%-6SxQ2gx(^GJP^#Ew4yq^U%AY@$EfhuHg zT&`*y_{aJI*{klnd#=L_trgm_M@U=I?8z(e?VDM*V?<|MH_27ORIaH2(S4}9FHzX3 z%6*)zR4553QRMq-jqrNlX=R6ua@!5L?c8{=UH~%17+;-8zpjvv`_H5GXXb#-t^2>E zT7v}(5;a|Hz|HBye091LT=WaY8EGi5x~T#s`5Fs<^RJ~>+XTcb48a_TJ0Ens4!Wh( z1?#1Ycj<1B#zLWGD&yDqJnL*q{Dc6Z(3qguSSXz~U$Ks>CT5lW3lxIR_M*DJer{6E zMLJMpj0kZ2l1~OX16Udd47Qg)^!V(4^)R^l<+a$q%dHDdvp`X_lO8xmhh|OtR4}Pe z3jC!Y=Hly08nw3)_}LDVTCDrHMHJf($s^4aNp@>2V4l}A>00)mHxHSsrB#{&OY zhl1N|gp|r{D9#*+Bhz2xj(ss}`aKnt?syOGsk>&nMVFm>I=cggQAIm-fnSHJE0q~= ziWE#D{O+1=KNxxW3erL2Arpwkh&++K#Ze>@KYk_zTooN6{Ww**y>M`59~2nPcC)m2`cU_*=hs zrDD)-WB-}<0a?eF&wm})82d4_N@f;xqlYTh3jHZFJ&W{ykq-_eA5wWNTgD3i#5=^- z?=HSpz*Tr@Iy)qm&t?wYdc%>PaNO!o?(MR@c@T=*c)*F1bk5w?N&}6bddJto?YN=s z@;QtWemmgvns5FvRz8y-cYM%3R;}GKKj}>R(S&f0j?x(*_xB&~BT;;p#A##u+b0Yk#2ffAIJESBJJhyucfki(Y?#7!sEe*|#1e4K1K%j>uaa zBIZoU4s{v4xEXsegULU~8G$ybg!jq@q z?%{cb14{1%(v&>piBu zg9bZPVxDEdF?Pg@?#+P#qsp2@c!n*xa97iG5{|f=%;pg`@eV+HB!_T5TIf1&$Z}Nu z?U4$t5ah%ic!4<+a6==rVAptGTgFAR+khM_@X|rYnZX_AvXF73)cXktbaA>&o0}66 z3EdR_F|6Jau>nN?p9BRx4C;j>7q=62B50x$C=b1g#5tF(-Dsn;5C>DmB8tK8S+PBi z7AcKk=N8wX-Yg6TL$iRvP#VW0`hgY2;dY^0+U|ksxuLhbj1NyF zO`#ec^pdwvuOv^Cu5)=j$(93Bi*lpkKa{Beo!>#e0gPBYcfI8 zLoXYhHzEBY2g5~~cydf;EGKb8?_K>!u~~yK>bDj zJMJa@cTyJ=fKRK{{z4Md=W%$E6>Iqg806)K`Bx1c$P}jGda0NUMP8yob%#4Ywrdzs zNmrO&jaD`X$Y4* zUA_HS1?m3>wayYS>zlLT%Z0G)Afpyi{MSzWSL82%H=yD(8ypExNy_-);m=4DmG|ASg8b2)umcx4#g$4k#-1Yg)M0#Uy zt?fT~R9>+yxR9X1oM)%&tU0P9-CxCU`U+el;z>IcFBn$J+U1-edD0jfa0VNca1k5J z;3vhTGO)8(m|&Fb;jLSSCT&1@jDxefOjh@({eDiW`g{pv&V2S2H3D)S7*hlGY5i}D zZO!{f%rz;C^IWHL+iB{jQy(4;jV}%8eU*axkT~T`BDT)oS);f8n?ErouazYuepMTd z)39$h!%%@;c=SQ>?CzsH)ec;p{qS8ub$?C%=F;kH;zt{bE5SlL&xB2NBlo$^${x*$ zi!V_degw!!ez5gU{642Zm=P)P{#2p$=|&MHlryCWh-}X7m1CSk)9&g zx!l)Pfw(Fq`$Vz4b$_0doa}7OY&MxL3*KT%6F5xMsDE9m zcaZZ%3)8v$8(J@%E!Ya9*Zup{L+{0B^}>9 z$h)op_BNC$AZHpk*Z>-Vd#p=R=<-z>n$;Aah<7s+?a*4bJSq7i{eHm5>97574e!_Q zKbhZ08@{DfwbLUGCJAxaW;(EZC!uw=5~`oiG>mfURUi zZkQ`qCgG?#E9`0H5B{MJW3)P-_MegE846WgXpzL;K%BM&hjEWPP*Nt!Z;QRh4w%oi zC+6Ue4U2<8q5n-3_uz>QK2EzDer-E zYsH=jR|7@05`ns|qQYN3Letdcr}z3Ut0V@3IZ@SHF2qAqZjlL}oW|0acjEqu}+j~Yq*M~*arS+-b2a^BzDP_~X~UShepWcz&YZ5l4V`NBdspdXO4 z+Dbv2(AxWquxnti3p9{(A6adc+A~QTP+>LdA6^z5UT}5O7Bg%<^9TI?ZWwdXV{}^R z@!y|$k<3jTCln1-2*XyUD27>w6r3%e@*)x{_{|?m%WEKGww%9crWZ40euTUkq#4Qn zOCv8vwnh*hHwWt1EJI`^9*Pe%$}umwFNBbb6=7;gu+qdD6I9&_2cRiW9TFW4^-Mtw$De5xtNjW>-5f9>6 z!!a@sS6zpR?$y?+vTrxkh9sWquNrx>;gjdSm9D>{o>FW$fZ(x&te&_|?dPHN%Dd~t z860$U-~R&AzGpJpA13jCTKH;P13zxNwXvRdL-AXqx|k$EwIni^DoYv04;8()cfGXN zRK4`Kn`cMqxC`cQCMYZ5Gbg4xFNOS5x=e3un)ljt+a*?A47`T-^(RnlpSRh1nZk_! z;TnqXVFuyNB$}}J`RDt%Mbr9sOH*k2?%l_p_*Mm}iPKt?KW6kEGP;nhbVd#48vGyu zgf0Sa)M3CvPwJYBDQ8uF|3l+m)bUM7D?P=~X&j6|6bF)-~3euuW6x64$ zAszv+FU%LKe8Wqfg2=WRElfsHD_7{aUjUA3&3WF!dfS{7COTP#%~MK5)j^L|L^ zUoZCmY9!H4T%hGIu3>lUhTjF28DSs9%9k=!Ym1I&%8c5ldod6(FfC+4E8#jad1-O5 zJSrxeI6ayXAUf<;=DRtX?jz4kGJP3!`TcLo;cU88W%iV+B?#+bO@CpX%}CGJ<)YW8 zPCJZgQ&P~qy3OY^{DNKi;iY2DUw0za$bMp@16##A$=7ktu~0SSvo<)A$MELe;DMgL z!VB}v$1>FQ#GWO(LV40Z-ZiH#M~*wKr0tMkWOJ1&f<8`9aQxlB(r}7=r8O33*CyV> z!ni~Yw%ID3YdTK_8~a3b)YifQPF7MyXnMHVUjMtQBS7AGPFseR3&qsT$yw-WE*m2o z8C$55W-hipor7IQmpTC5zb8p_P27%Svqa>ne-?Q-lQhW`@{G$&Srdg#HP^`6ZJ9iE zjT38?fI0j%G;(qHHlK15bPvU!yv$lO&|;P*ut;L-tSoQ_7vR*Sx1 zi#S(xnT87I2764^82(e0Iu|@Tv^0!o=z{3v$6C-$l1XVtat~vJbU8ai^Tm2ASbe}x z{Re4T6ME&BpTw-H`e0`Ov|D`=`XHvx!lgf`D8CY-B^SnccE5;qM^g zH&VD6mq6z?a6V7ZrH=*I-7S3l;*blI7(iqAYDYO}9)z5+I#$>dyDZ2Gh=xeZya|7p zRm3a{)~*MG4kFTztgFlNpZNw1=MNfJ3TzegsUnlU@9)pus+~D)UfXb@=fwE(cpABj zNW+t)^cUhMsGFT5JV}%KGryJ&IN|S{OfLz#)yOal`6sW1ZtRdgcB*R(7X9*ie&dhk zboXT7mO)5#shD;Iu?C;#Qy|(?0=|Qd9k#3Z*Y>ewDm5V1@cyOt?OFKx?(Lq2gQ%AA zsZ1xq0)e^P*FrXqvj%lB=!|28kD0og= zz07p;8moDx<7i8@5=;=$NiR!<;IhQGj(6HX$&R;{K;)V!TT@5+r!~3S12TM}ePo)B z<~sO5Ow8`_7a^h4{-9>T1>{S9lF5$*O}$@7QCN7N>6}7%Ada1?FG1t9<(w7``5b4H zzWI_hSZMIv=pT`y$W(s#e||JrtV1V&2p)U{z(e35aNoPw3)TN!q zlu>=orfn(8%+*A{QudJADGmR)eYv7n2nsg`hedi{n^u`anB!f7~&sO(8 zqQbpi9j}Xdc5=z2Z4oL4&2A$*tnye~OWIO43PXpQ+^i(Bp?+y~;UUs6}k2Q0lgV;)>&NtOTC5z-LGA|*1O7?M%q7?Qz@Hf=c3m)EN4~Cs= z5^!5ew<#3sFBoxEI1>(>EVPi3WIn{{Sv*`HoTe#}?R%juxRP>fChgTrK+o`2lfF0g zkSrDYS`^_{Un!p(ggGC)?!nNso1s=dY2CBPChor=Dm@U<-?9hgmRoaV`sdLOTRDf+ zZpD0_=jJfuEL5~(^)tOP!Y6;i!ql}cGkyy_|Pr9p(Qt99Ux4R8;49@PtqNJ{wpITdERvA<2yMGHeX?FtZ!N%d2DTtM0;ij^KmEHV)c}OrV~P5eiL+h3jD=@*joWylhk&(C3^~hUoYT^9v4Fbght)a1jk3H>GMPQ{i^d zkU-8X9PpAcVT8dB9lv=R#Tiqq&&7Y_l4}J)2)pPl-998T_J(t3v|4Ls2v-skG!Bxe z+Hk#@BiEW7&`s>L4~+_2vGFHKqaJPH7T-9eoM-xj2mMJOC#DqXh9rR2aYhtNU52ng zTRaiL#3R_(S)@esWk`u?-#S+r|HJ;;tBuQeWxcMX)CpiP4usUx#s`4enCPQ&q%FGb z)3hHU@v2NzBv;_)w+RUo5=G3icvvw$tmT-pW%|mnjQ`yNji_SWr25y^?D5%mx?%SY zEgmAmvQ5l*A;y`h^UF`pzP!F@dJ_X_bA@H!^TgQ1NHuJ4{H~sFDmtz?h*Q?uz!g;| zc*&R_8qZOX;azFcasOFh?!h`ciMxg|YHkbYc<^N(QY5RS0gFQox+Lwd1gnkL$bx?Q z}>|!fO~BvQ4{{&CI6sCQ6`E7Jvx@Pmm6p@^ z7$VyLc9={gW%wI1-d0sGt>{hX6zrlnjka?z6utL&nGFTQS&NVv+`-+*D0tzAvN#(p zj^-#?Fw9^@qK+TKHs8~VzaNIT?*v6<#(^<@tG$p_nh|uj(4T-aI5E&*8;Dyb8Yy!;CMm%8|({cvo z+palD8p~)gqC)~(ErZo7&zv%K15%I|DCnVvBOwyCNi_b0SrPy2f(u99L6sdHg5M+_ ztDsAF#{68i4!wSjq#%2qJ#twe@3vX zjf-ubvHcE7=&|Ae``4O&(Y1Nj!AhFKozHIIM8eCx*uoog62QpHI1&+m!MJ|t~q|` zkGaU~%H%44l(8sN4sc)XrHh1scj0AjRG|u0ViT_s)FKz#NF4zI=O>bdhS#$jHHnqg zAymbP1UmO?si>{Sw1;!oLbwphQZ9xZcD6*J$kbmjtaWvHRrms{g29WErw3j5*q-bu z0CX+leW~Y>aNfk8)y6M>N}ei-Ei9oFQmZwt?M>91m1oigz5lF+JIVW&&$mx2J_>n( zrdCG#KVILAQnWqXDEi*JaUb@a2Yz)t3zcDo>aGtc3ZD;~YN9C7^`vs@E@`D!>QD-0 zxOET&YH0z=iR0su-?xT^kwsqio*X>%n~aRh*h*| z8tkfm4Sz=)D@~xY*eDl({pD@s=;5)lRgoAt#)w@%8mT}|=B*ICIXn)+Ana!c=_vLW ztHb}KlzxuU7Y|DIsOsGy{08@^dDrtJZ>Q9V^7I6FT!XVNy1>-zLNR~Uk77f{N42j> z_C+-1AINc(=7h1#1J!wIo3ZxP?WEeE$~o85LNQ&+oa3&I2Co$ZRWPptn@oHV2+e?5iKdXzA{|L5% z4tyi>n0TJQ;G$3J|3_>+gQ`r*V!n0t(+7$g1>VqkeAisaHulytUNN~U{iM8-hxci2 ztk6%NrhJb%thWwIxQ1E6` z{vLR|(6L1{q5aYVSaIzH+(mI#7NT`ShNW^{?qRt!CBmr=p<-haC5RiHq?Qp~&kX&2 zLq!I9Q2K2QfESl;Rfknyh+->lW|WR~fFFpk_?zZh&^g&WD*?u-)CkjA_-2<4dGc)< zBpEe5O8fuu^v(fw{{R1QolbRDt4>_D?PX(m*|wMMmbHw9#kK5Owr$(C>ppvbzQ6mg z>)&&o*Y$exfjer?Goj>=`)I(6{IH8YxHh*r13_<1d1dl<(f#2YFID4_89{1Ot0~%= zwTos&z0>+tl?htuQ8>qxN0GzMafhzs+AcQNDiPK3w)H2KIGH~>MfRMrE%btS$=6ye%x{Xws_?pW$*u<-p0<&J+Fn zIy0T{Kivg0@Rx#`nQo4e>p^!?sm08oG_?%TFOa` z0MP9q582<8kl0fL>OrFcbKh<-G924pGs|?C^%#*K)0|AKMG`Ti8Qr(PiBI9W^!%p4 zC+*OxZo}=6k}w0-$^1Vp09;D{&EJx*S;)DCGFQJnuo;*8dX!(nVI(P%3fG8*Worv) zMXfe#okg`yacQhjf$%!KGr9USQn)Nxxisfqpf|E$vVG(CUuJh3pvy335r=o{(;aQp~l-igSaRv8QDmxhRkb1d}_iuzOJ=PA4S7G zfTuS8qzY2Cnbcy>s|@d7uOHug5@Xvlu&YA~BuA3Z-#zz(!3hTUc&dd=mN<2K3oLI#;DV4!Jp$IsY>fz6vevCq66O4u z9lJ?vSfHe5X1yC{o7uc`TY*!*N6h@s2Ckr25Gtjc20VFA~z0C4PmFgd(0T!1>O}he zt|^Q$mg?B}N-CAAHXHR$>6~ZG9Q%qOpg=m0`a79OnZ8wF5L*ElNWno4;{Qhp8+3?MtE@%0 zg=8W~;tWyYk+cQoR+7(_zDvVuz|_~V8d8qq1mDnh!0aYidAfOkI|QGo-hXmwbkH;< z%~&w$1tC3KP5f5AZPpz3SGwuZ3!&_ExL#7aI2ki%Q?U>ETrAnTm{;MqAMLSPQ_JAa zMlW*&UtalRrNgw0j|H`PCiF#k4I+4hiF@~Kbd?g6A?_LGQWX#s9DAnqtF_6>xm7Z) zG@`?soXu|ba9{8q;dVSGTF7UVhRPzPPxB8ZB!vna7^8A2tTk7?Cd6>ZK%wiOo~%jy zoK0=1RxMG=b2xG5%}_F=$D)Fjf*^h#J}d+pt9YDd5cg_{Xw}gW2%h%`Usx^l|1Cv+ zo^WLI-(6#C5^4{>_a5n1EtS0C+Uue)#7mj`^OaFMH`$k)cfOe~#Wm}NwxGvi!X9Uk zci)93T&B`hEpN(hka&2L!#>OWI32FKbg4zuB;#LK2!^JVRuKljLQuXAPb>O6)R&p< zV!ngJUb0ZCSV=%=N$^2g9M=s23gK@WP&jJJ)_5x@ zk?ibWYMI?k(aH$j>C8+;{CjKu`t=dXoxh@7)V>Ym6B7*}R+=r;Q}z!u5O0tJUINMg zCqNYd)!we-m;8YXatk_0RVrd}SZ-Y-t*Bx*2GG767TIEZ?-3BfIK%_Yb$l&l{qt#x z|1cBYhQ~5tAgXZlX1b-8ET^7WWw9TtD$TNg{Dt6xUq5f!;jix&{<_M{nQp+AIlr&E z+<4a4M4kp9=05?7*vZ1AM!B|fG*i-18i07KTw;QdxH#VwGH#2d$%A7?@WF1$xAK8Lhr^n#TmTsUi`ojzXOYL>Uw}lF8wbg*IL66El2Ipu|-A(WM z!q}8N1GySZGIOtnX)Uhk9Bx*=%$u+;wvo)H( zOIg}UPRYg^W3s&RL~fC;jRW0I0zL7gqX;Kg|SWp`MBZ03E| z^BQ@Wno%9pSp^VDn%>vmQOz|cZ|5%!*`7;R4vvslWB@V$viiiyM53H2xCJv()qLSF z#oT{JKcK_+{$=s6Eof&7wAb^9){SqZruUw~#4F+JLPqc_kadFWI76V@D>Nc?Gh zw65KU1>tkra|0n?_5Tjc0Yr?tw$@3|2rC}VMYp#Qgh2NDVbSFmBVoO~9~Pfy`p*fmYfz2w}0kw_49fu?N4 z(`8d>wkCy0(Dg@G7W$^+)yI>Z=~HB(4kO7_XR9k#yM1@6SVR7$GOU0JB2rDO%$_-4 z-K+fS*i8JUK~SxhsdV8F672Ecl&o8owa0Q?u#s#tl(Ee>a^M9qphRP=crsUjol$my zf_4~GVeN~aCKolf{HQ2)3EeJ_rD|-A)$j}tHWktO^)~@}Os2kw`BwGcRVw`)ZiR`L zylxoC_Ql@eiJ5rp6X`QN9w4LAV^`#wQ4i=$P2GGQFlroI&&zLj?}SP=cD8$EUezf3 z;4>}&!>qZ4+qN%XSxEndK0i}3dz;DpEYHdt9dktE$|S|BP9-Aaqy!WJohyv6lS1Ih zQGvPrWOLS9QLN8H`S6pcI=^|{jZEVyJF8XU6n80JU349>tHi%CPrxjwcDY4>h7<&5 zEh$OteDXvy86Yh|wP44UfSNdpe@ptEscPZ&4u>We{Yv>VEvAJ942%?_O~^Bwectg9 z77zXq#BLZ-N^)l&br~UCAOQnRBOn30+;u ze};8cO#DfV@CaIwK_r1*ZGR1FuU*p3d-+3wtDQ6?Y)x$N{#Q3oQ8|>y_By;^Y`zcN zm@gdGi;;W!gT$d`qe!55CPX_&YE?=dus44sTwu1_BVE{0>Z#nC*I~6ftx_6;ZM{y z981&vllrnIxg;#EyCr@m54cvhY(dUVpQ-dl)I_2AeotGH7M6Vy8f{SzA1qDe3ad{8 zBB6EP=G{B2`bT-G6^2*bQ1qxLZ1Y?UDtCD0K-3;S2zcwpfRj?g`e<0{RM_x)!Mt4O z5m__j>yQ|~0T0L=ONH`u(pTS9J6BS@r`Zw3%vUt^PCv zYaO`?RW6z8RQiD((m=?>7CUCK(eIH|nHH-Uwd?ypQf3k)*U$hTD3+f{+lv1bOw5r? zSde1l+-qQt-~0Oc%LYZlBrHC3qsfqeyej!uD_arxX7d<)Iro>(m(!6I!H*_(?4%$XSOwgajO`=nEYLc!0ayn*YtX7ngqfza=%k@SU^mN2_EB9&0 z>}o-f(mrkNtpA*gwV$q-J<5ac)Cta9@QK7W1Sg~tI{)_SXJ2eH$dJf|W%+DqdU12l~Fnzf;;(q^M zax~3$&hpM!r{P%6Okp~kIxfF9dJzNBzL`_I(o#Ru0CAX&=evQ&Rm&<;x~F=h`z_Cu zlQa*tZ^TwrIbCLiWMu`)bpoz^f7QB29Om!fT|_%>#z@`I&PLH%pVPE&-cszRz4TfF zq73IV2?7y{R9kaFR(IN|AQ{+jVFchUe=AIXmxO=y_EU6BEfZ)&(tlo8y#7-F*I7oI z4V?A4rLm8v*N@6MC(6m+KRd%w1DJ$U^17d$Ax@lu<%I`Spob7Bs<~YSzaSVa^?+p< z4_Npk=F6lwy)qG*J0=k!sT()k5$g~nx)yWv9__2-EF@)-ed8CDUCnDKhHsAF z>R3v}{JPk37^`9Za5;&y+Qrixle6aAV7#zCCU4DtWh-wg=jX>Tn@1QkL?%^I=V=8*rsgnYJh*6k$0)#D<^~(@YHQlrd6K6nC?BXiTK<*&{0DHVKJAa;c+!*tGi0rXnrt!u*3ZAfgo)O4W# zGw7r6$3Y#wX+A#u{V|sJnitwLYcd89AO*zSuP_YfCI&m$D=j|4^y%TNB|o`kCsp8W zcBT&UF=x6%xzlj3H?-5(@i7-7KaHx1d=-R#w1c3@4v{cxspR+B)OFSM{Q$T|9oPn% znujrhG>y3Y+__Dhv*INND)x*iwf}?IR|W|YAyY;ddT>5so14*|O+o;}**WWP-ho@| zuehoAr?q_Vsc#dVLt_~RXuXuxz>7#BxE=+D9ukgQ)ZJ@}7N9=vVWUo--Y-5@g*srkOn=4aHaKMT(R{<)TLATb;?} zJ|f}C?$VNn$2+E0F2-`kl?-H3pj1d43=&O>skSi*Ux zq4dYiJy5FU`Xy`qp6a~fKp~p*{alQ&>+Q;_uIJ$+p7Xu@q=QS4jv;>iOU@VIeLndd z_d|CZ(W<;xi4;;GD`T$Y1$bkmW;%Q|u;`b?4i>-)0-xuR8{APraA?3?uJq)NybkK_ z&oBH*QvVGvi*xR2c@!?*es{%A`sfo-BvJ?g_-FLU(&Dxuj|*L|%Dy({{H-IyK#tdQ zh$SPSBl-jisIh0uC=b?86OKv9l?|)nnj;SD;yFu>a8@f*wicccpSUS^)9HvGWiISh zGMujat32`IvMK+pbW9IuQTs`MGPVBN6FX)9nkIeuxvdrREWCy*^|5(<>R_@P0aFJ5 z0cCxyUcM}XgSRHlHGhPYgt%>UnSE($9!x?!odiZo_E1fbMjHf^CJyac-mhJ!zMphZ z9b|l=od#4@fel7U7sX1|czp0oC~Y6m1UOxB?ZbL{xO5p?qqC> zJdOZ?=p~>|#4#f*l29YJms(E3i$-+8{{oTHQ({2of-PeHP1vd1=0$N-1nX+ymAIpn z1NPH&3GwU~b{+AOXbIGXSd*|(bxt2D(cEz$tdg3p6D?8Z^ZGG7xvnsXp09=o6ccUh zFWEo_!}_Z4k9=V3^*-eDIk%|s({HQCT-4V7vg_^d65l^YKcI_J7>4N+gzA= z>(O$3gR!|y&0-=n9+k*fM-P))8O4U#98`fSmH4NTo@QaA$mLF>_s7?aLAZJmK6f3D ziJq=sMu5g2<&%Q1!|?fP3KqdOs-pC=e;IvUm&EoN#~pax2+)y67>wXB*i84-2m_-t zRz7EMWb=XNxT5E|*r8;o^s zEoE>+G3w%Us(76XQM9;FZ24F_U@2Q)vFivw4h;4@nmTuDZ;~8TjNV*xr@OX zT)iTk)IwB)w9YKIfqQ9J*Z3=Ax{e111TpWk3I1SQw|8YCWj2N*=x~)|OW8@g&4$Gt z%J1(TO?gsw8B=e%>W5^q`xR3ET%bXF%yC6<&P60ShafP$5%XVmc}dX;7Cz)Xk8y5V z*uJT99vnKmY88rD_J{Ejk=QkA(HOTnu%cWke6G-%bIy7pMOC7gYPtd66;R&(Fqu)n z!M(I21M5%-O{hXat8S;a(j|-;wR13_JAgfUJbzbsmI;&(S|Ijlf2hRyjZk?3(Scar z)#&Ub<{JF1LG=%Sk4=`-`M&dTkm~B%KmI{pNL64pIT(*sFyYvM1>i#NJP_1Sq}Pty z(DndYB!f)S{r}`MzfTuW;#53pQFLu_+cnP?l2dw_Jp|T{T@CK(0O<7+?J^pf7pkb> zw(;F8v~oo?#WMOteJdn{jvt?|>a|2^Akyiq06xQH%w9P{LtdW@u;E>^u2q&m?)LaQ zuFD@&lP5b8(N2U=JH5u5joJwSiz=md*H0sm+O0#O7%vYKk3RN3?|hP-%12_{EKP*}Q*3o&)t3Z_RoT87J~sJi-Jt z6E}FSWN}tTX~%RO_B2%MM>D$qwXxXvtcnStF0 zts+SoM8d4E4kxPSi67Nwr+Y>qh+}`R6_;*~x_~w^A8nQWUGD9lKvXYi;IktQF!5)h`eT8$d+q4Tc(GLO*vvaV=IKHds-NBY%mOz;={E?_4GNn{w-xjo zm}rc(HM#b5uFI;_Wm(HwRRct#h0|Xwvq`^o4JD1m} z0=EW*LZR#MXF1Le_mSPmT8b%Pbv@hM!tC0>y@jPNtNw9m=`TOe-j^gAsmIxCa4u5E z+cUy4^DpGZ0DH-{uXZ{)0oS((Eh|%yH?N0}ja%h2j_Qgt=4;QcynKLsO&W9R%2wE9 z8++fPS4zE2J*jaF|NBbnQ39a70~dTpOtNq1-$DfR`F|k~2zoHi9FtjQ4Tu0eFEW?t ztKPu!MpBK_u5-S9RTd5{$F2*0oxx%UxJghkxRYG_!_L`i?VsreL7>*Z#6Rp4+Q^X^ zGijy_*o96AK-I~KY`@;7NdKh&vY?k2je!yK&YjcM@*Z}z8;ZP0M#}iKn%Q>JYM}rT zfd20~g6ILQu*a0>W4|*+2!jh@tOE3n(k#*?{xv`Cw`;Lx=4C_`^T$M*GnKi-H3SO^ z85S*w6e;0<{-k!;Ee#J=6Au4BjtWG|9kI5BMzecld5Vh4l&8@_$QCSl8EhO@dWTC% ztz{0O;OjCl4OTLr4-|sAB48bB`AI6Z8s0qf>Z>C@pkmJkG`-%ml=qY;A)epZ_ zE?M=B6!NtnAx9)eL{oo&^CrzQk2V0E2RRUSR#W1`P7_l{OC$iZ0V4D~M@=nlT6AH5 z_YN7CMWUckUPbUIvh_=lrby0Oe=~w?AmrDtP>cWh75q0{Hh_hmfB3|Fz614u4GMW5 zzCWF0dbJ$7R?&o$O0it-nhLMR{8CW54+`!NQQYWp9+3Z)9wK>``-rBR z{SIYH7fZcl_Z6d4N3Hh|RYO9{O7(NiE?Y7AYAXk2v*+CzVe88a(qFG4i@R?$pM#*r zi@Pah6HCk-69F_jD9Ez}Iw;+pj_*GzZxwGaAq(@I572Y0?jp^xY>H-Vno84$6L%zG z5!RgC$^cRLnt|d}+(rF01UWTWE2MnObm<|>jBd_llD}wN;&90m9vxb4lVh^{b zjK@#hq(}>r22A|Kn9x7nu7bzorapMwS4S46D;*d#n8X>}%06r@+V&rBd$Vv<2UyGW zAa0%ef74tfoRn@7_Ja2~GCC6!%3ZC>W(nLl9z!*-E! zT1MYMyso(sRl`8kO34w!?UPGQ^J4zM86^$pY~pXr@F`F}2O%!DVbr5#$A#bW1(UG> zHmAXJieZ#3_8Y&S4NM3UUZo^6F-mDb4vt3%<*eMTe09UTees{tm6Wi7-u3X((xH)v z5e?S45hubcRkNOGukqKjXuQv7{QJB^Q&<2UX#$ zVb~tP`O2CP^A5fb$k|o0xSWVFA1dADI$yPXkau@j8?i=5IvG=MtQOq%5@wF|c!~>; z*`p%0z6MCa`MO=);^keZ>uhH6R#_A50RD>=TM_O;T7mk#sMbi(yaij=DT~=zzQ-ngI)# z&*R(%dL(=;o{|gLNQ5bLVMqZJ`Z{!^#ZCFY!V3HmfU9xGG{$(aGgft2$=#*lBS>isq>ZGK<5=p!aVfAAqJR+!{o;3Ay3H~&bF^6`!`->>0aJJM=%$H!yVX<|yl zDOxPb@}v7qmK!#jPx~c1GVGiTxKkQoJyS-WjwLV0UFB`e%09Hp%z33nX2#OvAsX%M z<=>j6Mkgt+JTTMtDR{$MPHn+jMB166_KMdK`=$Z=$TMwuUGw1E zS<7Ft?`PT&=*Nw^CePze>#_2ik3(*lUxDUc?Oe!xjPy;?w6W)96Z+GVjNA8dVH5;!KtYe($oj4NtukhlRm?guG}N^odavzCh7R>|(``b5&g zG=L*+h|kya163l0LU!=n?a3lKNr$w>a`;jw*~M5h(bRMe8`!{y;h~E!*#NupwNnyQ z!3UsD`5q!6iQai96O|~qJQ;%;lnNSnWgrlSoE?PYx6E5) zR3M9+@FwUbi&KejNenpR%m`B;M6cco!g<oN zpc;EC+v06QJS#LlpELhs6e4gFp}b4X)Wh1Cv<&m-&i-Up=w?0j#fyy z?i?#RJ9~t0*bh{`YUfD>x(0;<3GE95XBm>hxb6b%Vq3;L6`Y@;q z`H_LbLVfWD-;#7%iQ@udJ9WWaxgo%2)TFesN3~e=PNNfWm*_%H~sk& z|7YhnA{KMZ7%7@Qu-d)qQ*OyaeXPa*?j0teTQQrEKcYW)p`%NO5K%Q9#?_Njm%MV> z`dj0Lw%rdS!^tI-O>bV^d%Sm9m1KD`(t>E^L5v5aO>ZTdAgE!K?-VG)2KL|$@jnBt zlIjyt*%EX|gDAosB!HG*t~E4!7r6!rkEgr@rS&Z1{KaIdAD>M}w6$i?ft(~cLC)%` z*CyXOg2x3Z%Pte)QpPO;<&q5N-|s8sJX8Bkz1I=Oj|TH&)=TQbwmy;VtE2*l$-5jq z1M(xG0ngs{Cr+!RM?8p*IRsgP^(l-)3&j!j1v>j@e7i4b4TlwoTTGm~tlxnUMkhNb z&caW<$==P_!7c-g(|D0@A@5hGk}CFOUweW-zczIsZOQQ34e;i4Q!dU1p(mUiMbBp! z*|&R2-&&F6Op!0c0&FTpB1X!trsYyTF$SI+FvQIwq!IptZtNkxDla@FOdu+b2zL52alotG|ZU-r-<>UfxRK zXqp>cJY83N*|fP?%}Nk7zXsK^L;om8r(bY`WEhA}%>M|xkesn#4&+(bULr35EME=& zy`%Jwcl~LrhJ`QRUq^d;>HEv_YxugKfngibT;t8m-o9W-3ibg2tuo2QP}EY_ceHsaakpa>vzgU?uJQ5{erUWP8r%STSYuCb%qW+j(?;W(Vomv>&caBb#D4SV720458JutJRgb~My0R;rlr?+36R7&y>8sAYTRh}Ft zPBqFBX;Ow2YgQdhy*}0Iwe5~0evRo>HR^AIONdjK5w`<_`LGcyg0(+$4Sj9^UHGnN z?w|k2-5HUIjiGaXE0yw8uz6lJqB(>O2oe?g7=c_qcwg4ltr#ky5Ry-8`d}2Z3Gt*b zU+-M8zjV(|TNdR$zicU_5J?p7h?lJw>zxUPThP{{l-KBoNJsIkQmPJZV0_#Bv|n#K zH=MK%!S4ZgGQHV29VPySWf5XFbkc#G%4pJczAuWmmmTz;V=2K+ zCVUBJ5jMDPMMZ}dM}pjBE@GgWMuYSquPdMS&t+4pZDfzNZ{6~g=saFaxn4ysVztN0 z2$R)R+aGiVtb1!#=j)c5h)T_=+jYsnU1d9Ns4N_^s&VRWB960k{k`YyqUQ8gZ(&sIhDpwFDc=J;DUd z2>W#h-pXU!eKiT?llddUltnmQQo)z=Irzj1p8T~vG1_*T7yHLU#ScGjvl`7IwIda3 zH4FBG_yAB>^`}#!ws>WB(8titMMZJt?pOMxd&%ocsuDG@n59DhN@JZ)o`bM)DZyz5 z_FwtaVMLP7rG}8Cr$&jK>BC8d_oqzldk^$}!KafCKDV2?TTMCZtXmfImGDN@blnr9 z99AUFS9qp_Otiq8%fz>%1dp!+uA9)7i>&+>@3LPiMJ&K~yk8-zWZ8BJRT!Ck!MUxN zs12{?R5AepM*l>kqPKokRUy+J3oo`0+TH+}$2XjZ8&a7ajovl^gU9a`*GQ z)lU%}RAi2|mWibj@yDF6zsyZB6OLGdc9;qL`e*j%If3nPvkrYAJ_dBqMKKXULV|Vu z?*8simdqc}cC>TN2&AQFF?^~GuIbI9r|Jtdce%?$9P;`kSUc+7CDh?$K7`_K6g4G8 zkKS4JEWQP9>dSvLxcBe?Q$lURO~w+4S9EJ$Cf!G*Uv`fcT5Ri0q0J;McCY-wT-@B8 zPVyuOoOlKDRSSIPK_@@px+#Ca2zMAI7z%rH%uNR~sNjBF3J)Jp`@S6-60OIubFgp9 zA#M!*9$m|tQ1^%Wdwd0qMeC3+` z-G*On`>~(l#Tqk-P$_B5cg4d@uiWd83+1F=1rhiEG%Da&YG3$_2JLZH@wT68l{m={ z)&4z;i-mnQ$S_=uw(PZwT;F|~yvw-yR(@QFZ#TcbPbLpfTT-~7h`E38O_&o@7OQ!j zwye`;tZKt}ul7(=!^!V`h8@Gp17X;>XUST!&wyEmL!hh)5b;i3xm)>S-65d{QkYmX ztrg6-Ib`d3wzbL3IokSzOu*DO>)$`LMJ%ACC86$^Opp=u4T%KTotL$>-yYv{;w_)s zmnCS|(D!94HHp!Z%D|zMQ#UODi#-~a3kbi6IB6Co2MJqk`>mOeXF+@o-YcbJK8S2g zZWrCGg%a7%G|rw*j|&`3tDnslE73y6pH594Gn>($bTcjL;EC(gzZU#tlPWKqrWpuB zV!P-Ph(B7~B-uwn4Dh?_L^Vj1BL+= zbMN2vINDoQm$5wZj=vsR5`eLK5%gxo)-okWMo!R|_Xs)VFbIl`7>o{l`RUdbd-*Wt zGt`xqO#zuW7HIXQCkc12@oD@{&z>~FEwj(d-4Xt(m2bzC*4Ft-M_MY~B&|#vr!~|q z`L*cra@MyXU?m{m5~MhAHH&5p5FJ&H-) zxR$^QR+@F}t#yMK2!5uTZ)1R8KM8U_!Y0=sSg^eiuwJO1@S1nDM>RN2-@Lt5e#Q&? zPU!eOb6l;_FJpOSm-#X?2ZY+_~v&cTr=@k zA;H}N|CTTLMmmZ!XwjP{tYUr)>O=Xuluiz2pJeaOwan!ueHdWLcF7u-F1a|mdl+P1 zCqG_;B!C%3t@1_#6k);ly9h8pLJQUM*dP#c^8CI(&Wsv z>(3NdGNUO(_>-UYJ!0CPx^$oV=0ShP^c zEXRjkto_{zVz3*~Sxgt>D!Q>@N~hghk0priPnaVO8Y3XRP`PGtP5X*YV%q;y`}s=b zOJ&!omXek%*!{g*f9g|gHrLeNq({bCCn`h6W`m@gqb1S6f^JB>7C4L>a4v8(p?QBN zFicEFu3^Zj%afU#=ZRVGjG$ZpnKvF-tZd!LE5%vynL>3%kcDrCeGrO4UHyxE@?_k( zA~96+8@tWZbQ(P-tt#y*cR{#7?%AUwt-6Z+k~7v)zv#wq541C z1N|Z%{(sAqm7WWhJ*A&~B#5)}RQT$a_I)dVXK0nC?x?rSrwxA^*+_=SbGpSM-q^4Q zqIhRNZ8{;+&osXcw^=?D>psA$(Mis*y#k#Q)njR5=S{mOHbhgq_*8ziQQnJIFKI2& zX`WInAwaaS(7+qS1|ySf!r*cIQigsFrjuKPP}p^cA3G#D(VwsXe(ZdQY&;A}4ko@$ zP$hhHE>0h5sG`@6GjOPEJT#Hkz4*2uwFFI-s7vUZjS>ZAoo}Drlpgf?G?{myiJUe@Nqhj}p*Gv55t7>I8J0)T!8T3nvpd@&T7m(;z!SmW^+#CKk6u*Y zcgWCukRo~kdkLC6l3(ZKIQ@hzHUD58j;-Qz;NcIX&WD^(l(sfv%Ka>^cMRVqYU#u# z+vNX(Doo4;bUo2Wy;G>;%HB4u#-Ytz$=kMn_m7(6J`5r}6x9?=6KCaupI4?ZhlH&Q zf1$tzY5o~CMpWP(VL%|yeYYwCESO52nxAlDz2%iNtYWWC!vUID{Gz*P^zG$jxepDZ zpsDSBwIB+yfgG)1?_=w_A~!kHPRG}lY~V<_`TvjC35Wnfn1e;78a9%Mhcomb==aby z^7k0xk&3@wp)g$l-8}n@un9x`HTAVbGfXqlp!qXrl?cP#3XO-9wRwx0XrT+YaZ{W; zeDl&BdUG($G_O$cLKs9%C##6)G1TQ(z^g@ZrZq>x44{X}V3Kw0&8d)iJxHy`30?f5 zTejbiX)BK5V5*xU`ZCHSXfH~P6XuKzE_49}rfN*{5v)+e(kCLN}(vTUS#xAt|>fL0*b z@Kjm9ZMPoVE|039*2n59-+<8*5-U0gA!e)lgzUKxR>=hcbiE%YuS|&Q-e#Ly`R>O| z=h{Y&0QAg?qX7ktANiykCcZo5(b>0dU$YX(54!cj5ME2ecj};_Gw#?ji%5OAmZ=+m zX?+fLYki}ndbal!mx4D6M1P!uE{-Y(&;Tp|^32hACGOk?-}BHLCV_`kN1}JY`S)dr5my@i?hHU~ zL*sJ*Qr$nQBR)3ZkRCJA<)Io=?!B%PDq!6FZ2dFJM~-5M%`M1XjJVFFy!CcRIvkcm z;W1GnZw}|x&+qzisHyQ~cJu!*~LL$2mSezF~=2jj$H;k zk(k|v4CVV@WL;Uso_VVbj&6k1V)poR@iq$-hppqvQf@b$D;{qWiE;r;+(Q%}i}?Jc1h9()KVErmx3_y&|F^DI;rCC@PptM9VX^` z`7HR6-p6)3YO?DoKh{YT-BiJ%s=;y{CE!Q7cbVEF{q>E1XNA!FF$y_?*JC1vT^6tS zPps?|#pVBT3O7laVc576z>)v9h58`!SLkf#*H*lES>p@TRew7z8VMdr#)lYYR*o%nGyYiKE-&Z|N z1sj-e2*K`*T9&n%Q4($-j?%|8(6|9m-potRonlm#L3SliIt}sgLB(dkjnPy_FN`_}G zS+ub#KgpnCcpLr=aqRGPmNO``R{i^MwWyb{ZnL~w=|3?0OEWHQxTaH8`-{;&2!Gut z%W-H0p1Oiog*xf*>SaQaVi-E0z$mToVgB6q z?j6^XOi9>3N&Pq=-hkm{U%G&&idTz=BS0ZjK0WAFAM?7mjdEM<=Tq`QJO*&5O-foO zJS$Kr74k=r)iiGB8AH_3;~+_Qf<0R0qW$-V2M+EV>>hRi{qZ#uQGgDeI2Ez@apzn3 zu#q7$bwUx0aC9J60ty0j3It8}SooyQV?&#wj{Jt7E!bnus|`eJ#54md3w>4XHIw~> z$KpEFIG7!<7nY-=_(K)gxak$tsn!)eOV{#F`&%3rSlg7+g*-q%buho?5PqE`i=D!R zu_rHKFdF_m*4K7z3fZE~C+}ka8%z4=UIPE8uS2I4sB0pc2CXKEk zs<=o6?DNDm{^@D$V3T$eVJoU6fq>2)w3Jz{K(TI8L)<>aJg!o>{A_`sD8qXAAl`g( z$Fm2lSNVN%2*_P8xB7g_wEkZ#;i3lqK1)xBy|@f zL)XJy2d3_(#BtP^1DdZ&@L;D^qavE{(Xe&lI@hs z`$y(&z4hV_8$J@F<@`cPfZ0KZCHtuAZ;m)(X^$wjq*6&v2_H1)C>*=SBZI z*-D{}Os17pV??x4uh-aOX782(i8r{Y4#n08p$r6FqcQYaYS2-!3Ana;{g;t=tDJwY z^>_JRait>7HR*j54Y$1OGC(OZ7tPGkUmyNGd=zAPG&iZh7>9ml`q$dc6-G~1PKz0y zqR93aD)x}ksl_=FcO>(Jj93z}i?sBfl# z92}AhEV)Mi1xcTtjgUZ^Y~bvvUf@QP?6y=^lvGH>E}CiDM{6sn`89?wY5pWhiXT3$ z@KC`+PJaUm90$Jv&0ej-LJQ=9cIa4`EsF3r>vNaw4jXEiW{TOzp+m;;P=Pn30p)&- z8-J$wnPONk9`UELY0zwn@*dqu7?!~l?B(LsYQ2`{Jk+Kq>wlZ^;2kkev~@lI@IXsR zEFeizOdP21H}UDJ1c@Q3i}Wi}X2qnH-IvX`Z9Pvciz~!mz{@`{V2Dh@V)n4qFX+}nOW`# zH#G{fe4zmDCHw`bmcX)3m^*3!Ge)L*lz&`K>Ch+PDpu_K)tX`U#1+eCHCiWMDIYmE z;Ps$P#MU%jDIslL&+0gz7*1B{o!82nVZX#k32z940g}4w%G?|Wj{D3B zBQj8g=Ts$23pQ5RVKtyQ4|Zo09zvEA&qW!oF6qU#m?vlpnGnG_Ri1X|N9 zS6m6xt${Sq5Q4il?(XjH4#C~s-QAtw4#C}Bg9j&p;2PW=ZqGaO-50B`n>bQEYs`o#p>smEo{YuQ+XE zJa2TICrCY;aEDo&1-@^|BHW&b>3Y)eqcN!AiU67FsN{?HqSYS?R>LnCT>RHB{1@f4 zj^47Qo-crS-z~8M4VWM(iu=$n+be1^avV_CIgvUq-?3q}oI!7D+u8lCc%Kpv)3#S> z0a{Kr^mCHPk?=vDv45=nMMMFA;jZ6i6+^#q$t-MZGBp@j96fZYQ4=X|-XhVOFlYdq zYyFV*_CKRN-eFjk(4SJffVOxFecffy5{=}AM-wM$7C)`5%Hs;6BzM0Gg9snW1>KT# z|7*oCfvGa&DFqW3Uf=}_^FRbV16a2IT5$I2(6mI7x0`lFSd$Rmi)z$>DGCsUVzj1G zfudAv^77KdeCVkCv_TD~rF`GMIedI27HCL=*Lr8KZ`Wr~XKS61D8cqP+Q7ieiyqn5 zgN2!?Q>j(5ZuK13s?qvN6|Mm(-Oosopvo-7Uh zcNEgkxz305;)Tkvtda%pdxsGr>l7v$s-$wzW&XN^#U<}5kYoS|b{Dbuj~Z_>6Bpkv zAZa^Hp@Zc0%H7)((yXt%OK(rDVq$yS9u(Y9Ig2-HQ}MSGUu%jX7^zVOi`-C~?*7qG@oS?2q2IeZi;rCR-GxW=GpDgWlz@^Gi2xkpD;V zqItu3|H18nZ(F{0-DvA#U5~F!o!=Sp+W=B8L#XCjAkR-1oa&PpTgkwv`b8CJF)cIP zfgpv*`qo`?ixA-gMh^4=h!c<|NAzBg%6leEGGc8K**38u=y7A;?8I=q4*MAH#}%%H z;_*gE#5N=&IUE!u$>mj@K&hg@2T3AoIMc>mS_5dysY+r@)+f#-S)+d#2 zM!~`cdnFp3f?wEEl>fXmK|rxcA&TrGy10sj0wm$j7hac{N5inOek0Cugh4$jw922& zvUUvm4rA*()@)RW4GL@(N`ulNnYWp#zro2{m^>Cf_yruAZO*Dte~J&w?s57wyfxJY z@l~uzChO@>rMvV0Khh4?4aGp&suh6+NOD>m7cZQ!m89+39&9A+Qu_~l4tbQV{pG_h z0|k-w!J$mBJHF=zx)El|j&eju8A#gx2FQk2(kXx{U8VPC&UrdCNjIfwvuWu!GaXEh zlO^0cL&LUX=<-uf=jcW>NX!(ky@nrCpbj?VI!8QhH;aFR%-Cgl;Ul!*kM&U?H&CKZkY36OwNIlmihZ_v z_QmrI9W!F!FIMq~-=X!mNwdw;?&O-^KZBP3X{FqeDw?;DtOOVHUaWPOhnSjpN zm}wE+*D>!P0Rf28O(*H@8%|N&BDU$ zm+FD5-`~4ms$H9N{ekH*FRtN?)ZwDT&`=7`2`Ow0(arLI3;1BAZDXWOp#*7qeF(b_ zw@`e`ZL0XFxROVXjPh5#CcO0R7uIZ$Q_ul(lHPtiV_MR zvUSdq%<74P36%ZcOmwRQ{+aJUgmBX5><57o4a!we=yWgQOEy&G&7-`E7&4bFK)~+w zTl40O93cbZVdT-jOa>tXy zL4SHQ&=&I1$D;%0zpCHHkwbL}!1EjAzqSxk^vTG3gB+1I%JcmCufuq(B%*2dslQ0} z#QE>6&%%en+c|F=i-ZbDRjZBUZjhd~p$br-Xh?_?u7`t)Cl;9nhPvdXRViBj)^Q{0 zhj(n)ir~KTa6Yx_{J}d-(5S_q6KY4S*-A3$1#Njj+?2YG4}XG!{bLHN=Y^Cj&Y&$> zFoAgOX{eaK49BXKfD@#vWx&(g9=~7^tT`;>2~*&b0ch~5@fWk}&Of73zuaPa!k9$% zM^|6~q(CPVW*V-HB zNg4|e7B&G1W^Dn~PL!K_UF1@9_al0&d1WaHrdOls(T#9mTns#@`mbJ+K|``=qWn^V zLZHD=%M8A-6Gtv_f|uaxBGIT;wLV4N78NHN{z;&mRm$bo2#gIWLMF@vG8`6UJe7Yq zFti*gZzv=RHX2=@Ptw)>olaN0HGTArr1vw(N(`^v#dnOYeeZoH+;6DL$H}I}*pFo+ z(}oG#^K~CB)`~sW&+4zc51Zp-K@9t8kuDidO{AH(|nH=iROT#YGDd|OO$b#X@l%90MV<8Oa?XKthwcrOWMv_>Dg zH=tS351F1b8~t@TTx3m@1wt%sSgRM}8x+(kGb&u{<;_n`t^`c?Z+`5TZ2K|HqXIbF zqQRR(_-$J>V*9^D!eLWB%lM$+GlZKY;y?|TIg7yvPD?q?xVC}x6UKOfznw>)6`Go* zESxM`I%8OB<2Pi8PF`|b?o{oU{KuyFgWDD<$N|XSH+NXaI-8z({+FYgN2OTt?u*h4 zf@A=$iEoj-fJcJ3Gs(wdlUb3-`t@zf?|(>{gdBO2E|Gr>T_%GG#@#wG!+1eAF`qY! z`^UOQvs+Axx?ybV!TZB@?xY+PfN^YpQ`2YfhmZtIe5j5i^b3^?z1(v(vz!E{4CEyd zA)$yBYnv@3uX(d~NM(%h50PLDk;&;8Ch2;G_@nNitr~$8!?zt50PBoDBneKyv!rFg zqdIb3$B2|C5ve6yVPruS=!u96isv;f&-MzZ6B=px-r3QTuJ`fF^Gm=#r*;(ui>HbW zHf35fVE4i|C(YAjIwS+%0?{8W7kjVtcr;jC@0$W7s2}4bNbrC!By-~M|3Hf}fRBQj zvvMz>xOR7Zm+uKTdvceFGpXQlu{YXpAo>#H#I42-L3V`Yi<~n}Fyjh}n-6CRI$s$J z_cCBtn@GS)-!u$JTdto`dVGpyA+9pfYx-E?4AdXa^L(cNXzBKjxc)_bo280Zrt0$1 z#2uCKVRu-%5#bhR=&yA~-va&!L4IOF1Ku*i%9gP$&=lyu#mqtQ zIER#EY{Wc+YIte~@(BXIozBNpRLYo`e77|n;a z^K?m4c;5geqLa`a;NafErkj4(jYx6+#)H@{ybM>rDkR=v>v04Q%5|dPxX?$|c^kUo zAuu|8mFy*+*YNpnrvaNtSmabAOBAZ*hOBVqrVu9G^o+Qc2g|GT>4aD4i! zi60zjD&l_>|NX0|g_&T;aVz?#;znPwW%Y2{xM^##aCWrTZMJbz+~L{5VOE^!+=IE= z%%C>phtHpcWP-sdR1AC0wW+n)tPI&?V)_r5-d=Hs2$x~PVi{EuAqU)*X72J-L% zo^yrkg=2_~iTnb6roT~Yr0M9-)><>Sy|Pwl#A?Iy`DYK5>A$1YJ;gMO0$t1`kxD&E zF}=i);`Lyma5 z8059oQjH|Wk>NsD;YBugg1_9mYHH}>P0uPRXyALEx$(NJc^o15h}(0;gD(#bk|6=< zigJD0)fhTN4246@`t^nJNLU(AJ!Ch55J82aUEjbY=?c1~A{n!8)kDKQD%1c#)^r&T zHuHN{c)3xNlLF;~f^bnlQy-E3u}U&%>kH(k(Y=d+TUu{#_XGM*37T<+l)pp#PUvQuQ8KQBsi*A8D zxK7|(s1gHh#)#+W%&WrQQ%0X?{_EcrT4}fG=eIhDfU`m;QLZ`ATnirclSz^f2XeO8Y5yD)h_EC$kD%R0-w$M?_;9?&HV$zW907rjq#i4kf5U z!3E+W=E(08O zSz0-ZeauZGCY-K>b1q{!^@6kt`cS>O!fPhzNKBtu<(bE1S@%7r~ z--d^BzEmnIC>+hDF#fTi(gZ^Jgh4P$h26mDDydLe1^Y0`h9uolYy?-duAF32Y0|RC z`ru5CCz($P;j0htQ6rh~zDQ^z8@P35=f&T9(Ul)P_^8zqZvR4*&~LFHjJ)f%VW#kX z1@380W9-o6Az%*V%sw-k@~Bc7WDZJCdlRSTHn}|U5Ie#bd0Mjpf>t<;cB))u21qC} zjNY)GdchBinQ<$lR|%yC5K+=T?Tw%qfFy|B}T--Iv76D z-|DXu7MlFsx)%=!%qnywJxRHs@uSGcU?C8}v^3sxp`X_NW1$VuYqfvChdmw1(%pZ{(Eq;S{GlVvd_|i=;J$e- zQ!M$2RQRP7yxTm%J!@RH02T;p{;$mz1$N@L(hx4hX`9i?`pcf5H>}U!kQhpH$L~&Z zIk(F{?{8fwU~uvrQ)2i?5(}7(%%`Gi%d|vsTC*1)Px|`rEwi3$V1Ny-Sx4i|L)WX$ z&forN%Ax}W8HJuRZ>R??sv@t(0~s{}MjR$(%*4l2iqNefj4O@dAX#75&S?D)BLoX6 zXK`t@sXK7uVA|e>)RFb%%|U%%T{ewHs-3l&C#SBt6Ag|%BW`6^1#8x9=7WK<`6a^U zEd(YMlQf#~!j=^#eUgxn%jR|yTb;O|dgY4=q&lDhyUC=6E<<*aFXmoUjt5P^{z5Bv z0QdjmT>s4aWCTGZr{gM*vEiSrTe@NGE?jxb>bl{bsR@F5a%JFcf=|or5hPu8tCWe{ zS;3;qu*&z)4v0wll^=Dd6ByUDyrCTV2FONE@CV3Q!IlCtB-J#h0l0|I)#DKm4Ah98 zR^(~HBDwF5tdN)n=oE0v!H?0C=)dA2IL`|N3#{SfEJ-c0!FUHZH9;2b_hneTl*dXf zsH>%)EPb{Nq8Q!%cE&(go!L>ULH!rv6 zhXzUq3rL0tXggdvdkh#s=j&|D4Qn3W8PYsDfZ)GUCkad)>0|hT z7R3+e+^gt;3%qx1V+q;Qr6t?0-QX|YZSmLANGUlqYXe)#*|s{pbycl4$A${z6#cjJ zhh7Q6r#a4DeYiQsAmHVDQDh&`)CE3GScaD{K{{f)xtCZfvaeLe{v{Ry?Je>#K?oBt zPZRrV6(ae;PCPjzF#JfhMnm#P9S58Czwh<1pLU-FoVf&mzOPk^$7t0C64a{IM$JZ% z&MM((`QS%95Qq(#RLugnd^qMX2Uh#3O>8|n`Grj1 z5WNIFwbeuCW}1mIa8N;{^=1J^5fSzF&ss)AoT}we>9s7!aK6$ShjHK4FfVMW6Qz;k z>R#_9y%CQ;vo!)UpSA`*dEZceAo@MOGcrABJHJ9n;HZVv=>XS2=JRrnEgh(@y;>6| zK#jR3^5d_2C-)b@z)1vim1>ZooO=||1_Nov=lr8g3zLu}Z!`-lE94D?< zf}Kxrr~!YFw1-$c)yqJMe_em~4lspo%HoRU=3Gd0z@s|2_44kNJ4VMR#7lqLHt!4Y zc{>QtH#bZh88zV+TUT-Bwtmvuj0+>^kAjX@24kPrRGh^8TP)$v52w5q@oJNe7*i~N zg=3nD(9|-aQ9%<=4YLpL=|$G97fv#wX4nnIMrsYm%pfyLO^Oj}bWHP#z{h)oX4}1= za7`|8j3M*J>#Fzm9y4Xq;P;s#`FRDKWOgEZX0JtJLih?W`>Ci%fWsI;__5_r`j(%4rQi;nAo5{wLPz&!x9584Q!b4u}Va^s2R3+n{gZb1(>;U-cG{ z`87tdcz0Y?*F;}1r@B~XskjbtdP^QB<99yz$TPh!w5F>jbB_+l;sk$BxxjUG|8aZh zo3)*%ma@h4m@jM8!#9XcQfP9`veym+OTAyBdU80Q>%pMw+i^@>Rhf<=UY^}!3y>!K?ptD9$F zKX5Ak*D-W-EhEhU3=QdrNXpvuKjdGH+*th`s@mvAEsEWFDGBWr`j30(F`^%!&~C82 zfs9J`0cx3!T3I~DUpe|UvL79ncNT^T*ZBvMAL=O$QpLM%aMHkjKm!BnO@1f+TiR1W>=TzO`@PMqgH`0mgUE^^Gb6~(%+!Fvk zusz7>qCRT4yMTL>(%sceq4aA{ydBYMe2D1}Y%ZsgFHfV+YADjpNI(P_dX)x&OqsZf z7&i*cPyUrXtu6V+#wVwC&MB*Z&x?1i@S%6VFA21MIOiUiYH8SLE^~TQM7$-iL(!?L zAD=k9XXg1|QO7;&o$A#liz3Ju(E_aXeqacS3vfcCU`|NOPkT(`oT6Hw0U!rott@Sc z8?^Rz7Yy=l?tN~aM8B(*QDbbCAD-s2XUMB^nEXV3Y59HGIy2d8_j#UHo@l6G4w)8$&G1HP{dfqsg|FIc3}DWo6qzTG}LN}%RW3%N(XDCnQo z0woB&dhm^`@2g?|?6n;W*p#~5lhudLTt`jC`O3IEj(&ss$tR)eCR=`=*+HlfqA%dI z>cMdu!k2~QounQ#SQ(5(^BFdT0qqf%${LaEyXCBShkf+UJ*O9m(D{U4$R`7iuUeGd z$?6)BBXcc%x=fOr*@eYxNpv-OomZ4-23D&j9k#M1-{L^rT+DzjoB*vU#Hf)ilvu8| zmW7|De{^Qny}>wW4f$)@g>R`#^t9sF#cY@}^Eb2mW^ zjf?laCdOIL7HoX+q{cQTaEt$5iD@KenPf#3ac>NQgZ}=AL9%P{`df?*_22ptNdRS2 z0=Sx2%-gqL6CIz;kZaOPrC+}I34Y|nB@UCD{bBQatx}H-dp7MFk_Cu?berc*RTZ{P z$Dz0PND+^8DE{>I;P*o%~%<@&_qylCfm5R z2S}*U?pdDH%XEv;Ia0=$jQ9Mub*Uv&YX1Zm$wRMPWZcynyKv)qUiNfr+p?_s693_^ z%`DOUcqa0T+3NPVgmX zlu0N)g$)G(luz5QY`6BJpTmZ!_fHk>C)3Jb=~G1VzECxKY^Te|>N@MTQ}wUYdB^dFX#rU2ZJ3~Dm6C2cA!~BmE5DHWv?X)P#&IOVBuyj!DWX4EF7B}S$(90{q#8bW)2&nQQrI># z^_N-%Hz;1{cb@p>PYF`of&jW0QYgCK0;EF*ebb8c#ax;RTm55Km|@MTXgXT*%^u?V zqeNf!6r*ob7M{Y!F#L=v-i-U7d2M&Vz$J}aMlvd>&`KIOQu%a0MIYTXcu1xk(OlT&$WiRwrO8 zxWL^24Tg%LEOD|e05|S))^IEvWo;yjLR?e1>&3uOdnJ`O0X9^({S(*_CcgN`6O~t? zfp8_b{I`?z4%8$w?<#VVSfmv%fZM8%1^dA~#>4A^{F{d9C8pnY;F&q3b~-gX1$ zC1G47Ka}+7_!Vv|KZ0^8SBENljDkf|syb7Eun)H5V&&#Y&xa>#lCavdJtJq9kG;92 z>-!O0up{`edG4-|KPf6cl*joWW>!Tbztpz}&*>_Sx}V7YL8^Yg(uuhUiYB?U1PJx~ z(9~E?t-R05;Z(HLFaU^HK{T)AvP+F{5Gg!M3g`XRcELTZTbmYdLIkx|g`ai1sSGNH z$S`{KGg;IBGX69)Rr)G<$^2@Q!_RsK&q>XZhfDFaRCeRUEifBKd&U{fz?)s%ShI?}ASEcCsdz;Mcaa(iEJQ=x`0lpA`YQ(IF zo}+)%*zw|R+0^pQaD^EX(_|*4Z?aX`EfM|L@!GhRqdYmpB~wL7xTM)9EGOOT$8q|2 zy&3}MlL$&oI%vq*vZDM_D2ikE2z|skOu+LYw}0ETtTivu06M-2y&eyWb;I^s>GmN{ z(YwXP&kugfsw?o^EE-PZq&rmN>LI$$Lm6B=RhPp^Pm||Kn&b-7MGx&Fz zQ9bMRxin8SR^d%vnaraSyqKzoWJotQ@K0=Jmn6io_c54)i+$@vgUt-vjX8HZ20CP? z*3XsQrW8P1p}@nE@9ilMwm?PQYLv(%axDPyQd|rWw}E;sY*A-c7gp@PQ*Nz1psoUmOu5pBy62jeU-b zVrfARrETi-Wzd)L-(ZBp?q3~#dh}j>d9Lu1px!JBY-;tNsQJBSf#~c1__kTF`L;oO zn?lrMov#npt|3Vhg9e(U9)Ts7vAW1c$E0HT2TxtdouQk^a8ya8pLv+`6ou4Dl$Gg8 zm=sH`f8&Z51)~3@h0+r{UF7mkjWhxL>tm*Q2s9ZcGg1Qb@pct>2tERZ=P86Swq<)i z*~yuai^{|k?EkX^720Y?B|KhhnqN8Q(kc6T*fRvdx$_k>272`fXYou@ie}Iz^xr7_ zxu^)Mp>RLO_P&179;jcq=~r8Lh#9qYQnVzcxnZ&YO|T3IqjOjgx){+=jw?B3c9z z?Q+bqvrdXP&Q{)$7G`ac@ojMPA$0< zBoThFTC^bDy8XT}3S&MFopCS@HW95d7YlT#LE~ugQ;Wv&E6=FyPq}wu@K{X{1c{9# z3kt)#>vFxiS~Ew#)!+TbZFqBVHvsI588dS`GZflvDH^wIF3gLM1=whY_UPwJA8z0B zx$s@lY9AR5fmuLwZSL>@IVX#ySY)2 z;ipu7^pYgTK1A!ylv@l9NRei)z{7$?TMhabpy*=*(l(4F#m3}tXTIrE&yvPABqs;3JK1g}J^Xr#RTDZjEjkr~7$=`t5AfFYbMY$Uo#SJBKqk z&Q&A{3VHJe@3##}s`-jgZX_cJ0Fsrh*rbI;8-3l=(&4GFwA z`AeQ@f3fi!XdWxmdUn~4-m!cHQnVltcx*#MC3c-iw(wznrFUKDpo%BT!tCx>Q1jOByLYi$IaXMj_=-X<9{H12@ zMIyx>y9q0TW2+O-h`&&RZUy23X()CTsgYh_wBN4Vh-N%iU#C@_(f;>ul>tOsPt$=n zI1_g!6Ex5}f$@HiDOi`W+db?_+)%%6Q@wl2j_dT4CQA|)EzLi%rm1xlm?c!P>|0!;{zwIay%rmiySvfU<$9ryh!?u zQ-48L|H^7=b{7Bq#1~tHLV$f(_E>^^><Q+*N6&OjuFfZU%3hIj^7O4os;Jq9!U=LGwr!3Z4O zu&hu<*+Uv~PchH;hln_0K7J!?(HYl2*`r2POuN@`zsSiez-jJ0qV>am-TUDveVspJ zF3sPe*s=M}yf5gN-@FXH55sw3ACIvUWFfjH0f;eKnih5mIiF#5%3$f%45$CHtFWK8 z=->AJ!&G8m(FYnZE4WjgeJG=?d*s2`Ks9)+^tk`LQ1rfM3^%@0Ade!)VfB=VXw*M{ z$Gm^Tokg5%xjn~tY=<0J#-&1eAov@D`KSnY?LB<+dHMG`KlQ>z-;?}vir_m(&+TB6 z8wocJ*rgbVY$y(V|2hXB>-9J!ruDntL84AymP8N8QXOpkKsuJdAuv@0oR3}OdaSYX|r!xE97YjccdF5uv*sgE$r zdtYyZF5?ztECE`v);b-MFj8&jZT=KwTEwnRyWVMedTb(8<31=svp2)$lRmqTzNH=K zryPn2XNOmfalfHA6gktop8#lv`;+Vw{vTs(CmvE>w>B~+??lmb5Lb9dN~wxpiKXjn z+{;Wflq-BMhzUMw`ecU^KC)mk4uJ?;1DM2C@>I{GXhA(38qt({MQNZdj3BxA6-%xH zxg_gygTkHMm&MWUh=+wns}Y-4j+F*s@oQ6#9=PV;Cmho~$-af5(R)&?m}p#wcgCpI z#@}W5TUU^;LWOAPZDR8RQ)2#GKN^ShW1~SG_|NG+lX})btijx(U{6LLj*xXhZ6e&v z9)%0b6}VD|YU&rpPrD6mCq51h-V4AVd`#ji`{sm5TU(weyo9GjCPa|;GRe_tveAu{ z;s+paK|1;&n~JcWrxN)^MhX%Gk%qex4XCw%3uerMq3Ova*pPPBD6C&KD%o)duhIxq z*br_rK>et2D3JQFG6&BZks$ImD!r8H7WtYnvGfJ2?1@s`JN6goIcFntiPRGY6a)I} z<$4G`>Z;6~!D$ReVmi6NUw9MKE&Y~)AI>k%o7z8@&n@UnHU5j0z6AI0bhI$uC3%y< z1x-q1sIe>ZY&?}`M$97r5yFeN{OL-VX5-`cP#r+|#Gku@;m6dx`#{sSr@1aUj~`i} zRray<;2-j?BNi$f^2n7=SO%Vj-g*<8>`{QpKj&%~^yiy)#V5Kyf(gWw;NP#>Pnw3$ zdg~2nu5lp1v7A$F3r#(unG07+F8hzQ(p%xz?^N1ZmZCEJZ?P(Ilx)W>!oz|T#e$rx z>pkA_7_M52XWp;NZTcldJ$JZody;iLQ=-XmP;;QfX=pQSLV3UY!bND5<<+0lQd6&* zdrT-tH}8Fs^ibMdujv!y)!FD_j}w?RrWD|irEJ*_^PD%7$s|Tn$S!46jkN>3MdKdhYJuvM8wAehguvU@3hpRKVwOzou$A^wS zL7peo>Aq~+=C3xIQ=0v)%jl_oy4%H$EW{JU6r*DiC}4HFpxdGFF}L}~@n-R{08I~+ zFA}wF^I_!aDc$Q4-I{PPzW7UyfeLUJHnfV=K<0}fuS@^_e$Dy)`Yj;NJm6kX>F^Y8 zKU%y62Xjmhyt($ihQ9{Jt0MQP-hMXO~1p)tr`O z<_}1iKwMWP>8Wt{K?ltx`uR=jsQjQ7Hrzzk!tH;ku~s1x1_c54YL{UUTIuhprZQB* z=|_1UV#ZGK^+sJXCl5-$rNbqaU1sAT!iu=>1A9y-`jB(@s=095w_;lseLSZrs0^ zyaf%gPFk?XE#o-aod}2H1=Vx0LqWx|JJ%77sKlUd$u~{H)Bno-L!sC!ESG1jBo17n zItx1EP1-mEn6(A;sfj{#X{!%uGMWrva3-}R-g67TR8f=GRTIGv*9nd)k_tKs)bs5L z@YTa){QZYH&<+H=l;p%q-0nGroUd1H{|N{d_l?6%$Oa{(!D+Og;m^*u_wQ;A-D%ozn(tEOZT6>1b;FA2w^nA7 zsIq#kaX`VeMg|3wxg!GyeD$$IWn)gy^uCg`^J9a=(cj4* z`Q=8K)9_zOk~-uC99#vW27yB|7k-b-Uqqv!2-Nge&ujS?k4tipDuLsg$l%Ru-^(4^ zbCXBDvQ7P;)=9+?O2?mXjrTD8D_#+eodDlEw6(kL$~2Zc6s?F&)*P9pzHX(~r%Jtt za*o69{aDteR#W8D?@Jg%Ese&tFIlbE3(!#A>-gzYw@*EMBm6Zc25oN(AFwt@JUAfE ztruUG`9T$Oiv3gb1wWVB@YP6WVFopJ#}qnSl=mCKm&Dr`%A+=09e>L=cD2PJT3aX5 zFmCK{FuzP1+*@~pwsuY2c)n$wWPO**O8pJ@Hniy@^|5V`E?k{SEYL<118H?<>DcF6 zUGbTml{y5*&m&0HO^@`w#3&$%(NPEm+QzfWbKiy4kiQh=RmF$j;pCI~)_|p%1tfh=QCa@YY4ij!K5tN7zfR~AfxfK2$=u^}c@+OVs zWl4q1rCma!*re|{-v5HgE_qrX7TAc_o(tAqC)3kTlHx876PnsrSU+lgc8PK+cz?}b+D^mM&Lnk`=0)Ree=un zQm?I^x7v*pWv8}H_uG+uq}}Y=h&Jrf=M+8%1#xtBovwa*1!;n2BlN$xqoH~HcJprw zq}}o^lc+7cpq0L(Y=@QCweO*BZLeoUzA64MoCan2uSe?TmC`)IAWWbs7hk>9DM~xV zV6bRrJk`Ln)W&C%O-li))nj+xA7+A0KlU5d7}CNXtp&3^N;Ps7B4S%2?`YxnB1{0Q zaJ~PjW{^)`n zsPEC>Jy~M|* zG?_Usi6c+b_v#_gFtHL``TlXk3m> z?mX&q?wYNjQ`|J($;_F_ufGl4T;WNHwK%D;(u>HWWwxN|2uRJPBXj~uS0Y4f5GKizNK?o!>(PXeebim2RG#-rq!o6uZWiB<;XiEsf!Ss#M zLWHf{X)I9KJ_-GfKg$_x8>TF;d<@ncX;%M@CQg`!PEq0yBb9?83jfw!BfdTd z=U<#h%?uAyy)9LX7OYUpNrnv)|EzFxZKG)ZByiGFS-6V`(eF`5xIujK5zGr)`J5Xa zQ=(BACTksJ?NRCIIy(;@f^NE@|NQy&z^l$ab3DcVI}pQlp?am#v-9ZL`f2AA)S-o) z_vJdA)f*u*F(xP6#YrpfvMG!JI<+f4<_!Nt6L=>*l;w2Ngk%Ly32!{1P5H6SBmE4}#Pg!; zYYh55wh-}zFnf4?>BBqK$$P>V5jn{I#0 zX+FFW&nh){^mYFrK~p=-lH;}(%|o^|6o-F8z;I@rDET6j6m%q{C)SAjE#Dahh8K-- z?h{Abi_A8y;9#eD>Cepf`q4o?Yd`oqt(>i=#hos_yPUG7$+6uhy%-PQx3kc;1kdV_ zvB@Ha&Ent8?WYilI^K%WkXsxy!xj7_qxAcp>n%ZxSI12CNS(0-*ZGC)P(Rj+61*5k zrkj3CmtWS7Tc0~kjKS))PrFZ;XT*4Pr0a~V-C_Q5ZHeN1{XGIXZ}Tmk41{;9gYWL| zz_@)VER2*PG*ZfPB`b>EMgokqXreAUuqvCgI&72;nc-8Zx0%vxG7vJpSs4+pXpUK| zsI6K&xjZfLfI-P5;_DV&Duz$16sO6EF=tyF-#ZXrQQ@BqS+3-&%e_fmCb#4AF0HaV zZ-ukJ_ShIyU~#+0ciEWDO&xawbD&<1&PX|>=z6)Ohs1g0+J3n28o)lSk`H)UoLOef zNswzQgleYu^!k^qE(WC2_O#$r`We~4tmoRI*0ac3*_XPzp8V;Ys3y7SiHm~+;&7+v z4fA|>#sBb;4w%$&KfC7C4@i2i>HENZ8~fPU1dBu$aWFw5 z4RTh*1CcPV1Tyla3#pS>Qq+cmur3eOKa$1nKL`2uDR$OgXqLKHd_glHAXpOiSBG{= z7*=10oEX-%?)SVeayqtU$jbaGUPm=s=Vh%k*aJQ!{1_By6nk83@SY{mZ_!>{jV;rLE=R%`ozs0>^T{bNcp#g4L-oD>m_JS5I_m_iGOOOgH=d zt=}Fx2~Q3W`_5ERjjxG4&%vf=x?eZ`_#*&)q0qKgpTi(=PSKi4{Y)KG@KyNr9;@OJ|h3AQ|6?>U-px0fg2lZ+lmtx%M`yeg}+53 z$0staT=NWxo-$fCGAB6{U~`IBO_O||Zl`2-`qri!N2fPERr=XZ3yZTJI`DBh%)NUv z7A}u?iAP@OnR{R(YQtus;7^Hgo#dZ`U$|_&Rz2w#t@)qxOTRp@sC`|b$tT$MS{~_4nA@_jPWtKjv+G0f!=YLqCfY zFXv4AhjttAlnbVVo}u&hgjC)&%aev%;qRCiD2SG*S`CA0>y(8HxJ>TZ!OA3gz6pVD9N-rAY?h8zi44B z(IVVjID06doc6DGlHoDS1$U2 zIqjKVOQro1gz_DPyDcdu>)G)-KC5~&sRMNm0Y56|hucVW=+D3kPntLn9c(&+%^I)` zoRK8ZP&Yf>RqBr{*9Iem0 zxoVoXN>^Aoi`)SBHtGv@-n4J$Ti}zRoPE*(7YTi$j6II7wBt8Op<-K@RL&q2psCRw zS+Xu5v%6aB`$9Ee@mzuAb3J3Y`MBMT&Ga|RK)8Cb$i*U=Qe%`06%iIMskfjD@TAc& zSXqtQ^M5P=WpAlFq|VxZS5@pQe!&c~*P9Mt?USPCVS6lIS}i$N0z9=l6U)lsl9GVo zV^EuZSCPH$eR3byyDG4$#sKp;Mmy$EYc;FdGb3thAcTv1+@3;qby%`h_=C(qH8Nak5-04xm|CzW)=J2 zAmqvK6_wsLguAz2r73}AIN&)%#`%OG@_b(;$kXvKLzY&WGPY-~67m1C%l$Y|Q@S>m zp;R(nDT(91)UOmuaXw{%NYvI#5~RM+1+Fz%4q+nfPHNpw&toUp5f3>d=s}@gAB>-2 zT>_{WX#Ur4)<^db68qg%y#C|j(F9H%Li4e%PIm{dcwx@9>r#WFJj4tyA_o8P9>xQ^ zx^krJv;H4VXBiMj(?w}y5(Xb2NN{&|clV%!ySoN=g1fuB2X_eW2`(YHyF2W>-|qhE z|J~J9x9&aXIZ6&m@0}AA#q$lv{8<~{5D-X{us7>tdg23(RB**H*eJb*_bp3`Ra%KI zMtyo(_sz?Fm}r-gifX0hKV!o&|Ba9Qv__iEXE~=}61*vgPz8X4x~Pm)KrhiO;-4#mV(lF-<58#fKXN<7CTGZgIQ!Jdg1LY@CCvTjgi9da zUou#pGl`S}c5QwIV6)LWR>x^oa)NtBWmR|*hPF!))qUSHJfr7%PgxTe+4H~q2Dij! zo1bl>fm1-TM1V+3L*3Hxyd`J0Iff_ir;{2DC5sk0$lPy`9GqVKyDw1a$I zml}i(2!WzwWN^y&ijJ8|h;%mO*-gVB{M|a{VXP3{e1^+I^?$3;cw2z8qyE(1^?Y!F z#H<9~*-R9$H{5M$mE0h}2r2hqM+++i+=an}7%Owpm~c3=Zf-QXB@w7s_n=a$O9lkQ zKw&_WjYo$|0d^C1(c0cRY=8L0BUoCK>e==_%Q`l%G|I>(@(JSQcHH7#I!2t-exZzr zvDq{B5g|ld(3(A>$LFvvREU?x*m zcHy7&zWaaoUeh!lf}k z45OnWXe%)gO}`A7Tnkt&^`@A5-)TiRsM)#IimKU~sel`-D@6`*%g4Bo^dVqvcTc^o ztbFQz>6c;`?0Xs###7~qYwoT-4L!GmON+FVfB+@_dEGGz*l8T*`8l?5)EH1v0o@ocWCfKVOU5lNqTj!^!~^-Q?1!jpY`wQk8?^n89Z_rMmxt~HHzh~)>=t`PSY+S z6wFJbV*G8c7JbU3VRgGtU}Q>%%(Bp7O9hh706ChWf*rmgUk>L!qg5rDw3gJGd{2d; zJVBqP4#Zb44q1LDARPfoH}m^`Bx(6Y35h{GF|P8tW-3mnU(Rj0y|4eB<`zKeblW3u z2@R7Sj~yf|8BAEn%^m-1dLK5zNHH}Vh%Ux5FTB_os=>;L+Sz4l@Mo%g|`@ z{^H8C;r#6{8eVH!Sd7{Hom*5~@qd;z$XG#wi$(bXZbEF5;?!b+#5jAGSMEa^vR{{; zJ6$vi&MYkf73tS}!brLFDzOeuroKuPY_G$qd0b@`3%!R7dk9U@yrY-e&i4PT^&@f( zs@pK@m}Z*x{U^1)y@>Uf#e_o8xZ9=MeQAg@Ov2xhSD0I&)n)zrL|;v&;;jFL4n)56 z&nw37x=2%x2I51j-Ao*05hV`3gJ4;S@x1ACP zdp4W;xlZ!%(6)e#^aij`mkSAqK%6EZe7}?|4?^QfKuXqFBQL(^Bo7L z%k~l7-Jfm%=XQGIEHf)kHyQr%lV}LnYW8k3yGIlVZmuL|{l*FmD&h24A1gTu`t5WOaN&RVV=+4$-cw$D;fUNpw zsQe1ZkOkki%z5SgW5s(8yz=ve-*$mtbKQI6?^~wVl!!v5Or?&ROT0Lj3=b)V3ZSvCB3`_I~qNhlO(*80=IDZ=P*0JHS zL13L5=5sP%qf=HnT|WapP^($jyT~=VXkL837o7WN#0S1`_oSfs{1YvRsf`X1$p$nlk{D z->}H@o9=fWId#4VH*tXiruZ@y)SJ{VVsiZ}xfp6=RS??$)mJEw&tm&O^E^NF-l4C1 z?kkVU`cmqH!!9m(CiSGz0oy->Re<%|i>7J!tbf$+gHDgH^T#Byq5>|J!t3RsBA2%` zsxVoig4n`*ZI(R~{kJVJ@TZ*;_;HYqPP@>?zk_v|;a8`3Mo>ec=q%&Ei@)#eV0fLy za9JU3H~A{PT><)$FaR7LdWLoz3CYihFwD)}dxk*+?g|ELXWuqwceAPjQO6FWd4;3j&rJ&+t`%x_Cf^U#1aoIgYMZ2hH> zld)##io?S^-9o zFay7na;shFG5OlUhRdoHATPE*{)8{1WwJyMas2~uw8s3Rv(FuR^B}uT!>$#%uvqUo z*vO_{Yv(<1|O#~lWAOCr=GJDzr@uCT@5!qOy61*o!0lv|HE&@I9%hURV<%uh zjaGq%dls@bA-2~XtfgpT$Cyfa0kp;XjS?q$jlyW!T#@C4VAuu0_$c6&I;flKA8Yf1 z>5O7Ga@Y`FPz_iJ7p20xvPhp$2UCk7{8RM2VJVvh|)r_Dnj5BjIN7OB; zWWQc~(ffRFrd|heTb8KI-`_mZr-+2yZT`bpA_w#TXv>upK&h@I&bJobQA~QjVWsV2ocvCTf?0AR8PYyulArj$N&$!por{r54y5iJ0ICfGCrP)2jcv2= zF#-2j5V*hstWRmGaPs^S`#n~(UbRPs2V@Mo@E$KiMQy{(zx=g&KMIBLTQeOmFoI$c zD4+E0Ozd0p1g;X#$>+ec77nK3EEpO8^CP9-MvMv%KY8Mu2<@3KHA;nCIcw{tHn@&A zZ$tOJxN)_Y9 z*(>WNd|;h<612h=4$I*~xruYuzPAf)0tscGY>B4OPv>@g4Iw>8-4Go@(1% zd2$X`r|BCm<^;vY?;xweM)`_?WIfZ&4UsmO2%Hp(_$4nBe;Q7>iz8|C=&ZD}-zentq# zEuT??D;;rA5kIYA{;cMd!Evv%{=1lKVyTO3U1i}^rxvQuktgTh2@~|t^Efy2 zr_TR|!s}ivEO%-XGtYdEMneEkrHpUzSm|a{n6JM^1AAwH%r4v6kPW*nK4tht389MC zd`moOfZrH*CrciZqziJ462_g@O1#Gigcye~4Da~BB@jLu=^UCin8PtG31o2QeBxEL zmPDnb5rNbdku-|};`V!02G-+mHY;gubb81A>wbCH2eI+mEwS`KcZOTila7ic64%E8 zeJ&k4FRItoLeGi(V(mE%3g*k(;}kY^ayVeB5v}I55-ayu3Di6bX3Q$dGjDA^`VESE z-!=pa8s|P=e}SkkfzR7RB^Z|@S%JmJtWnTNp zmMQ4PxddrN*In_GVa%eAB$=7%*ALW3V%@FJ(^*j;XaOa;A^Dng>jFl`H$8OPGe{YL;HKHmlh|iC^EsySTfb) zB1rE$>6vRfvVF$1aOE!=2JA_C9DEo9tP6&lTb-Je8GL$c4~x} zd~^9MRilR7bLp!Yuj91MYc3Xf&UXQeLRV}!ld=|(I8CQE}9KG3K4 zkEuM~&PvktL1$_`(s^4^nCBHeqv#}l#C;AlCl2v`qj##3__nu=J*0H>0IV*2_vdAr zx5b>3v=G!1l|bzp`~{+=vq<}gSCnqJo8#54!YM&2cMX~VpAZZsMn(dI=#8h(>wP_U#C>p^Db7& z6{{U?<|-Z znFqRD1q}-6IOrKO{&tnE(?1-&J4N}O2)*LI1%GUPr!mNktD;b~8vi1@s=E%lAqf42 zWO_#PxX(j$!wM5Wvbs9Os9q^CS->vh#{pwR3p2%BHY@1z5lw5Xcy%0usN$pcu=|I{ zjn75s_tYw$mbw2V6VH8SVWL>~Fn=$O#gr2bc{iX#S2 zJye_rY!F_ZC6B7Y%r&r`qA)$O{0!&HjU_$b!C?pxYlL9LXB`s@knSp$bcQ`=>g%=O z1%tZ%qA~@%w^`qF_pTSlMJ!vQAe|{o0JkJ(O4bbyphj*N5$2nyA&kl(e7Hm6Ch(~F z_;z=}zls6)`;(CnhF+}jKO!|+(?-`tZmur|)L%4*omFwF_J$B{BX$PR8y6Z@1^1iS zMd^Gcht4F|m$8Pn6BYiGc@R84)sDCzR>_=ZenVO$bJTyh5NnD=EiUaJpP}K8hNLxF z`EhSSkE70=aM{nk!9CpVkKXH(_Q6tj@~tnzT`8C77M(vD1E^)~ChHwy4J5`y8zi6u zRRm=&Z;BJ(5ie|0VafR5a5J1*m{OXu?k4h2_r94sQ;m}&sxexWBU2$)4JvM#-9DMC z3Vx|}{K-2KVpf8lZ7ZE3;@^5vqyZk|`QI%0FL6Ab8pkyqdgS=awck>GUB8{B{ zyaW|V&?PjqXYN`c_W(!M<=V}hqE-IEf!+CAqdc$&#*UIGglL^N+ux#~VWmG;Q`rda z(Y**xg(Ucb{UYZVT$Ns=qp(-g@6E!|!o&Ahb?C9eja^}8=e>QB(VBw`fz!6@-FF&f zP=HbDvskrC?EBaW0n(~l43wNsd)HbK77U_RPTtrrAE5=D36=h(Hq&saqPtw?GBUF) zA4Q`k3E~_E?K6`NTB8-bAVNG$?SRB@j!Z;5@8)UA_U@dLmavzyLF_hu_l=OV&hM@4 zDD=Q#MeE>^zwVlIH*hy9SrJzV4wBo}g@Yo*_9{=ty>c06WVKpKaEQf6uP7{@(&2;}>FX%f9S z-EOE}!Q_Wy*JR2&sP2B1!A5QYPpwj;Nw)a}8RU=Pd1~M67;SB`YXTy>d1Fl(tNRh$ zaUlrnx6&%-T)9Aoi{w4%Wa>_X?0hKNBboy()L53RW5Q`z7=P4cM`gappJdhi5|y@} zqMF86q6@QY$+peGLBS&-{I4#Xbf3bXBCoI`P^YC`-ipY@c2^!B%@C$-b&KSVrOx;L zvbM#8-GOU5IOc{hI!!R*q^+HzK|77?1+sM*#zMJB;S=Jkbhi5B>3S=$GtpZB0`;T} zVT|dD)N0h42PP-M)auls5n@wlm>BT*0cM!CX5>n-@Gwqd0WzB&hLBPO1b`{}19hd1 zL3;oa7Fa&DAgeY_n=y7{`2<7X;y_jo9}+5V1+ty8WS1vVegVQ}5Qur6;^$pix>-4L6?zGs1Xyt^EJPebQu7X zX{9pD)hOkLtQGL)PmJ>Gz>=F9156BzyXBvaIzbE&aB~|e@l0G>i|(@fjn0odfX^}( z!)*hGUjdZn_w=+t7l99R;yfI~g=$ufvRXVeLk5Hi14KaK+P+Isk=p}rmtTH@!4xbx zIuJz$MC9%2e@<^{euhy^?zdAxhs$we%RkKB7eAdlX^^_8LwsJxVvYlL6`fFJ^Le|B z6gQ$maRoOu`UKMC_x?*jj-+Sd;6Az`x$)cij@rzn3ytedf;MIpMF`h*h!5tvhJzaJ zh%KVSd@f1zPkg^#GRP0c)zCnu=Fq7^#EZUCy#5DQ=6aApmxdcQ0KG6H;uG#7LPZ#M z9tckGxAL=qLDN7Jsv;iFw?lvWBT4KgVoYd9H`KxWKN|dA6z1`F9nla>(nonyoZ&_Y zNCy5&9V|VfgNk9mfm?NQT z_8Oto{a@3+S)wg0e)wupfvC2@bgb;vjGpRBQxEPAOA$9Nq)C`*ALgg>f^z|p^4 z8=XoSq8X7yez}yId4;dv-zkvSkmHR4zkm?^EF(ssQj(m^2~T+aJY@b* z1rOJ6jULo&j;dWAH^Xx27B}N^f4}~bTDRln_Okv)Lk~RMvqnPH+W%!NU4}c>-KSCB&$Nm@U8+ll~ZNSM%m)@iaSUhdQ{~ps9JHyK4*bqT#b{(tVSc|5jPRD^8i;k#EBWW?=m$&W!!&$bLYfL2w zs#&w2(lyNTHUF{mBLuke_8o|0PcULmgcs1+1osF4+Uv@Ogvl}VS)7&)qy6k&x%HT6 zUwTOTd{;dN;iA46mcVR$i6Dj?sNpa$j=(K-E)0*)Uqt4;Jzlh8JnH>Eq*fmwOr5@) z$!-keFO@iv$TlL|1&3cK5+nlhQeG#MzgPe!H^R1ctEiWA8K((mlYomenkeNVP7O}I za*ZPo6>5av-WqNk*fsAGUs~vvvoW3h2(HQ`iCdL&Xi7x=-p_*@KE2y3^|xEXB$}UR z_|!H6&zZ|l0piQ3=Q+v=!NTz!U9wM$y>YH7Z1pQABx@Gh^~c?r7x}L(bm-uVC5W(? zV4z+{Gj!A;)2KQ&DI;W}k}21ql2rXhkM`1Kp#2(K$TQ6E{UEo@;q^)B(JH)vo^Zgd zu;NZ_k`az{CBa#z7)8Et*1EaLKrjy$O#}WWtUn>JW{3FYk5m9WVG{5$nH&gVLK^0sXJG_%oqwj?G0eX}Vpz9*>q;y-XZmx>p zTn~z7?B)P}x<3IViP1eT-n?&%9)y;I?jNhNxAC%M>MKK^zy_~2BvkojQvxPJPrnll z>_CbAmu_8NH#FnK`es+zmd(P+PWRO0utDkrhyX~xH!*`hg_Z&tsE-utZxRj746o6O z+FMxz(vseAontGC&}Of34zBYzqwfiGjoU4_Z|?wR&8V=dmWrZ$KVQLFI_ygZMVW-N zwbk;t@opt@ekLH=Z$?hHjRbMENb|!9;<63Pv;H7Tt*ACkxHxhR-{`tvg*KNP#H)zw%^))ge4Lyp$N0?@$LL;DXJF}e z+)w&zg7qi(O5f8)asO9;m9oGwZkYtBfDxu3?{4_cXI+f-@MzTIup|wsXlirvv<3V-|Vw_f?n^bnH>w0?C&q%n1n5Xvx4H2pz6>AfM@ zhHL6C!(DVf@0dif|7&N2NIQ=vv%|@u590YpN$U7Nv}A*;9YaLA-QOl_mfsj!b%+r8 z{>8rgBc5>^s&xNGTb>fkoSN({N_Q>yaLuU{x}(4q=#Ybr$0!r#JY~OnRR#Ct@vjVp z+*@105dpFESQVQUu=hhwap86D;(zYZBJ(L6Z*@~?{-o^FZt9lwXki!NAHn zQ^`7R_R#7pL&jVKr^pJX@C#;~m8IK>IB3K5I^N2~RupXI)K^6AcNyJY?wZiX63F`Y z4FlIX66ws2qJ-Y?-=4XIf~uKqb(a2IpfWqK z5|dD9NtyRP%sD1Q8j#B*^@<@JxVNxw+l`GDnlo%hBr^oVJPf%kp~fuJ3!pVI@y*>^ zwR0+x?V7?$#Op=IAe_j(NLlx>Mp$5WZtmQPkPo6CW-vkd)O}?i0KDge`_3Rs)Vao{ z#*PT%9Uv^ESMY!;D5cb@Uob!F@z)&H5Lg{~;eQDNfQgFG&pmtJW6}=&-~9E<{*L)R zQ`H4HH-1AM#VQ zpi)MmbXHA}yHLJII@liZ>W5qWSu#tQCt-kw1?gP)lo8DAku+kylLpus5r!{B*dd^e z`B8+@(j~f9nc7IC2!Hq@yq>>^;z_*#+z%5gri#u`7T<8L1v98K_7zyr;y=UO*t>M1 zQUToPmXRgv$~@4?amgAvntFRnb$%4^;xIsA3CpQ%9nzEw&pX5!Y-q6c;a7Eu+0?pY zOI}))rz#^}l0~m;g}4JQVWBB&aAUl*@!bhovb6@M-Jh#A(q;a_o~lsfiEq@ZwzK+w z)K3tN-P|uk7q1wrwE>%WiGy7TOE*_XHR{6B-FrA2=dC%7FI2a2fi%=W+pmEc_E)GR zeXGtU;m>Cz%6#0#X!vrFZXTz5pA%`yw93|V+@Fody}Y82>t>ta>SNffKkDK&)vNBLu{DUZ`LA31^wiaK2ia70}LG`9_km(T^Ama!XkYFF!0sk zzv#^N{UJBKt6)-rr}JK?SKn>@&b7qXY|yM)>!A#!l_Lb$4YUm33(ANvaKkACmu#*j z_nyq|;rhNrG0k4Q>Qrkyu6`FK`x&XOdYaS_Wkb2id$9TKR~ki909KuVLObdQpyZ+l z+F}`{1dW(Q38fYqPK(3%>yTkb%?78aHLAnZ8NkOOvqhUXx&^qa)$Dz?qZIR+u-&Y* z%K4<-yEb|u#*y3O8`^WVhka;c@C+cB->=H?s!6l0>Na&xy^Jf15RP$-vAx)2e zRyPa57p8Fa`?6z|IRVN1e?d3+Qu>n23M!snz0afq>wY;ugQ?J(n1?ABHiE8*=4dZX zxF&8F(sE1uZx-p2yB;`^kEz&)Ui2=EF>i%!#&#kJ(c?nRWX+EKkE2!*crv^%JT7gn zEThA`P8GfpTBJ7Z0HyK5{`B!nky%9upXDQMpo^mt{~(UDfSKuk5Ju3eQ9n`x)~5=e zJ*O6KNaz}k5~Bpac-AWCuhv+Ud%Rg$uYaH+zxc{-;oBuZ(PfOyE!ea&9Z>Vta5m$j zZX+}=GXOm#1IlbMFebZ^4*=lTsl%f;tdXe>va(0NDp4kePR=B6wZ9IJ)y3fqR)>dTMTWGm?+&L`=+TFr=x z`xLvAJK~IO8S;W!2BXN?z}%p2d|l-=0GG)BWZ4j;HGRecLk1d-y+r9H{$)My+xG7s zN2#KNc=JnO@Bo?h_q2c~bb;ju=VnTRlqzWPk+^*X@!#bIsKT!@MTMi06X9HY7sl{$G~{qosKJpQozt#t@_{ z&F9ane)RdDPj!4Xb#(3l&`iK+DeOjF59qATbvpn|IG3Ug`>?Oy4-3fO z(uV`>xx_h4(O2}E(6lqn2VF>2C??)lTcyZ2T5Iw8w?A^S_vRQ@Hd|mAXJxdkAs~S6 zWWRY1B{@KW6Jy4%55HYoCEd-OAI!bMi%@{_JSV+M&cQ%kWC~Tc|Kc9#^A+tOM;w zMp|x>fyYzQ?e&3>tqSGiKu*i|k&(?B_N9EDz?S-PHlU`5pGtWBWW(wn+gI+7{~Fz- zeHS00DxabXh{53S`s`m8>Ai%ia1tavthS0gQ70tUxE?qdNjT2}?UqmE%Yj=T3d#&NU5PmdpCAIpDwR4jFvk~xAYoTf`X{fzNB<4! z{m5kDZ1|5z@Rv@n8_ucp;+HKrb^HJ#f~v}GTT z)m^3{vn-lndF?tRgW@@(RBX~$AnC4^K^B2b&83ck=^_*(pP&suo8NC_+q*>lhJr$& zCa^sur13$9zfxd6r>x>$r98n+dFlNKh8E;@Sv{__xag4$Zj_qm?~yX`IYq)U$UF&U zykB9t+pj5OcAVG}<+n`EU)?IW-&(y6tXUR6Lm}8t>)3O5W<{k9Wqzl3zZY`=k{DnCHIZ^mH9>PfPDcQ z)c+0a4YAQSA5QjK*BBR-k0E-WAJ`LG3XUPx2cXu zk7eB^96muE9v4q#w1&d|&2s&*Pus^7*#}64u|~^wnsda*W@U4yT^S4{JErEtp)1<; ziGPA6?}mpK8WiNnoG&w2#u0bcPG*J4zb4 zy$#DnmhK2&$AVec&(rsP3sZ9#$G20q>+`dgDmnXv2B*%HKnKJjjn8GWxAtHZg(FH6 zl!U8bC1}x)i&wwm+oS2v+tGx;1oi?G24VvG5UH284wU7FvAPKK(#Ruj3cPZli&N1VsTja z_Dze---UKy=5@#i(|*_my+fW6HSd}|29%}B(*c1IxICr|hAA&7>54D6#+!N<|M{6HJA_%98bDvRo}t+E4C{_CN15^vjqs83ktjqn0uWal^cpV0icFu~g9@ zo1G0KgE$|Kvt)O}DPX$w!z#neOjxT*Q<&(A9rf#FbjEj*+I^t;cf*76CoQ?P?oro* z5{+U55*+3fjf-}}o4?(hJHq^`A_HmV=;c;%9jn!laN_yLs9+6(8&|?Jr_A`dgf`&f zIUX`OXemY@Yqbv*(1AVU5d%bgC7vp^mtREvMEc)-mmM%JarxfYYbJ1Yx-6tCMEw%f zSNp%(|10I37o!HEq2wk6mAS%Q{~G%;Ziu4VNLvDeOEQlxygGHt*VKG8|z z)ht>%{6;$1D4{Y1x49X$bO^1^|E(sgnZxM#XAAjjqtSvuV9Ib`S?;u|ASyc68!%@; z78TC-uYa2FjL}uj^z?Eux`*Q4O`CbM6y`gnC9A?t1IGc+&<{Ph@(^|ectD65^V1Tan~-Hp$`af!MWS=no~G{o(=ahUXgW}c zQd)*Zg=N>e+*Om>66G?MX%sDuAS zw1i;S-7iMO0|CY3NmS8gT&^V1)yGRQIP7BU?I0xc0NjjRbv=~?E9a`^mWA!S_|9z! z*3qIX%-PeYv2H19T+ryS`_Ybmhoym5o_HWySIcO=pa-_}^>bPTKOFyA=$06p>P2`; zKHEs{@f4TXFt11<18q6z)JktGf14{&u0tM^gsa{I=jn~Aj+y0*Jk#Hn-@@aO$j(6J z=zVU4o&V0-h@K)Q!eq~ffJaNE)-Wk|(jwPk<7CGKx(Wq6$ z9@MAdE-_;jjs8OZ?_2y-zW~1^735kR2_=NM%py2Khf+3+gNJW*!>PY_F6N2SAt=N* z(6wSLNWR)^zFnnVBMAovE97GQv9BuE9=SQTIJ`+LjDunVx;wgJKHPc4XNeR2In#Ok zx9)vAe&V34sgv#Ua(`O+>GVWnvXsTV?dqx?D<`e?+ryO5ka3>HyfwS!4;Dok6tv3^QD@75Z|+&&h1NNY)p-A! zyc>wE_=NtvTv8;{XEvz(O~j9*va`Na{`4sLs;y|n&aB_Zf9REF!v*S1FQqq@uUxWM zIogbr6diA%5(8i>QFd~`;j!n6Og!ApqTFTP3^xWqL^mItw_QsxA9yx%SJ=58HvccdJSxAcR14t;@=+Y|Lae|fQ9-(uDTQj-lUuG(g9UoGc8dSRn zuA(7X*3aj^F5LdbE$xw`Md?g#6NcbS3+^Z0M!+|E>FXD*XVq~H^q$qM?cDP08Z5k} zHn~y1)hdhc#%wyUik|A%01OByQ_P(GA!jD>CLW9r_I`NJ9XSAe5wY_dGfe4$dW9xp| zc8H{R*viAdxq{vDPPVRkSnS=@nVo`=mBXuHEFIkc5+Qjf&rlxB&?ZSufJ~|&4995- zpY9orp#BPcU^@ZH790lWWCrXwJwD6A=N+NAqJRl;z5Z?i) z_~P%|4oyxp>Mp8Uf4(GU@fK1~R4M3Bz*5XSe5&L0pt zUVj6f@11MdQBOy{pW*;)#i|21MC-+OWc0W=PX^D;6l~>qnmuV&%_lS(6+DCIcy;Vb z@JyMxLkO*1=Y?C{M`iTczTWH{`|7EeIrU5xWl3=|sE-A!blfi|Z|#Oh2)-G;wPaZO zJXdX1l1|ExUAH-H{FzvEV4C3B_?fmNg_82pTtj${p^-uGgm z?-lzFNqUNSzxg<%yB&+$(8mAwY(VKNC?vGeK_K$A?}pjeXXYUth-kuXML3eslmxu2 zTzyR{xT=6E(RIV^pA%`dQlmdi0X`z4{GW_`AVr15)mPa=tr-*2eGtT zpD{yJ-W8HS_AI;S^9TKsu(tPY(Kbu9IBo(HgJKw%07$9c8QVwqorMz}1BTu{N(LPf z7CX0K{4hFk&Ww1YwpA5$XR^_w_0GG1Qkk|r5sD<>w)6STf8(if!lV)pYasZZRQF5n zuWt?D{#R0;T`IB1zb5(?(VoLMQWhQU1au4cvS%*fu?H{vEr&A35k99R;~31w3Y~M- zGC4k7EEg+Nq(})A(1EW(obzsF5m&6nGK0qS^7-Mu1>?!#Tj7RU75u~E=Pc1+zMsT> z#;hMOJ>FqUc_k|=Ce}SSv~GBA*4a6arzbc>w)_QtD`WgJSMBx4_Z>Ea7DJ4KE6c~C z#^?<{cm^#lbsb@DvVxPs<^_A={QMMST%s|eV|E&J%bnGBH^-5ur1E_n#g_!1`4@8E zxD^^MNtjyr248nA$wT;Jp^&*7%jCSfb@;mX7bobJ7LpdmwK>_e5BE+S8w1V~zA{gg zny1e(q=O6?#H(dzOwrp?_cwaveTD|Ll4<`qHf1_|^Sb&j0|5wfC53&D4;6ko!43R$ zwcwa3m7VR@SwZ9ED^d{==T)2XGQ()HRa3`2w#p0f19F2jB`TjpP=Qs8yxn-hUX#fPJZ!H&(nI)oJVkv8<|;ELi;C!g@^IcR z&5}zOuK@MDXJ!TF1g=BF1?zZAWMa8Q0vIQcJA^sO4>yIrxOBy0k;Ttc0DgLI1`QG} z>l}XIy5;A6C&8mCo*o1?R=w}^@_M|@3Cl=T=T%-mfZ93JDryXvm(YS=%GRKsVf?vc zghSLPgPYL$QB4ecav#z2COPJPv(q(6a9=;}C9(e=uJ`m>ELQ3( zrCm!z-U?dWv%sC`L&sUA0Bn&{t58rdob=aABT*XKUGuc0}LY$5BQ@p6N8UL-x7 z!$M$X#hjJ)(H=a-b&}crQz{!K^-g_2QY7El#NxmgJ0lqV1lFWk>E&UZqPSV7gY<2jsayEFy%f`C5A?wa%P_mUfRm#S>c$=a zLwdg`KTU3VLX#@c^hSbSH(|YkSH`R`H~?g{()ww`01x>)VETUcZH#14^L>+AWgp1z z>FfiMyQB}o2D122q15S;p~NSC5dug)ntR@yeLuS6+7LC&s(!>bM~tOZr8S>xb3YX< z9cYqug@<`3198F7OB#OmKQceZ+OrUojawSIdKRWW0)V#9p}DB zqprbU*lh-5j+2@<(x_X*t+M0K_>y-ZA4A56H6st@Yt||+_yBNXHW|p0%Ef-VD`e`f z(LJYaVOxm@Pe+gXtBKRL@t!bQLk4N8$+EqQ(o1uN+xuv!xPN4Fl_n@Xub6c>$G+zl z^ZD;gkNm^GCz9qo{$dpA!w{$mqU^WC?UNFMRgQzI1q5ZrS_8yx2&{Nf4USNYxM|eV zNdw23RVFKur>7E3ugs`Zto1YCO60LMBb5q$n-0UW)iHf!N3QLA93@X)cwLKf1a&3S z*?Z&JxWhlxY;9AiAP#){;dMxczy#eBCf@P*>yW^*l>+9q&MHQ}{-?R^)FJfoHg(Eh z_pE4GLgzM{Oj{TKJ`st9C}7P20!PV|8B;Bp_3toK_e{w)Y>o3(0hPpAkj7$hOiI$5 zJTg+#^^DcFNRdy0JlssTxRlU4`rR}{qA>>*{xuboq|%5DfjKix3k38G%!M6@SIPw~0kj5fP?Am^cp_DqSS$ z|FZx@C{)m=VfKRQ)Vl9Ta3A>CJHKNqn!#F++i_u?mD`eQjM*+Q_0Vhz(~f(Y&93ri$#(jww2OU)v~3*UQ=#>N@_ zAm3QxW1JuB?i@E&`hH{Z6Z(7tiwAZ(_Gfy-)E{SSnujL_ehGeOSxnk=Yu8%tNJnlB z%u|FV{Sd}hE`I^KMnshwt!O~KnB5FOA`uXnk2Y$2Mf#2`g0nUvTd(?8ih?EVCi?i` zZdA1Y<~#)_|`LWr_^q;7Zz?A{N^^t-$zgxd|;F^@^6*SZ~$Ihh!gZ?}_| zeAtqG&|{?p?4YB(aEROUuD&Uhu|bhf=EdM8)C!(+;%FaHEy-+;tVgga!3LGAmL1#O z=X(bp2oU%r_)8rF;JGE>M{c z=z$E^yZd%W?!Vww+@p{%_sg;jlq(Dyf=Du$=A=-gZWU?I*2w>%aAc`b2m_{1T!y1` z8Kpd{+1Cjt;S_#)^y9{aVP~r1!fTvu0+aUlMM6?!k$0UZ5^`Bbn@c^~T*HQmByJY& zElcDB)G`0Ch!~b${T&`$PR|@$GAmpE4O4S7;=Y04Z-nDACHqUplvyRS%{s1cC3$82I}a662VSk1XPDy2_hS5;}hpBUHuQb}$bj7yqq++XL+jde>#kOtRwv&o& z+qP{dy=w2%efrb-0qc6loO3+5`DP<2x+3qdS7&+J=_~DwFLVvt&Ezn0TYe&gRBrm3 zD$u47-acP4s)9{3gmKM{`0ixIwAVR*T90_^TbkUM=`?g>o0f|8mE-r8Hj zHciVCU92nx1V~qD4gy0AUa|%Lc?R=y9P<9yzz`u8M*IN`LtJ_LNBmP3CL);j$nO~? z`~IF8TPzkqh7W#KS12Iz=)DX zI(d3~7|OVw8BJ@oNm5FS-^K&p>`ir57;%(z+v(3DrX&N{`l^vQ=(wd=$L1BDWh!m! z9ypz7Z4qGbyFYcxKOa)q%)i#VUzt9i`cc|ku5X7p_d&S*vAloJQG2FVQNf!Mo2Zyx zJTK%pNrU74-vq!e-6>R!-UYI`>^ZTQD@q;tZ}q!ZT)4KZS9P+sy+1Q0vipwA4Y)}E zxXroSh5KScW2V%av~6BA6AY{9vy&g$(-GGPFr3&1yOD3}e7W1hPRl%8OVxv;M%~Bo zk!|VRlu`0wcXgBK<9-KL46EGM$`MBP(xVzN_N&}7CK|B@Wl7BO#?CZRp`VuSlAqa# zdT9oKC->(;hnq&%*V)$fmmSsaDARMb(gxKWydnsTCCN-vgjGE)f61T#9Gx`iYdf5W zOM`ENGzE*5N_Faci$)rO$rax8FR>5!n|EYyz?4%b>7gDZz|vivk4CgPOpbF&uJ$(G0L zCo0umQdQrBI;O!5;J9|*gOG9gi@Q>W&ZG=cCYmQNyvkW8gC6Hk=1k|GCd814z@R@C z7cf6?)^Dow$OGGlD%C>;~5;NyTdk;>NxBbAzP$!PU++Jt$iVE0D=DGJqY zI$reTx`+rCie8kMRVDw-tm@wALAh%(?KO-8mJ}Y@f!v(-x9e{g0`+92I%6HRTH}Qx z8~PGP?=^*eB?c!u|8?6sD>aZsPiK4W?C1YJ_fyd9bSI|rEt|w!1^t*_f$@0m4c@4I zPU&Ynbn=I|YI+QEWiN-q9E!LU`ruo$N=fNmG zC-E9k42TDRrCM|8P0Xcq-Ee<)eqW@VE`Rlzo=jZ|8TOMnCuX&!Pnrx=LNDXu&tE>j zvkbJ*akW8lO18Ybmqm@%)T^h80uC!S;ES9dFM2qFAj%`p5_LcCZRBmCj7inP^2z6W zrlSJ{1O%j)6g5xw2xYW^)KFpuzwY7F)3S%M(59GhjgPOCW3bB|4-(2X$PSlh{LZ^K zoP}VN>cT&SvC`x}Q|j(T!h)-Q2NCXo`>9?1-kn$OkWhk1gLYz8D`WcA-v_5xafT_{%F(0*;c=Sh0e1FJt1q&V)Ay7)rH!TZG#f!LUJM z%w&$k+Biki>v%woWI%}xse82_cN5)nzp9+*nB_YH_vluP?Nd1SHz@8_h+rp#RYQ>K zHAIkfe0r6`%gY196Kg*4UO9}kbC4y*?oxVP*+8gf75U;=k<=a!{4kAi!vcXWgEp2j zbxuug_ta0AyUI}`Ul+Iy!(gFuRL1SdJ5L0QM(njZ5j$ND3nS61X7jK7k*6=w$?Qv_ zU5y6*Q!GI>;NpZjB8&iP14VJf6%haqTe3%wDrZu@NV$;MlX%6H3T&G#TXW~x_$%qw z6Zc$q?DC>zrtKl^9pQJRb?gMLJk*X^tkM?d+JR%pCx)&Ga&2^&BcJCa>%StKRj%Pbby6zx0v5ExNV;YEc)=e zBZWj@TIH-n!XVi{n(rHe5FEy@J2ONm9|LYnwUqgA)0;TCTX34ckv`I>bL^yrvZK!~ ztph&+O>2SqxO}RPGk|HJ&k#4Efc1Q430^3DLLcuh;;RP?fr&V3g0l8FX0<~K(Ad!f zYAMM9*;v=#BtNj=gIynrP(aQc)3LcMh^9$BoUxs}hUm@@Uu(y-sUmNJ!O;IHJg)lo zbybQY6mBX9oFn@xjrMMbk?@hv$%|9@j@Z$+`gd{$M}>~I!U*Ore{OEXlzpy47C^?k z5%t~r`RW325LY%OK4u91 zM&}+tED(cxO?bg&^446g&3BSz#DB&fihX+4_UBHrom)5!RKV$uwbP$Bt(gl`Ww^F3 zmbeL9hc|HVEs46c(a11zo>p%D?+P=?b}cpf-saC=j-4LsWcxUsvP7kJC)MO$Sg+3| zBs`rmgF{;U0vv<-gyH2xmUB`{Yuy!d>P@zO?VJXR!f^S<_fB^`wb@Z8#_?udp$1R) z50$%G$w5!|+2HkXd(?VbyT&m~r>PnK{($olY!fCcjQx!xu_~)3-uBq?`0-ycj~XWm zrzmWK$yP139{1O~i&URQdLOu-o!f8VpMB#5!{y#VlhR1MiZ#oFln413tyUSIhtB4@+@e;)?8(^u;Eg1ZZ0H*CIp>9e z)#Lit4y4j_UI&qm=>&t&qAEAGpB@o~!tlJ)oVKJ<2C>R8JflU+02 zAINFp=Uf>MnCOdkx^tC*>>g}Ig1X4wDIsDvo!q%BzbS*gxEn6e9Tz4)U-ZPXlG1Iv z&npuM4#>s*+(S9dmZ!@Qa_sxMNK+tberXt8!9=*LKgevd){k^la&3>B+Ocgh9G!Yu1Yq?eeoU<+H^LgrN9OWAcf<;mA@ZdW?bm>m6T2(`O- zULy>~`g5TAiVJ*(@{)EVXDpC7=*Af}OrlLeI6XGO^8Iu>ARaSYS9I#WS3y+G$vn4g z47Cc4;>WVrK3)V}#AG}$dGzf2L6v))rBe{(j!@4`K5}329KiUS%3_fCij#RmZb%c> z#iu7?izpbyASFl}n{l1;<@;}=M?d0oHu4Cct7XPKqE7_ozRB;3N995P`^{Z$0u-IP zNRho2t7wGd*P=&de(q-mcu@5U`D!(xCp=<8+h3p)As1L1&#rM&|3nr*plq1a;WxBD z5o9&^N9BNxKZyHpn&_IDdDIiAT3!Cv8Z*TMK=u0(WFpeXG)8X|N`?jKv8hVGq67>+ToED8!eZz%HoB&14rsrFRZPkl+qBTt zQ?oTQcYx{!n(wN=Ucg+_1R|{?XD& zw%!Jgy+v^P!_5>YEh{u+c#_(Uvw5S|pOxN=rwon-Vrm`JS4u=Pe;c@^$3@tmt1eG>G7x%2LXZQSTJA4b#K(l}fH z9D~~OOnpmla{8T{kJ{)t?X>ynA`i&Eop_E|cW3gtakoZ-eVs*~sX`AO%v42VQC4n{ z;CZ*fnWhzrVf%%JaZW!5&jx*^^6B(xGkv-7Bks$|aCW}l>(KFO_ghA{G~Z*{x;mK| zubpM2I7>{uka&Bi<5GBW(yrEEM0#yMc7lXO1ahE_{~yON{w_$0H5dx`6ym~E!W{tH zOf+!u+`xe8qbV!!#eAK%mf($m84Kaal5CK`kCJ@S&2Ny~AD>hN!VgKDY|Haq#~q|Q zPvAzvk!Dj*ibW2>(*h89B$fDgggXcQkg~vefn>RpQ!-%7eNYF!%6eF~u8}@1qv7|E&$q_ueT=a2zXWaw>?y*di=chHT2npval7*2bz<*LXFC2-we=iQe@;gKJMDfZljg z-Sz_!zqd((kgjC;S}{*PSnmonu#BXG-LXug`&cYWBsd20Wz9>l^T@MN8*0`O+o(3J z3_TCysaDtmmT@)Nc?r|KV&I~_FdVbh3VZaxBu*dO#u-)m|>Jzas z%Yc9&<7G3qk=CcfviesAS$?(0mhq`l8C2?*^3^wWntf>oBf1nANrf)LOD6STq1GSS zM}&qk6X!A069EFSpMtr*sR}%0NeY)31M26m56s;Y+_yNQL5Hb?i0q*CZnd|fzCR-L zh{g1?s8M0C%f^jZ3U!;MC`u^o0vscr(!1StI6DL(LLh8^jDzeGht@);R2ZDYv8Cir zA3Aa2(mGIQonr4!>CvX#5*b~dWQ-q$-be2cq{)z}hK7dsxNv8j(_%0!m}zkl0n)h& z9vnc-O$i5;y0WA;M{r8Z#ZQ+6P!(V1?yf--L_^qV-c`WFO-NTsq6E9^!&WXdJ1Wqr zkklDLB!sH;BPPgePC0|Qw(!G>qexL9R#vftV`k~=<%)FvBjI5+!I+TM7MIP@3)KHnLAvX)7eJS6uQ>{3I*2j)OU)*Gdh7F^}ZJ!C-E zds}!hp8eE1aXgt|4ufroV4WwJY?{WyB8^J5cFEXc1~w6BO(rw8^v!t-%0<&cvYiqM zn5`CPfxUqag1{M+tTW-I-R$sEmF_mXIqkmTm6Y{ZL_Q6l<=xNzd#~OCZ?S8m^Qtr5 zW}U`KQmr`KO0DKDn-W0q_pmF%zq;Cn-F?Ehjb-akzZ=nT3zzC{t*=t$#ohVhd2`f` z7S~Z}l~cV_h6OUc^QGld(%g8P^FCssni--ud9A*!D#_PDC1tFDOM7oej@}ajW`47X z>7M8O-GRBaleS7=`9Uj#0+x$P+R!Uoj5WT7NZ_;boh{p-X9o0Abn3_~!IDi)lJ3RZ zdNNGe5dZ*o3b$yJFCTRbdw?lKuh7&C8qT z^V~@w-`R=&@cI#6oF83c7*t54Zd1%%L8uNBKWRgeq;|{ zq`&y4q5WxGCfNqq!HzTsh;nfU7r}TU zDW*MC%)guSn_qd5R4roL|3i{qJmORYKOLS$u)+wKQSLMi{l0LzxvL8457Ctw(-5)B zDdq3#_?L)O>W>}?7(E8W&BCF?%trzD**VMDmu4r_=H}^b$s*{k1Qf6V%3^Wx8bQkl zz?>smvJgtT{frr{l|2$@%W98yBy2Ue&W2O0mGBCT2(P(Fl21?1m%p~^QUCQ?YP1IvJ)Bym|akH`3Qc0_d#psRt zn~FT%85rp3eb6%jkQyKXUiZ8TtjWM*|Ba+PkOM1QW8>|!kpbmaVSNqGP3<7Quk z4i0Jbh;;FAI^d7&j@0hR>ZISRUBo?J4Uogvo^^ts)-V-{9vKwj$k8N~zxlAOLRO?4 zN{2nUr$_IbNCgPRLEARrooZjQ3pWLGBVIe{&&Fh)2NPNLQ z`K{nS|F>+2r6ThmBhv#kct?+;a*@G3C6{rJT}(Z&+EgUpieAwk5|}H<7h_w32MAqE z+moO>XM@tQkclgTA1F`}tkRxa5LC;Cq43IUSp6hr#c(j$*DYctk!NjyekG6?ml@sIdJ*@O) zE;kaZKt{ifHL7rZ z+ipmJ(z$qE|8wK&?}@q06p}hE;K`aA*f*XYO|z1Ud^d0zObvDd+JL%h99S1F!i zg^hrBBbDxxpcvtYsqTr&hENa*Y;07IRlb}VcLG&wC3?)_SITQ z(er!5n}Cm~=Qk;-2(llpD(z^%OL#y~+e;LGJ&D;e(oRbIqJn@fD<{ZZgAp*0Q4!Ok zH7^LnH!3T>&yV6Gz#(;1Jp;>~ForQ9#^ti$??h?SXW`0UYL8FW_N=F?(K z&;XCXz;iO$Zt_mj1E9+}fgUY;HS-k-)`@mn@5h5iKos9W;+nCfH7m{00p@|1r=%M! zTQJ&7`>XaU7_QZMPmJRHEwXMHH_e9?ZIpQM%M%KDZ+XsE=YZWK?b%(eB_yzxh;J68 zDddXR2G%atwKspi1KA3R4MLbT_dYqWGpOGS@40g!P$9NIKPh7EhjeIQkZhE#t&Kx0 znv}`(HdbbOzz0;MMzNbyD@M04Wvr*^H2!SvVlJ%eDLlZ;5m05aXb7QO916{K%S93c zGCdsJ+B*@SFvOCu`|!f%_^WZ2u-l&bO^NTm3uUoAMx#@xX}JfMyz6be`^D|;sacoh z&&msdxjvl$u1r?5Az+`Yn!&@tQ7BEmukD)%iRx!$z6nPn??kMPcoW!Djc9P&U^IiU z>{BRDBj2c4q%3K-sv}2B76b+~ag>*nlbH#L$`#4K{}EZe?WuVmwzg|7T5VoZatye! zZTn9PwoJ#303jI$xEfzx=}Ql0c7zPKU=2R-2k;S=vvjz!&5 zIJ#fswfTdwPt0w9$#qM9-}t8vp8*e2L)e}4}sr)z_?+0OmZJ?UdBdS?Uh;99!Ea4Nr|aYX(MJXPOr0ELC?mU zuHZq76J7->F{Kp?KKe%UeuC{83dK%5B6ds-s5_7HhGYfm@YwjkU6@Z6>Heo5?Sc(> zm**9{faVZdEKye9;Kp0)1KPRWaCNB~xPETbQc&kbk_LIWAc_JD8@Bm#tIp~ZM)<&{ z77}y&o9Y#nRm%x+lOtxlf_V*lL#^}hF?l7T!mKc zC!9|_eCP!@69SgEVdzj5QO^c34+5_??q#)Hcg=R3l>i|Xq^%g=FYbIO$e3TBU83G- zXzK&fH%KG;MR2kgky<@4Z;v@I+&bS6IR(Gb0>o72Ds^Hi z-&5*i3_b25%9=h42mQLzK__?*0d^*MKT&!>_*$x&|2fZpt7 z7>69^;dQ$U)U29(#pwsOXJ7$kQXdflyn5LGy?Pc4&JzdySsa+=UKW1;;ES(?L`!=) z8;ZhlghUo3>JFD9SOt@MZKc0{XrGB+a^m3hHp&v1dJE=nUM{)z{$_nkAn2evQ0vNT z;}Mw5rkQHtc@SwJ+yMfLjq32ZL4Jghb3?4>6S@9c?Jj8D4zkOtIE4MA*#2TVjBwkB zbru7`{&M7q^fEB!A6hZccLS`myJS)H=faLN?U!=^&YuXq{JyC5L{P>rHgrbDpiv#e zjBu^Y8?@n|8OV<+ZJt~qMEyenUzHvwkNYy}#HtisHpKLLJD#jE>#2A*e%H7EO zl>T0&V9s`i6M|8<$voh=UWCPgLE0*y@AFoU<5(EU2kAI$Xzp+5*QyY0&T8ey>O&fV zDnPgfi3$TI2VO0v^+7;L@&~ZdR?`EKHu9~HhW%B#^fL(JnG#YF;9fq5yph@jQk}5u z)u^Kcngwv8K6#&GV97C{b6nG`lkOi5lK2LM13GFmoFdJ6g*J7U<0%vQn#!?E@T@b! zG&rX~)lON!;}tp2juVun4euz@^2@5RTpa>2Sjo9!N&j*ABx>tdvB4{ny-L}o%>ji2 zmHK3qx{x=W84%eX0i>!s3+q#t?WwKH1Sx>8^cSQpg3eZ0zF~?w0MicU_mwMhXcokQ zS@nA3h5h$@!G`V6ziN5vdvR!NAh#t=k_i;yHUzBmiR`JV9n07iO0hw=?Ypl`*cv!) z)}3thr>(Avo?EioesA`Qq(`?H5S@MW&@Ny<$$gI#TkG&@KB86|_f8o(dQj;SW^AW* z$7cv1!6JhgO_11*9qk&v4&NZ!Ek(_mmmn-_2JNLD;S(ky(q>zgUA`usqfy3>EzNa; zzqmM7`AhViCyO^rr&1b=KKpXsQ9D0gP4WIjn=XkKAj$QUn6RSg!wLNI zA{3^HGsA)x1r!er{I_g?yMTAgIHXgS2GV6MYiAfE?WG+08;z(l+~PXAdDGOige6TJ zRjflxVe-x76L5C8YhJOM+qO@jV~SSoVDj4V&~&Me6z7|yuaE$2 zFwl_PG(P^-#Zt;{?x3nGo?^Cg;fGu(QkT(?&Budd6V~~ALXOPkts{1mB$xuQ`&6i9B!r{XEui`8ECE+#6GZk>0%%mWvZ{-zE)^VFCzbK zb)i_YnQLF>|8j{XP*eywOs|J0e$O3E_HNj8Xo3eJbfu)zhDF3k%nwdU>rTWBx1K>y z$3Bj=?uKio^uD9S>|@|GbROEjW)QNpS`|)Qslyqm?%xWZ3TXduP^(i0zU}?-N`Z0k z(;55VgO^BN@Eg#FzcF<~j42M@^Hlb_eAe~~ty-npIGRnol3t-^qlg1)_SpOt`0G*0 z-1pJh|6Q`hY<_6xfooZ1qWHMwCx*H)Qi|VO6#;a?m#$-FvPj2?D7G9jpb@mOCp#*^o-iIVQ8Kkw&hN$O?^>6X z;bb(ugQazliiwiLLo}vg9v&-i5EYH=jY!i zjj0>gZI`JsIToz1Itl_i^KoiglWd-3P&>cCDkE0@#8Iy5t~fbpOFh=&X=pQr?c$B` z_MmO9=2@C*S!tYUh&4$8J6>F$mt7God(~sr*?OFytxYk^2_VBdoFkaG!CBs93z6u4 z={x3?{XVhrits*6(aq&*Mu-Z!o|y$~pR=a+yjz6O))iG!5eq_EnRH#L5|HkSXjub_ zlSgapgXY*|5I6mO=^<}C)WN^7BfhwuS}?QeMSnu?zMduT0n3FGtJNPeB6uH;sZgOu ztcA}}Qy2p}cYyrZx=6UPtRd5dMNkoUew;f}!F7+>qfV@H;>gNPpUQPTL-TOaK5oz7s{fwV2540R#O8kL=})0hZ@PH_u3S5Kl=89Q!B6eM(n zuS5LUF9RX(Jwp&B{GFb_)XK7P{2Q=Ww0@s5kR&`RRIZpD9bxE_RUfE(KJhXq;LC;g zS6HWzi@aT!eAHfItUVvo!ogJIj~;^d8<$0At)P7?zQPU*Ui_#0GSpk`7bz;TNrOhV z$3}c%pRt-+I@Pw&qBmy|>7sgT%%eh@N~R7=nth%0o}r(v3+rcnm>Y~^9tfI9OfFAU z0?PV=_)DJ&)zIIR|J;AE3+mzeyPAU*R}98Hhj8f9`JT9L^yBK`bl_k|`D$;v`u@%y`MT0S+X_Farlv zy;X466yoy>=6vkpDQz~Qx0I2=>s;Ug1ksrBbkR5GL|ocDZa^v;1zd{DWz%*ol{O^wvp7 z)uMU)_j+%ytvpfdl;EG@ir6D(1W;VvxdIkYGB5bo_VZ(^v^u+L#HQWXy+&nP6%r3a zWOzqzJZ)}%2c*<*j9ra+l+|m604@L0L3Om)2lJRcIyAH!2y%;FpR@x+3Sl6Eb21Hoo9@o!7OrlPH!uUF zR=}XCRnFZSD;He6n|yDV)U|O_m8!X-RZ!nn967GtuC!3!WS=eJtK8P5?bzr?^j-53 z7FkiOTuuIO)-6Lqfz$e*{&24F-`H=3`q4;I{lg>QH`bfY*Hz8Tvd@>>uSzs!Dx7z2 zZVJy}Ux$Xdrwc9iWPY4H2`i_4A>l+9zlu7%QLI2sF5#SEtpP#Hgyh z$~y3Pz`~|O#HRC|q=P=Bvvkke5T|G@YBwf6#77%CdKKXM)Zy3P26#y(gHMqk8`Mgf zJZVVP(X(2-oTb@wJ_AMI^J6w!1t}(>I-kFU#yx{6Qu z`rjtQ8VfY(w7f`A^)5zJ0_{j?2vts+eixXpAopzHmV<~B*Q z=!4Ta+9|$V|KT@yEf9YhaAp@&`@wE65Eb8yc+JC|17?qkG2(sZK)@Jd1t>CTbS_Z~$RQfnjfNz2_u|%sjJPgk+ zIQNNSvz=(CYF7HA!&#~f3ut&DUrm@f`LAWx-a^w~aYN(sarSN>Od8Ue#$gf_9Ftkj zX|#?=o+T!u?sVCx_%Xrw;B(^b#;bK*Hzx(QTFu|3A%(OGYayOK#NYId{!e`e6+Z>^$W*}L@7 zd%}Jpg-Pt9JIS;ODvXia6Ae^xRuIHCijl!X52z{7PUnQS&FUse-5RGRo;&I*E3Ki) zR9Hga@f}4Y^<|;|Kf$IhhfJMpio~Ba6uBat<@a5G3dfGCW$@G3dxl=ad*oICyg7q{ zQ5V{Sa=dD{t3$%2@y~O_QZv;bgJ=~-sUkY)HfM9&qVYNRgamYctVCOF0+`#Ql8I@| z)Psw(GgP&ZVvaU=IwR^bTYdKN^XCv{n!`F|cI!<@(H-AF=LQ)-@i|_gWV+MqA{+fX zA%hL%`>@w@o3k0klf;USjJyWq8}Ftt-y@`RD2RYO4Uik@>~C z{>F&KM;a0NlbE5OONyv{7adPTX^>o?2i?ylnrnez9T8?lGE6Vnj!A6t!>T-Tnv!$# zK`25m>Z92ew0;81lgwf{rwR3It|U7T0sr~rE5LBvb4{XCD`#`3xbtrkuKC`D!|JiR z0?u?6nsb?P)T$b9(zrZ%R-flQCQS9i4%c?Tv}Z<}42pfW6=5xln@~H}X{tyZ99Fwy zt~#v(TShT1dJfOqOGM)9h8m^YTd2Efj9DOMX4-2``fs3q{=H`6PtwDyGK#Gx{Z!@ns5r<|8@THM;g?Yf|n$w3J{CDN?yyVT(b?DNphHPz>wax2)?s46S!Co+RCp8tM;SyW%-ozA}FMg3aBE`X^!Kx!!5Kynp|s1$Bh?;z z24R&x$21G-XK<)fD@3`1WQFP$yYPZ4t(3yQ6!RMK#p?~r0Ah{_Q#X(7dyGRhP?9#6n0So+su5q2R&;_}0EK=b0XX%(lSe+J6cnha+lZ&PE zr_&qw#EaUV6Ix4x0D+LUt;7 zNF(CrQLj!BxsvFhQ~9p!n6grTM;x(<62%NFFY6UOT7(c++$}C`_Zxp^Vfw4qee{-l zR`ch)tSAAZ|J@!6J+!TT?=$uY>@P$3zAU>x0=V-1`j2gqI*&w7%{s=$C$ zv8NAqD(NyxWGjFQCfJgHc2q00)IgtSsZ;*poJIWDU_$fD$x7UC>w<^z|3wln zCv-TUz@`#z7u}nS*}*+gz1?)IbIO{#@ryh!bCP?|fgg2W)H@ zMFziTRpgoN{avyxLhv?3pg=K#t?&x@ofB5Xox{2%jQvv488DGI4e^&VzmjB`OcqdeuNs1Wv57gRXRO zCmGyP``!MvDH@9;1^yz66^|^f%O&}h@y)b;vAQB`ykZu8BRc;)kj7QOywgg;N0DG! z^rHk33vC1EGju|pnE1$3Ys4XpUmlXBr!zjFS`wkVQj3!S-{S-CufwI4^3b+Y5VF^9 zvyUNfICl&p@WgInPil$T+)~40sM&_3S*&KAt}4g}*LX|LkfFn8)i3Zti4~@UhE=RD z3c8qX>I>hz=?k?IKRhQmfz-xIZXVum^9^NQq$#?}*gl+7=7QT7FR(Aj?07URm>fQn zJL<0`%(FtgXCNcqoC5C9XeN2&^FA0En`p*~)D&oPCT1oya9V^SZ4;b*z-vn{ED%TOP@_fLWbRFq{P*CC#HlT~DHkwM0DaHu8x5y={x_!aWXiNW>a z#i;xD7Y{b1B?~A-Kx^h#3OgkQ%ryN3Ad#oc?T|DEMV7abFkRT_!c>BTP%Ise#UL_t z8^b3)WU4fs!xtZ98Mj7q093RMpO{t!Z1a%_=w7<^u819A&KiVZE*dIxQH@bC7*VXM zr=dn&q8z3=yDow?HDh$n6Q+TxIn!qq`A#r+1kl2hA^JhPt}!di&Blxkb|U;*%E?)Y z7j`-P1ZouM8ray{O{5K-JIYy1jNiQ`WppB$RtlRtineDce!jIb>NOb7x|*1IwH*C@ zd9^E)ch3{&RUXnn-%T9Tz*|D`fQikxK0XI>S3FbH5M08SI)sClF4j=DQde;kNI_Bl z0tA*M2pkjxV3z4};`A7??1+&l$f7tkHW98FWJ&AJtFG=P_-FNx`{<0J-6}tCxfe5A zR;wRYJ+6#7$A=3ir>>yzT$6gG+@H-hRoAPAX_^nsWOj(_UQn!iW@I>n4+J-j6^U+3 zOBnI?uhi*6pfZ0Sl6DCx;8wk2-m&4PJ5+MUuBNJC&^N=gMZYX_V;W`*+j=e%p3iNh zh^8jeeZks!#!0*3Qz0YN{e7c}XutR>#CJBHI%4oBF3J969b&|v9%8zdcd!eTvl^Sd zS4RhX9$a_OFmca&>OMNex@W^*KQ{JpapN5~w1pzByV#%DHr}i7`KI@Z{i^7`#W>N4 z(QB$13f|`7 z?IWj)Ur6-=1?oN`gV>B_?~ex5t7N|&Y4h9|ZW zHjSWqd7O44Fxtt|rSGBW==rXzzv0^&3A_8&B(cxKzK<=0%)7t18v*pV+g_;0OG|TA zO#~Z+mHHyA5BAt&=N;utA47(Z2H3T&!vpJBCtQm(p&`sS$)+DAQfAm@ zPmXN$8ql3*IN+9QIuGQ@7)D|aQOogcY}^#p5jV8E$Qql;C}YlcT3Bh;cmQ{85TF(8 zm8zBSVaa%i(M8!nudK&8ENh}z5o;x>j;>r1MM-2O9ccuZpO{*x1!-oqrj6(M+Nunt zu9!{tlq>Z7q$`F);3pi{s4}vTT}J?aE~9q7T=Fz&sjgO6aM7wM!hWJ`F=fWM@5NBM zQl9o&o;AU}NbJk$)0Tv-9jvHb6_vCnT8v*$vqFJxjhNlw&}_nJ1xvv|Ea2Pm47VVT zkmIy5W<#Eu{NwEGTz2Ows$wc0@-&rI(ix$4+PB`7f&U(tlW%h93th*%+3IA-Ow|?C z_)~zrjHE?%`a`DEn?RdbD7KA!X92-I%=IL#zn^AcCL}UbZivG(>t2FF#g-rKC&UyY zYm&d0kPi{uJ*ROmLJz6>FQ5X(npZ>e?y;l#7n8JcRsx^Z*FHLW6n&!E_f*Sr*dJ+y zBhn1yT~vAYR=y@+pla5F+Krwdba0BvO@3vO_w@PsR+vF6NTz8jwXw2_ou@e|Vhv0O ztahL+w8I5x0vMA2w+mobnh#4~pk?6FW9_J&tNo^Fsean=5X8X4?qE}eSf3XZ$Dkk& zET($V9BiV+>7mXkvMCCX9x#jCon}ltzRfFNu23E;X7md;05;~cliDp<>^1rm8iSGm zVlJ%C;4Dsoi)rz78LP7slGfM zTt`;^6%djlpDy_Whun&cmiscIQJUIMRyQ(&^S2{K)xw$b$W2LC89C1T6t|mn37uYd zYY~-8qm@~&M^x8GSje)k72)bEkq-T5P}Be@q&7tMnCa-|C_`04%EQ%sy5nM*I9uag zK1*%o1Yk-~&>^?Q&#Q2X3W&sHHD~O1X@NUy#BKz`WjMVg^Z69;eZE+YlSY2$yigVm-a(XS$Pq7Y=tU!RNQMkV1vGunCZDlfPLBxa|mS0l^UFPj0Yfls<))&@ahpKg?Ngw6Gyf*&1$umPg zx~&AdvTB9!tHnbNzkV=KqBh(0LEvqVT~9~WztM9Q#ksgGJI$(YO(yPwyme*xZ+E+P z^vNJ%&8=(LSBu#u-rqbk_lAf);^{)?G)wZBpV1V8LM;V*({)5IEf? z6)^8eHQ+&X=hldF_|=Gh{9Nhl?lh-D!N&tuP+vt_#1-rQf~$1a)Fks&AV6|Df4a1| zypE3Mxqy2T4ob*4(R$jXX+U~ap`Il73!m6AcQKul-Nk)3z>1?nnK?*eX0J!LZwPlF zUeT6Cr7@_uAGa_iGP?qZ6>nL#2pToP1_<$NEg#B!8QpAZU%tlt9H`2MN>{OZhkli; zYBpp!VLLBVy?znqIiPSQXJNM4$?7*v_8{H6mJD+L;hC1khcu#*{@tNi#)R z^1UXGmZ7)GZiTh?t#_V#UZqlQ@ki&b0%B&Ty*`8<4o&rP_qCRLH*@8|qQ#9v@qs69 zd*R<6o}2%`rA~*9*1j}H+9=|>%MNkB;Ph`N8w-p>d?-u+4Z0Vp`du@gsv@!JVH#<~ zTidl_#Tqwqsn^_5()?*T169xD3+R#7gB1jaseIf1A*!v-S)Hm!I*53b5y%h!Id7aO5gkg3~-25xHj>XDbNX{wUw{ZV!8nmn8mopwkJxpU6= zN7uE&j*{MwKKuufqnYB_0g$t^EXJm+%9cYCo*Swgi6zH~KQpzua)==iZas)FGid`v zoU%7Ql#$!yq&*h18jy{G?y-Ycz2O7sh$+0p-jKr++tmw%Sp6W!aCP0zmRf*caP-8Y zYWCFioQFz-d+craiL4=Cdm;2gaoJSA<%F&po6kze6%9}lg&b}Q);N+q%+U(B4-F^2bL*yQirBGs^}=`d+fp-R2Zcnc2brFeWzBFc4g zT%Hac8w9YSBf-e)UVCzqcB_nPiR zQXw{Cex5+^91(SDEznsv2_+7oKDTH^3xP}KO11PIW^t9^K<)sx{}&ujn`DLPzU%oC z@zjN}In=+h?#Icia-G=KT^9+4Hw~k&GGpF}-_&*E z#-A!@}Aj;7dYknZuaXoK#)vyOXapCss zXNC87K&3vgp1-~5iW?Qjy=)ds*VIazyLjJlef51KguJiJ(B@?lYP=ad>!ks+lFN#?LPQ>@^$ zo?mV$^A3;>QJrtZ-Mc+jFgnW;M=X-a@`G#v@nlW531iTYb7@lszSV&Cb1~PVc+CfW z&&sbG7Z=#OG%rM#H8&z>1di3L<_HI$>ZQZ}^f>9G+J6XUfe$OSKi2~9dlLO4YC&QdFeDVt)TFT{F3Q=3Kj@rnX!9$0OA?}=M&D1cwWnha?*^r0FIEGo{ z_zDUX(<7y`+c-N`K9Je+5x!{0q3-q(`|w#xG-Kz&n7lveIdAFCuW?~&?%{C&d$~Rv zQ+l>pe9(%@Uh$b5IeQf<@Dwa=Ve(}d!xkn1+sIVOz%T=&s1-98E~*Z=U<5*VI8e(e zsi+Bb6AyPfn*wF2VIfKm*^M}<0AzhhI44n;D)>01yzM!-C-`ZMQBt4SXbQpsDNw27Wa<+cx)67@%;+~c`a+c!OykxbOWlPk$$Pm2pN9=) zukG~1Hat}R1&*d}H58IH?-wi_t;`y|-*nMT12Z|C5<{e&6aUF(tl)-RP5hDb8ozDw z3EUcdy{TIbAJR&R9e?|8oONS6+(eA?w8%7F-s(gU1Q=@tXcryIkXR{oSbwcp?Ah4R-y9e9HaJh7lHNmqq4aF}9=VfN#CT^-Zcl1-}Mm*v8#9 z%-GswKA-c=nWQL^3`C5oc+;)+?baEk<2Obs#Z?5eS+SedoP*c=}p|CQHUU0l>Sy^Ev=62rnx zMpk%B9MTb>d4b6P);E5C3hHtAr#ophTD}(c?F{i??%YinH20kTn|t*(OVY-FQ&$VU zp1R0-GlD}-hu@S1T+R&DtZoKf--)t9U8nUYzr=;wS$A{UAJXu~m=+{XD<^#k+Lb z-cTIya(1zf@!RO#9j#)k?W_A&jR%h(ZLiZ+e^A?tO|uCVfv?!>K%sWO6x zG}&}0Tei}tJYCtHCtciBqxUT?o@pLQCuH%ORVs}`6uzT zdoWI{w*BE^jw6`M1(g8da?g%iD|U5TLr4JKnahxBM`~1YPtc$VfYN^(>8-7^?Vl`u z^58d2j-#tWg4DU6Dkc2l;-G*q?qoHcE%|ZRxT$aL!5DJGf5cAoT8kc5uiuT}>2H#+ zPGzyLm2z`kFj2faZ@XZ2KK_CeMV^o{3f@j~yNg(Htzw4%&TCk{t?hhQS;}{)gR}R+ z6QnDH$itwCx2Ltt+baFg&pQvE`tN3jr19Ek#HbROpkG;<&xbiK5+tLp^6g1%s^@5j zOzY6s@ON3ZkRa*bQ<5p-?`S$W+$HZ6U9%>7(_L(&J+q`xALB?xcquHVTt?t&V)ZBu zVJyB-&`D#w^OlS(u{?wl@boLE`*sXOM7>!JkOmbq(OX}J~W;W4FuC-sH=0lzIJ zfloQ-OEf`Vsvca`?h0aQwXR9o+vtf{_O|YzRO0Rkj7t2?d2vL6@H5DEwp9}C5o+^~ z97pq?XNR{HF}82SxKnWhQ^M7Qa3xqV$7UDScd)r4O}in-hbhEZr7wzMtHzTp>1bep zm*)!DH{x*^CcAs6Eyw0#qaO!FARm%pM{4iTe5)%cICeKZc6z*eE03asqoEdYu{5$e zIC_Ci$7dTAvv)3OvY1+pMxk>hSWTujdgq{1u}ExA8@m%>o5Tfw~v|9crsQ^;;y*r9v=U}=lzb6M= z&5aCkPCkDW^#*}fl39l}UlR@BIscvfx~fzhbkLicur7yNrms_`(*`9tKAo5?kjKm6j<;AZ7#GPPp@bP$d|F(@A) zU0q})^=8MF08Q`W{M`Jii^+(>WK9>4Hh=N?*)=U=>G^B*Uq=1YQs*63bN#KfrT51I z=W%dqmoNf0aFiG&O8E?h9G~3nF?d3po~e0{=!3g{^7vD({JKkmQyZ+Wi?#4|&0qe; zfbINauG0qE!jc|QA&zH@0`us>qhULb5PjRa(a3b=XVx>ifm643F5G+?M3qXLM(zpw87(q z+whwMD$gDc_9Cri!fpFesr_fdpRL(Y|Fdr&B}+NDYo3hs5!@|S{UZx(BXWl@@ObY> zIcV~OZnE(0e|vmld3`Nf!T=hT?S%>P7a+oP4-}y3Z_ScMg%Pm?yr>J8t*ZX z&v4ftCX~ytSH=2D849rW)=Vc)#o7G&;NrT=OVWL+4Ea>k2LyrE68R~_c7E&SdIsN5 zMJGD~wLALny@XyPPjIQF@Hx`wo&alluC=a49Yec!4_=6X%elWojbnzkb70hU%r%qF zu#exJxh8Zm)85Ng>W2h!d)G_1dL8GrYxwEWrRO<~&NWs4F1?NGuIt`y)!l>eL>v3V zjnM!`Ax9RZA5*q)kHWIZE1=XtFR#CqJ`c>M5(XPRjB7WOqO4i$d(1>%gF#`e zhcAdCm%F?eY%j^*9r(l>w+^neysvT44an4j`x?BM0*6;6VMO7*-pRUuD>g;7heKa~ z(?;w+)M`Rn)QbkfqEYZ)4_7Jj=Hm;v++b5YPkUYLwH+mU&sMcQ_k)9l%AQ)jSzX%I|V95OU) zH{xG$QPPJ>e3EGjirzULqWfg8H7}vR?Jd-)FMrx08%!d@m<h>;c)UGW4n+5UzU0883F#$; z73_t}jUp5dc*E-f)<=z2LHNmw^F71mme|3F1;c$>ZL#N{%bMP%Nl@!Xq$w=#X<-XS z&b5mI`$lK5xo;!b-!*QI%$?PF871%eX>sL&0pC{po0NwO#?8D?LRHPL`e5x6YPuZv0z@X~qlwK(qnD^rGl~@$du@;(h3(I@pZ_X&Sgn zwjkZ}i`n)Qsf)Fu`-%sBEL7X)VADdOYOfEynLYWB>)DLY*(pBRZl|X>+pR86ywp^I z4@ALOhXdr*D@?~!J!EgF1i*&(y2|2~a-eEv%#AB%13mOg?bJ0Fzdn?mj1NX6WzEn) z3<2r@nL;tkkk|0DdW_ix`QaRtGoixLPqft0YPU&l7;)RdaU_M88_Lqh)4TaWkOY!) zoESx&2s~4MtWLn%WE2%Fyypk_>u1axGio&=xg$Al3_9|hpI1Y5D$5Y3%HSy7O_a~l zi5+f{Y?9vx=B+%1pz2B{x$U8MIXrZ=Sds{S-0xcak~+V$a288fEBwe>9sI$%8o^8- zrCW%&1VL7Mh=N!zcX_29YZZAWMr;e7srNIoeMLS^yuL@dD`7ds@fK8n81M<&WL2fK zK&RkyX4(Z<4A}Ph)9|TZViR@jSS{VdvQ<-}q`bG~*02L={e&vCjW5Ql?ybrNJm;t) z0if2--i$+?AGh4G^ri< zZM92$Z(gQ;oo#a<)Lzb>g;jS_X~dD$Q_4)hxjS+xQCWtRlqx6eTGZC+6We@?UzX6O zznHoDTu)4*>oua3C{;CKBQ&Z61IX6qssFj<-IPAK@?bP!GBXGsP0K20VB@umd&W_% zYB+a=cn6RsxpNb7K|$6!{u)4WPIwyQt#o6bFg(3L(G@b*5n?@Aa*U?#>Lbc>(#%|i zR$IuuO#@EyLBkp5c*&~edR(F1$9{fJ%~pTj4uixI2^@d*8C~%@5*hqSlA2p}Vq#-= znCl3oUJ59Z!0kLhZ!#J9BQ&Vt+2APaPs8Owxw#IseFhIj}1cl2VN)HG69~bX^a{vJkY>HrMYO z#H$CP*-;75o8yNCNCTXio=Bb=lTmk~3>%%3Zn=Gy4@svC`yOF^f$Ma7jNWz~M2B4@ zsxOkxa}F#`tQf@XZBs<=2^oW{L5Fd6mY)}9Q6c=GG6gCalq7An=W%n6qf2Kf)w|K) z9h7N|*{*NN>R)g>?%;YK?hzH7Cqso#^=d3ThNW8pIM3ruec%jGZUSbW!fbwCdgNyb!Rc$SU$)L~&!6gr2?;x6=gS1-_$TT3>kL^--MChKy&~cHS6s*g5hE6Ma z)9I#w*t2OX(fEpTzO}zOKIBs5N1Fmbu_5HB0*U2ik<3QVQ!w~(xg+g{KGz|37!&j9 z;2J%W=hbszPfAIlIVS0gjFhXhk=N3upnU#G9T3Fn(GxYB39df%G+H@5tg2k3PMLtd zTmiX#_AvCt4naVoHs)r#t-Qj1Zyo`|5=c(wl(dhohnmfjK8ny>JDh^ZZ+GMbx%gJ^ zlIi!x*616nZi##e4OfFQA!X4aWL>w5kN!o6sYbB67^?)KfepZ-_;e`%2ObzjgH)fi z4*YrR`}rhZoVo4-^DhI%Hf0vsXj5;J7!091ca6c!?th8xJYi8H;HfiyP^d=wSMAJH zlnuRq8Tw6s#QCAP*DBAaExV)8_;)|s_oYn1*Wb87>LO3czrxIUENdMR2xxRULO4}LERCL|c{E<>TTL^cn#9i#r&C*1b(`^g;3;v+HXUX!Xo zo?ST0+m+jcCrdfy4YMRN^B^5ze$+pmY9;r2Bflj`-nN?PFP zpbAS~N7q4niLP4oX7~1to#Ru}*fOesAaY1c0(%y2Q{hgVI&?7f>f=JqS3PIy7W=UB zX8tWFFZW{~X|^BfJVQKA%?$b2iO0T;@rDHh1!(V z?O)K!`Ntk7r&>*q8;e&+$I*Dr#}9a%A5dzCEjQ5fJl?C5;dmo9e8hDDsQw7T+qR!D zZBabMYpxs>rkCZ8XA4JEYOBSaR(6e(MQI=~=yNQ$MDGLYE32)7ucfIca=8%YfB8s_iHc7UWQc1fPFn%)S?*asgoDV3|6el($ zLv|hcQ44Oaj4NxdZ;>^Vc2_qbgTfL`GI`_vL0_wtU_fm>c4DOZxvi=ium4jQvdO0X z>Ju6F5AflwxfGV)EIzN#i2*_eZ<5A&4UJ&mwpo_hq#cG#q$V@Ee&a459J-okdd5!J zZmZIkKT$4utbN{mjn`?`fk?=1Q~DUF`Z<2IgAEHJ6@)hhydfuUC;f5*m&9S+%umsT zmFmrlhA?=1KiBsOt!;K|I@;qHJb~M=xn(Me zM8%O$b4aR_1aRQ^J9h_g;;cz5M04_AQ2hKzKXKs~^{|jr( zGf+3ya)DPu4k!QZ; zjt8Ng{uF-$s#Psi6K?ez2XXr5Z=OH?P?dtQr>=H+FGgIKZ#_Fl%8+vrEgi>Q)~*Ax z;D%$a72hOi!*;u@!eFpOpl+vK*U7R&CFDp4GJG&<|A@$rYr1q{R2HE{naR!6NFb0F)n69Wh+gBez>;jqXl?kQy>PN%=NmuERQK;9t6BEznY8_W?&pia z>x1t-Z_~~Cy3^C*!NYP5#1RYqFEFO+yi5^V-C0-C0(TQiwT%aqcKic=UljGqITn%? z1Kxb0SZ*ZmR3xt}*SVuSvxJtrKMJ#d#ZC=lnKGq~s%wNNJvonQeXn`vJ3iX}sDWy7 z2433f%dn+d$-(_eh<_UU3(~TtKy!%_o4#q(cXHFyOXS)OG!Dt`Cf|RiA19WPnX}3HnVT<)CFxb)0KU=a z6cHSAY(bJN)|qrV(a6D^D%CIK*_t&8y6MGNZchloQaDRlixkd*@21_e3EE?B5HD{P zY6oBNh|2hRn$x z6dNTSO0%~{p0@1VBnf9vZ39b4HD=`hom`Ox0IND&Jph=++W8fDy}g#W<08f0mS4qu zs|`>E{jwx|vo8gx*yzplS!ZGa-=u>Ja`}`t(+2TKOj2?am{bLfzy}S*{9g*r4I+XQOyWhaSp+jDl2mb0~0| zzARPNw*%}Ej#P!Hzh}}F7z33#0@MONdvL!*=eaI-@A&ZK1v={8Mp(mpegi~uDh^sl zu<;^$uxa-d9>c}97vBGl;39|&7AM)EI#j&Jo|xV{x_yQH(^;Pj+KDdY(3Vqq+OWnq z5GFXYN|#2OW&9jOnyudGmb~HAee6yM;C@_gA0UL*GH99S>X7G;^StS^h7zmT$l#_f z*I(?L5ldr@+D0)5s%1>{U+8|RZX~gW!i)8azOoY5r0mz9hR8KY4t0Izn8g z$xmWO5EwO?ORDIobFK1g{6SHAHRn(aBfq){A5-}zk9?)=%akynHm7@Z|2O7_u$p-c znE>$W%~im|14{VDxyn-t-Z&2Hc9FzbR8A2DoqX(r{m_0?xU{n?iNUU(Ku~#-%O~5K z*^Z%w1H(|Z`8PiTNhN(Sb~#`(&4RU|Am>?~Ol;u6$mHB{f*oUbj7of@XH-?lZeT zs__jN(9@r&_#iXMtz)^z_sfO+2(m_MyrE@sb$+f9x#$0ke)HzB?%(u#n$$M4TX($6 z_Xa;bBH)@V)WPN!axHeb!pu5UDc!PE#Dct~=Tb;9h(w0|8*76SP*;ZPKPlAn@N|U^ zS$)D^*y;j?X*u0L{Ue>m$P0|Js)9A5$M`$Vy$zaFf=3|NVk&0BiY~VL_1V56DKdL6 z^JNrboQ*1;bE3_B9)!0lWfP@rG0QS7iQ?XOsR5wLLfNmoHD3uE{Vj_{bLh^*TCi$m zmXMYj{GbgHyq8AY#Tbaj_XTX{w?vd5OSQ%IjsA02l zV8?Rx*q8f;rjZ= zh6EW7>0Op^*soKXj{=}s@m!*)osG?HvF?~8(WW1$D)aMpejb;NCr`-H+8Kcc~?t9LOVV(`I04Z<|q>qdx#sDw6 zto=#6XWBvUE`qG=v&yENt4!z`I)j$Jec9eRP{i2j-tswwyR3tSJe2L1-kTfdWGT@K_M<=sTccaETf+ao>R?yUVW18kJhVLl zNv{I}yYzk!6fQ0VYLT;tnpTjSv!<{4kaV}NHlu6w=%1$OR`aY2?? z(pz@i+IT!3Gc?L0nnN44>Y6!Uz28VZg&6>T25s8Zf7gnIZ`3cD`3@@Rg623wzip z#?Tm;5I2>|gxKbrQh@+1S}DW*rFwTvcfpcONgn?VY*E9>9a##{;rpas68_cV8%=E? z)iHA(^;elnsRU}4W55|LO*_JSY9(GDBf+7JZq&!nGy6x=6CH84hl)bzw2*nzs0k_t z?x00alMltd8g*QP{dNoYa#pVI8E@m=&4Zm1l9e3wa)7JB+$D|m%~b@WMp6P*+Zl;I%ScV@h$(zNlO80#C) z1mNJOz^9LVwZ71=+}@kF`#a}%mKzm{#KG;x@4_#C7-f>q{th=KjUvI}#Z>Nd$445h z%~r~s;v~mkloRP6~WU(;e)V-`$~&V>9R#JJuu_fsxU3!PyU@G>Py zm$5XN+yZIVqPZgPe&gOMOyI?$&1bv&gGLMp!>ua`MK|^S$iMr2e;?UhZdpB;(C5cUr9|sdf->_W(Q@!p4(1Ae3cKwj9K{xdo0cyggK#<;H z%hvF!w|ZoU-_ptCxuzdqdzJMW))dPquk!9Nd;!N8H=!adqK>ZhhJ}Aw-ED}x8r1Gh zRC?Q$O`On12g%+XDBg(W`zU|KH9oLj(F-ytI{ra!9L;dh;>Q^;t3j&E(!YD;ca0P{ z{EJVOHTW;7k)XIJ=&%xU^KT9Jc!={tpyzzY9b{u3vYVHBe*XAm>tJ&OYio#g1BA(d z8+b&7zCC}3uTY@s_Z6OTvtNi^KT@D*g%72P;|D1S$NNRJJLN(Vuk`2E?pj1;ARS)@ z&-8OPy;m?d9xAZQvy8@3a}H|Uws}e;gQ^akR2B_&QuS(umidZ70^sq_1_h{azr?_0 zH)VoBOz#E+eeRL3|DzB&23f!;c|+}r3N4AqZp4%*rMHhp z&iLh7o#t?6Co9NYq5F;zWoDlE!iOpu{OA(7dccJ)xvQRN(t)=v{74RA2YmOJ$8_G{4PEA=6J1Y zcIs<_^?vEIlc*>=;r_HG?BtfV0_X+~UL1c^JAYee9JP(C57E_Y|Lq6g`S-Ps=723YTv5q3B4WYBMv;Cw%2X&s^n$nNrT zTgEy9#J6=Dg`plq2fwzZV{BnI0PsH*J(I5bm@qwk*9c$j!{$o~=USmQ+t4FQHb0O* zGVM0=JiLW?I@o#>pzqGA4rfw_H3|Fq%<9W+ow6oxVIDKwqTQ{Jxd64Mv<$aVEewg1 z`?bF)d58rY;%W1=?-_-;J)GfFI|u@5s1qeE|III-XkoQ6RF07}3IbGq8Vh|dx#fxW zrRg%LTz}&EN9uIiS`C-k#uYUVx=W$z^>)3ZYop#2e)ccfN~}&dVGzqZGim3*dkkP(^9$I zTSb^d7N|3SwAbre&uX$>jyD}c+7QT-1rR*gk&k->>71yI?L&ILy#>+BmMm-VaMrE} zs+TYl=y4C(7GIGJ&(f1&Bb7WZt#`X+WrxxJS%>CdHlksMAXAk*73^M@-DVLZUAFFj z%)HA)lEhYUt^KmWNPDM&d|PKwhICYrEDgY3lHPuwP3L3xtdS1oZ^qckM3q+ys#b#vw((JhIXY~vUBh+RNfSWw z)aC3zvmH-52@uy01G$F~T<)`=h{6I21xJR{a4>j|r~Rv!EaAQ((23nu)P8cme~7*_ z!>F2MgZe9UgFoh2xS5WhnNEe)z+M{x*4YeMe~q;^F~9{7U~O%>7b#c{BOz` zols{&uuSRv2c)TjNI*@%;*qMkQ{(Hl^~U z@N>Q~`(=$3G{-2W-C?MeaK*W#({+WRsS)!3v~YWeQ6hb@p{6R!Q2+BYO#i_AU+GKn zxzSdK0$>#FFvbXZ^s!7_0g|u4wqBC*EmXny&e3Qi-I`7wFJk_EcsOy}SjO-{26_za z;7P1AQkDmK#IU1pEa0s<)_j7Hfqr$eY+&##fQ62NuXC5Y^Q}R*>>>rf*EtQT|{-97f{-=Sno9c9gP)vW8Qjwg*paKJj<-m^I zsfHwfu1$W7)Qu(i(83dW#Lg z-gIx>@31V=*Jx18{gz9@*||XroGr3`s7w11qa|VUMiG)##(#d-SI*qx?~+A$ixjKS zt!`LkaJvqmD}MU~yME7$J4-kH6i71a2+h^yF(+0ZP`U zZE%D*+u%@xeA-3DL+$Gp9SUPl>wH4^1-j2#ribNVYCwqpnO5~8yKt{uHp1q{*|T=b zZ&AmbVXIGvbMfEF%g|lHcERu@BE;7*hkyP_zvhBwQeu0xMF5!yg2~!*M9u`AKEUft zh}QeiD^U|!=fl%RiNSVd9fNL|CgTkxWtDJ5U0ym}G&q7G$efPL(p*r{1r<>;y!A+J z2{M>uNt=@O>}r8Zro+-KjhJgT?)1?M6$OL|mi5|U-Vu+tbrinARD$z67p@X;39@zK zmwU~fbUY%4D-pd#Zf1oJ`~;JAj!={_r221G5R zfTeu$ER8#Tc`P`_bwh$|43JFwJK*5n6@?P06%gtiyWnW$EGVj2ZOWqd&P6KA)>B;S zh~n(&-|A)pvM9C`7A1q-GcC5OZ?}54$ltwjeF>2DYgM1#uAA$6CUj1eQ8&xmaaY2P z>veGMbKq7tR*FqM$2?BC`%Q2}>=imHq;9*Yz&Aq;Hyx4Vo!N_J$kOR)1x)3gjiq$S ze{g$_)0;TrvNF<6rbAHlNEy0QC90M}4(U@2{>Do)rp=WLBo6;sQIA#v-UZhS5w7DYe5ylNk^N5|-2PJx^+s23&Xe;sjL$?x(hRHyLxs7w1@y8(htQ~~EZSNqU+JT}4;on(*j^JKFDj0b1P(@X zaI3`8kMKPgM-`&XCZ^#@1Mm_ISJbV1s+gSb|4kk^iIgEG`R02|;7g8S2isFI${!45 z-?d0%8dNjICbwLy$vK)$FNDfnS?2T$JB}Nh*Y`^XzFYkdvEDX|!#;K?foJTIqWlRY z(qa_!SG-VBjGM_wSwtWN;4jb#v2t$kI~6Tzfp7$ztnGO zjs9RD?p__+Ri`b`ypi`l+U}=(^;QcE$Q*Kc$B`FN2TLLZoYMmb!{oh80J*g=03J+Y z?GAk1gxDA-OSB~*)$L$6L|qcsqGzP1HG?66dg@cSI8o8hSI#L7anzQ=PK#it{`0NT zM^^~I4gO%?>kx%rzU5R&t|ZxiinKe?R{mTR2LUv!x)uo*z0FSEgB-|~&TYcyqOS&69E?v5y1xVh+It_uh(K;sokDVT>>RWu(dQKV@Cw~A z7?U-((m0uROTYvu!Azii*6g45>2~ejZ~B^E`VvL*q_l0y1&eD^7bqHkb2dH{?ieKH< zn)xE|F)5kOQ&VibXvT_sq$rqm!|Ll^_&HNpd7%Y82BwpV2+fr*mxLSj1|85(Tc}bMB zjg5xn#uo`TuwR=;^x>lL(nm}uE8Ga8mO8$4=_IShdfY}G%_o6MBN%hDCLl8Cj zQ`7Wi#A-)8Zv*dFX@m4a*;@3_^%65I>Z!~YH8N3A&G8(8-L43gC`7Cwy>RzoPP%vM`K!4G2y=- zHt8qdQX=+z)M7|JhO`eUQJ~4eJ4y}8A+X}+ZvY38N7R{9icmq5(W@xvPAP8d`rI12 zpMaZkd>W-n^MXN5BVr04a8vD(*ZV4{TS$F9yLbyuK|D z4?OO;Bn;_83!93>(69cyh0tyTS~#nr0gtgg0x(MV_G8aY2&de@O-nvXK1WRJlx#Hk ziP=nDv`J;Q919YX)?+;aLzraLqv~m>uS%pDBJUlfzwN$rE0*D#$5nAV1JG$pv?p|f zL>>WUYJ~YhXRd!kANE8H+4qXVk$XS7J*$A-*C%GjCr>|7wMn#6SgT*uXwKcWLu7^h z)*hi9Ls65~SXL&9wXW-$_ zBjiShBj@ZxT%S0Szp5Q@FbbEyw|GD+5~yfEw8YXPnwLy9ot^zOGq_rxbS&NX$f@@l zVtVWZ(#$Rky*`tA-Yfll>A#Qts-9XK(t4BCjY%cBhn5KZn&ylT_VYOf*FxXf{SDuy z_r__9(yJPf-Q%y)C(5vvO_nWbW$9r3oUz3#pMFc&NGqmPHjl3Mi%OajnbYaIhxg)Z0 z58g|%I?fszZA&;$B9l&sn}5P+5hUeR>qfgLQ4IV0UXS^_6)_?;@*2C@wuJwXwEbv~H4PL)w^Xwr^vPW|oYu)#zTvJiNwmE}X z6{f0F)FeubFI8!fv|ICzc% zLhhSPR{4Gx$sJ5wkpwiM`jb&O!cOF+NtC%r(H%gB$qi>D4M=yn)LjoG-W|r$;2GWl z9N7ISQ5K0t7e;CbirIh}sx&F3nu(AKXSO#CIS!vjyWBY~WV^5uN2vPn&3e`2u>uOSsTl>`Gg6ei!$A+$v5ki}tG@>S3CjU>8@nPXbLo<6l;W#pPk zRQ(&z<-vj&_nX~|ZT3z#NfuLc9kI6U;loi zRuCV+>TKS+tD7aZyx+QG;pj4zKV2p&tKA_MPYC`1u@GEewiOpT&C^`}O!P+jLg9AZ zf`m6;Xd=gd=FWcIQJ<`_l#0~e^X34vA)x2kba^YDbZLPOP*z;H4!K%&yfZWzVgK;* zE^gglC-zcLa=qCP@Ot4qB{?WbwHK=>gcv&6;J%^hdG8v@&rtsS+@DQi319`#EI%DI z`rvS&f!VI1A!i|k2)l(bTAPyVEJj2J{}0nxC!M~$Kl$f_KnR`5cBx#7B&vz%LJ^g1 z5M|q_d?D{&psPWk$Q|6hANHFI#PT4E0WLSzhIMIUT}|Sk-Gu#~USD)db8tP}#%&%- zw?Gc*&c{Op8|~KDS(EU!7$6*^00_BV^YpLyY9g7AE;(^I*>GxnMUV^#9`b!yVeEHs zkE-f;fLW`$t}P)dPSx!c*84nloO8PkjEVZcSpc&&4iUk889$Jx(TBBM_xSytgPl_< zm)t*C0Q2fAZ9V}s>LzfQuR6fi>0FL=%#qzaZX z*!<}Xm5`y|MVqOCqaGkRYACRK3DlvsS_zXc!;;?D#(#G37vMWCt74qE+EudHwtL<*!4V7iA&A;=^Mi{327}UC>Avh5f7`E z`X7fDh6xS|h?guyzZz1z^@+sf$)vU^=BUM$E>=u}pqxfNQ@e=S_FIA=b5EK%djf=4 zQ$RSiFVZE#0o2=MCQTDFxC{ykt!ZSvz3quqkBpKDD05h^>RYU$`r!eS* zpc!)+Z+L-r8#nT4QaqpfR=ySF7(BzVeo&w{3L|wHZVw~?=;(aHQZvK|{CvDA& ztU?y=N*j1ADQS_tKE#~m)~2fB$XULqAJ)y%OBOeH2q*r#H)T=1X!Lu;mLLq(q4}J6 zg$erj(cj-p8g8y+1yLQ1&{6KO)(_)^T9M5aEg0aRUJq!~ZB&8hq;QHoi0dc>Th%i) zN3u5oYUb}=B5q+#v*bTHG3@`dxRs26gtjoYc^Yx^I)hksH)jEvJd;1Y<8!3|(-eyU zF`vfu*SmBDwwISCE!`5^=Gc!0^ynH&PQEtrul=Xbun?%`#=D#o!VNDw9o-O%sMe)_ z(038f*qIxFgeF%VVqXm#MQ)MF8e-~C&dqA(npGE~xu-6gAn{xs#M<4YT*>$9K-2Qj zoca`;Ab5X|&KUkLu!|&DA&QmP0ZIKUZAcK))PnzQ|nb-Qua$odE{BvYSz z^x1o1{Dt_6R@`|v7fB)BeLp8Zr`PQWbhX{$Y_;;Xuq|ET*^PMUU1=424&?HvIz@wl z@7t2{m-x%sXEp zjlT-9v9QpP|4)Ji0bP_}feR!ON9xo~eU?YEX00ScMVGGmY!#5`KNWB?<8sn3Lh5E< zvHk`=sF@hwF`l>|i^gyDr+Gfy&yfoC4f=ohr7gdiBV_tRm22KCm+-vp5# zgeZ_q6z*U-BrEuX$6G#VEUnNPY04^f+R2A3oHpoxU;p+AVY!zoT&PRhMR_|T34UQ4``axibNVAuPOg7NOi*HwkBDa}R4xP~(8p~9O2`l1X#)+LwHXNg8~mtM z4*X8-p;t>EBgH3rjVkGj%ih!i9@(viN#vj+tqYde2**gj*HnSvTYtb^E_|jxkRw%e zO`gIw^B1WG+@`E4V=BupG zf@$w!A@)Cd&{8>~aIzsGHW7`l@xXNHnhAT}bXE<0v>%;%eQvrwk_~+8V0wn8J8G7H zwn=aKnMI+5&8O*fyS9Pp=SFsb7)XBi(gK|K;{nIL95(l~74M-!{g72o`8_-{KfjTLZNMD;i3$dvL27+LmN=!APd_?$HUowZ+e>~U!7&?Mgy z)13dhx@L%8MZooQvxE+A7n@sMi?$#jz_jxUbzLRy8XL3->+JlDzEb%A05w6%zT(~u z>Q#?u4APs<$_TJbYvuT2GMl20J^gO_sZTsbJEgSa^fJM61bAJsQo+1ShOI%M-D+bW zs84%)=dc$f$LtA}^(SPI2uK9%5MaWqezyg(i9S5$PMxz%O$zK%JHJ=yCy4)UwI+L5 z3Ruqb%19%{Vqz@bV=pCFMe6BXewkvk5UAHNrk8tTo7JcxsLgXPze0cXrEk)+&pt=L z^;^GbE74E<#9yL!z3ZLy#AA=r_rB{1+qgm8tkoLy()CxVQj;FRgTPnj=^TM(XCMi% zoWmwlNCYB}fF!}1ZNito{QLCidw+y>&e@Y-{f(dfDE-QR^BdG{Ib55bEl%JpjJqgd zlt}=}0HSP{O1EtH0J_jdW*O;SO+3`>@TL!a@qhT0eH!4G_Xwl)tZ&J)8pV#bOz&eO z-w5lj)RsIC>xMZ@<;y0YX$^ZPw~Js6$M&{QOpY}n$O?K6G*b2jqV%9M7sv25*VpK=<{fpa@ZD{)(`CdJe|W#EuK2FEsy zhO>PQ)}K+76nHq2u#1RMtr|{UDkkXSKaB{kYel|0=?h0E$EZi0vS^1EbcOn(plxx& z*9WcoOBk+4amo+|+_qT;Cc!EeOVIUnMpm@Vm~B$sjbvC{uUsyt+3{)GpQC{-DHfAm zDQqhqS7-$5~4Wu#ANn$*_#q=Z}xUW-G&HBCrQ$i`vC=ri2Ab2wfb~c%OSMCwJK!O%-GYbtbUK{^fd@$MCPYhefx-^s zDBc@@Od*B^#!jgiH&f1q8j+_T+_v`i|o{1(LUbV0C8i~iGV_c5R8QW`u> zy+)M=@R&BjdT9qlRGp>=iU>im^s1j!TTom{gLtb$-Q)ZCmLzD1y+1Zw#$qm_G4|eq zH3{spb`>x8$Det>B)$@d%XQ4-<73mcf7cnxgpoj?k9Wb*(IJ(wcdWu&{I&)re^s#F zAcI6eA~1`<>mXeo4_ctLhQmAq;Z-YWeb`ws&dvrH1nZ<&XBTn6L|Ezgh{~zq?O_xqT~i!XlXRl2vo?|0TRKZ$@R1Uk@V7!1dx zB)qR}coIY=mIz1$R*rxq!J0zO2Hn@c^8572_kWbmU6>t1Ok)vUy_lz;|MZX2-}|5c zZ{y|V$3C#A*uJHCy*q@#RkhtD@^1-!EhyTy?OG&~g@zx2kUsR`2W~;a4(63<7~}V` z=hwLX8olx_{y8=8zDa!;zqh50*aBYiftbMS%_^j=Hcx zbQ5||cTp7el;p}y4l+$t5qS9FN9c!s?61)4FMNyk@7={3`z=(Z7uD*R$nEZ#Fv%!% zm(){z40euQIDduCJ^p@9tgE$gg5d3=~8Eg<@E7 z_X4%=!utZ=J2Gq+0!)a;A%+F{RK7@i-}PQfoV!9jyo>7a@{vkrsnw0%xMOGUqDFqj z^-AD<%7hP@OpKcFF4AvB+juHh+MAGHVUEBXDf|qdyRb)hZ??dUyBXh$nWvDISAAs^ z;&B*%yJZLz0pHs#P-z!3&*wARC|OOVDOD(H_q#B>%oj#vM}W1EQJ62dXd{h0M|l1a z{*m953@FHk(&r4~WrPPg=dz2}Qaq+O9^sHzyk?saQxtR2c;=WWDU~iur)!V4!eqT;>xJtRvdn z+uK?atOOLKWsnGLI|A)apDHIcQes`~0n}#*ufmQ^XBeZ-FrkrS8D-UpvGVGOl=zs+ zN&JFEHmAxpXCqGX*dBo)#?SZfA7a0ZXM-|G1l%Lg2U*XzUw(at_=*XyE?>TeeRxm} zV!xj4z2G_gFA2nZm+`wcQg5dm|3;3(E4sxq@Pqo6{& zS*7xBfqF1@t>3>*-Fk(3ttRzg#Mr?-?_o2adv@w05)!HG#1Z@^>b#u+5TSPj+b+l; z5wJi&?5Va$9Hz^@>Y|3JV%D+@un^ksA88So$V!3XJUevL{xm$`+zm^Ty@B-yH3`Sc zJRg!_yAXKypZifd9>b0ReWQmy(wBNJk?8=*B(IObF_{XxWDsEe$VY#iKL3T^rNcK~ zhI4fP*LaQFdO8tSKEDGyhY=h{PVAu-HARi~P}_fLG)@+<C&FTz ziA*LlW1qc{iH{f9u3LBP#x~*k9NVH3)%$V}$48hWoYlsRj3V3ys~5e7cR>kGFRPWs zci8HsktJ>;0)xK2&aouG+QwetqRu>^>hTv*mv zBlUz^^~-IzsS^gSm-zx>3JVaD04us3Jr2T|T#D6YCyO4V;Q)&uBdtxBdGSuf{3O3} zi=lPjbem%&(yici(`eQxlP^#V8{^}XLyhcX0Mf>Kb+X|Q37n*mp+_K@DrgI_Y>1uY zh2czA^G?Rz9J1*m7KB5-5VL}3G4ze-vw$OZm4U#0f;TyoOApceAHGEY?;oddO@JiG z1%ZmsRanSwoKQ8-dt9efI!ozX9-Fg6>NIMU!+W+8Wdba0Iu}cM?Hj@El}x8;49_QB z-dHK^Qsemk0v@Zqz;hLWe&d5sW3+EfDu4QbWWZTO@V%YLq$cEYObiI}tI`8+14uEd z-n@tdXXagwWWTD+UIhalo=wR@CQCu=y>N=qBBxyj3U8h3&}_UKjm&;OHuTM}P62i#Q( zo}1L`{(4h%C5TM4Rs`5t%E7?_?Uc)u$!6Co%Q^~AU_L8@L}1$xsAKHXX*FQX)dt~J zV-_2uv5jhpx2lp%a`9CtO6sn&(SNxen?$3OdR`on+uhnfga zKKUL};OwK`gQ10{6KX$KWECBb%i;1P@1n<&3A%gtO?v(H*XXmK{Ve?lKlLg4#sB!{ zD4U%)7||kn`0v)8d-VDnH>e##Z{{AVC6jI-0xd~^wSld=nN>L%&j7O?{o+1p;6m;D@zdJ11&XW6=t>z85LE!HoKj*9#>ATaDvtfsI5!emiHI)fx{b zzT&xz{x_R$dd37Z$u>%t zH;I5mKp24*?6!)qFR8(?x(pJ5RU*LO#WtL3*#${}WrvQury;--Lp7l+?MxCbiGW0a z5#R}cw~=^0m85F*L}U3?!A3rW(RB-?Ax^@C6pN@-+JPbURH7R4$-!W$h6%fyz{EBj zbmFTzh_BimdxbiV&lAc#h$%*(2X0}aDT72nM_>Stq%uSofhIOT-G=_4OZhZd&pU2& zkm*8=02UOF5ARd4yaxmEF*eDE@Bn`Va-vzI-cZ*;3Kx0=RAr)kmw;D?;@$OGA&H~JkI;=T49{pry?>No2chYqRRYl&5ghx2P( z*Eb5OCMO#mam>lHUn|JA#|JL8ua(>H$57VW~Z<&x;of2BPDY6FF_PM=l^nT>^(o5f> z|NS5TZ}hMK_>bv-`St&a9=LkhO_o}kqoWgg6~tG5JLz*RkW45MSc1R^Ymsd{4;hfc z$siGs2y7<;twe$Dm!Fg*SZIDW8vo80f0y3=)Q^G$%bMu>Z~liLrT^^LeuFB9)>;a4 z%gchDi`Rc;aDsppNW{3s5MJmlTf-iL|{u0;FWKL3Ck}VgvY7Gg9sPTVWT@Wl1gF{{WDV8YM3M!IBcQ?y0*53fzQxNA(77j{rs{XTNv#SL2aZoHGLnsM0nEl+ z?zFp<$;RQKu0}^Mew`BV-qSoj(3CcZ*!YNAP}GSbt%6OW9Ejfb-t!^q;oaIgIiOa= z7a4UUVZCnWzUKqfIlN0f7*cjx%}_MeddNZ6S#|l2TqpWLmmS0Vuzck~VsoC#sb{mG z%4DT$R_v2u(-Gh{=J&>$LXfX4CwcR_mV^GjX4J$R%L0Qi$v=J9ER)KjG7D(<9dEXP zLgAGB6XUvMzO0d8^)Y6pF}%FNsHofaI#v~xe^xHDvnjS_cf)mUXRk>A?vFl2pZxff z;Sy{Mq^Z|xP%e{7O)XEv`wR#4;!7{k&;3WAbwz^Jg6H*@zVj*_ z9!sNMpPEKyvqA*efukhAS|Q-FD2YG_5s)NU(?)4FDj>o7|LAQX!OB^XU={N!{p?SE znEu{B_|0iTvm+n$fqB(`y@A);ods9bc9Uq?mWVU4m&SG@;?hh*8^L+I`%;zlcX(f_ zvFVwN9qb2t$HHflE)#*61WPBvGPx};IY1zjD{JIeaoEMME*v|8?Dx7L2PjDbEC)D7 zDyn>MN2Zt!M?o;y;!zWGlre=9x2%! z>OwD_o%9{tKft%zWE0PrNceb7a|mJi{Ex`wR~If`&@zs}`D39})NBHePlDSc=(Iq- zvYeUsH$lL)ieMzX>VUAL-EQO0dC5%7rxUO-;Y_FNB9pmd+5Vhu zwG|Z{5U|r;2rfQ686^e+ts%(GW^J6-}YK{O2j4!ur|CCc&*+Z6qIXFR*^v>AQ1>2fvlpC0ZWBS|BDa; z&CZBoN3~&ZMXf13kL)rnafl!FQ&1QYRXPdw{_kYw!bS+HUM6PRZoyN1l8K{r>YAO5mI6 zglxk!)0JJce_8Y5RjRZ{KlDRS)0duokxpKDPE!n8nRv3GfDo{6ckx2~eMg9wyBRUZ zm{{?KBP%8kVYFO*@z1ok3?K8*YrKTCg3|?}$LVtDx87C>ztCYNtO*Zte!Z7g)f1y5 zuiY4CRcHlW&SaFvZQ?e>D1}WreyJu>SxQ}cfZ`y*iru_ULn!BDGO7;*ST?eGdJsJ& zwh?N2%eoI)mz~U|=$SwFZu;~mo}zLoJAC9r+TgDzU zJ9ydTz~onw_;r(8c=PMV%H2$O#eYpWL28}u)ogyv*H^=31X(OuJ~4vMz?jnbO~bH5 zBh6ALV^K+xwZ66!EtwVVhXbi&C5o4fXO4i8{OW!0`vI!;gBeq`26*4(_UMVn-{F`9 zi^*_b1o73q{eAOF$g2{82q4hL`uSjpZ*79tA7qdSNCdVO0VcsZD1JAcul(7zLU2}Z zCc%2)Pd-QQ_hjU9M31^)kfEbTXw0+@W*Ci=~-qE7OL>P#I(YpJa zEMFoZ5m*NTDP;uGt076!t976s-7=Z{sy9qc^y>}PsI|t_x_uXV=`rlz3~3Z{TLOdV zp*%cy;hZKH>;AL8#29$yiv?;xhp5-@1|stiL`*d}V=IIE5a)~d1^j7LT5d$KAhFX)Vy7hOYd=gRj_?E>NPwoi^RO6;gAZ@ zfgB7FF4ZjbkR<_DBwBJkLNbe} zB)?h@_S;lyF`cF+v+iP`y;Ckzy%Wr2N5_=cg4ez5olPnfgAns%R4~c64GkzBb0`;! z)a{R{$HWE*`E-)1l?hWalS#!Bs_7&m0TP5#c~?uL|JMPtHDf;?nEBW2`g}Y;&SM60 zhLnU_(wWeCmfjF(LtBj=2Ce+ZA(z9#OH8G9m*3nnNCbRDfHzsAv?**+ zbso=b`_nOiHy6sL(VQb1VDb8Y{K|dmLm`hBwEMlj1#U+!lOuxTG-@Z zk^%Po(Wu^!WYq_!n?YKfW zE}kuoFly^ZR8CudJ$>1!lveTGyp!f@9Qo;li)Y0O&)}}F`cS-0J$)K%6aI0Wt= zSLv7k*5B3&2$K9tuL1j{GLm5Z>VN&;(SQ4Ef0we@e=`eAeD%hSTXggG9S{e}ca0fF z@>;YIU?ZI(h{hsawKQOHG52 zK!6woSdKsji*PV#h_F3F46}rXe`mlG6JVH_z%w=xcGxiX7#jlu33W?oM;k&*OTDW5 zy?5WcTkTbuS#j_IWOwns?7Yp?|i@S%gk>%=Xb8Rn+OV>g$=wz z0;~YnSyT%W0=xB$3=;C9i~9(q5D+95)2XL*5x7O>!0sa){T$8Iz3zTPu{%LQ4Y0w9b>B$@y3t_7_lVD}RQ=zJH)8|gu>LdCF8-aSO10Sc=<1?|!40aoCO}lJ1OFaybL<9jZ z5y*jE`Lud=QN$UXCd!Bi-GUQllm+xxbk=b0AX3GojR(M`LYW#Mci@Q(|K`8UD9lnR z?HT8$ajcsVK@?4hu9!qCrSM?IyNM_3#gnZ>B1IiUmE5lI!tXBc82MNK0_N6zuzSbj z3Eb!F+nqOl*Z^N-HxX!^M;cFn6+VmSMQ@1blD59zLtOg0ZPG>uw~69O}u zFJ-%3h>p!%mOcnv+W_81B4p&4(%T#No_Z1c=&>m1K(%$s<)Ak9H?p} z8AI(fz3p^P+SGxP4w9fMK8!(E6yXG#1^n$++{*Q?D7K*KW(Tb3eO>}XzHJ#p$OhC* z(!W%e^pA1+rRi3lSd!^N8f(`XM0U(dW~}WwsEosMH@ZJz2&89n^ut&4^e2dh=dM`8 z%}SXQY^_}F&o!^S?=JeaUw#kW`;t9>3Y1bz5vaj%O&r}#p^<}g2rxOq@zD|O?eD|5 zE1C}FiR7$7;T#0=QxMo10$mP1g^$MTVhFG#WLH~j3eO6@Ajv`r$Kc6dCT2ug8D&WP zVaX@@AkA7ej$W3t9G^#kZ8e^H<|dVkVum-5jr_KbfR5<%|MuViv5~+J@~g3CV-l=; zUV1Nm>|-CL-}_gupUl^ah`1|6GL;BWJ&&Yh>0ulKV1q9k^UkI?G(2xu8~ z+ZUOSj4-o~o+Dx@-p2}wY^Lfq>$%Oc-E3U9>~o`nhnv{$LSDPu?i>vM${p9}HE(<~ zz3jeM(Wl#I)U6%U(apn%HN0ETh={==)e!{zL}1fL?WXBnt}ByXDRBh&M4(``Ee#xzZ&l|&n=*psqKd^K0R=}*qT z*=kU}P%=HgD+d*96*Jx}j7bgL32FGm=5YVCO?>-z1sADjI1uQ-hpSL5QnS&Rd1iz| zd(kpX2&^N&;<||CO_*BLM_n@@#c9gq(MQC0uc#c1-N%Eu>Do8oJP}VVGZ^QIX!s|U zOhm;5RaH25I~5)Pb9!dnjmMJ4Unfr*l{&NTOLwdzV0Bk;5kq=HoU!`HjB~8A772Qv`TGt7>tuwe$08 z^2~CYpQKxbKs4U7t7<6cqJ=<5ZBYqhB3#)^s!l;-*3cv$N=z?iNFhiHxj(>gt(;ger6 z$m_ar%xpHi-3YUe8P8Q@{9zq0xzalXoR8C*Cv|MTW{i!>Zoh7*$Oa?LlZGqm@+{n% z*?=p>NhX58ECSANjoEz6etDR;_4~#{CCut9$5tYMSd;kY{E64=4?r#u$9PAj^b6mn zKX1aY1RpHuA`k%^&Uh@=JD!Om8znZ$Z}HF&*fPS45(ANAk$&YD-c4_R_~nbI<%q8c zbP>Fy(+)QgudjefVFo$E$;k;F92`WF1S^i<4I+ZTwh?G!9fb+6G(^|!b~+$TZ*E&9 zDL+66SS8A0l`F}SO+f-IxrNkd|9+Y*D;@7s2F@rV<_J9d{GpIvnL{H-Z6NUZzj>0L zc;azlBC0l=Zu}G`!Mc3)9{SGn&(iPw&TrE@fACRy)hk|RsBr7{u|a&*@i>T{pY@fp z1c5OEJ*>-g5REWAMv$3oz%nO)=1VwD5APLKbL&1BmmI{u>oH`llOXabUA>zQ9(g~t zzxtQdKmhwxn*D>lmtG%{ftI^T!~c}qiK7RlNOy6(o=WMTj>a>U@*e4U zR*uQHnDEUC`Bf2X-ughJYHegUK5m^-xq<-m1GFRZY1H9&<<7W?^(vPtRPRpiuW^~d z`fIJ9JJC6pN)U4+%nJuB(_zn%FBF9YYaSf=9XJGf2(*{YW-p#Ofm2Wv+8G3d0BdKO z+FnJ^s#SwnCl5BzMt4QXNPF43a&-)Y&!I6GbtOB=WD5us@d7+MJ2fqt37kqG#%X#; zykuIi&j%aEK%hvObOMu*9yMW{>_k);nDK`vHl;!tWI|mUlU9uwDi_vgKBpcvFxZ6#%ou? z7{&^POy}6JPc1|=DDLf38;h?h9K8k@?=-PU+rtKO&{GAr#7 zpl&v$?sogclp^xgMFb9?KcZX(B-w}(-Uk6or|SJiEI+GatJd#=c>}nJ`gXEfi@WP; zS!+mZSGlg7Nrv)_Ge8-ScT5m+dT2R$k<%Qx*F-@keU76e74aPIby}po_!Px&zd$Mo zPWvD@?SSyqSDC1_yjaUkU?sEV#jHA$%BAUj?|L)+;``sc>M}X!69WBypQ_k96cGgM zBEb88OoCOZR1kQ@AEQURIy$+Y$GQpZSBMA#ej&imVP5}iVGX5&zdH7sd9O`G5O52D zsy=ZRI9@Y6HAu1&qkW`l!YtOMa!#Jb-*<&H>-iUM6Jj`t2m%`+&;nuoZ~U|W-N@t0 zwR@;#L>1pCOWTRty#c-X&2OVmfBNI}TmSrb>DT|K|DK+H?mGz1=f+-yZFMApAmAGU z9bE{pd;?nw5(Gkk!0r5fbXTuQiZ1WJ?BJL_|A~*&8{hgi)0TVtn_f!ac5dXVwJh=76@?p)5JOo z40t;MBf<(WbfVe{1acUF*FaRTN@6=gx}kvqT06h5luVuqm{AWgI8Z_6#P^>a8IfJJ zj7jx;x_VK=`vt7prpen*lpUYn*t4{Nzr-(^Ue8`;ZJh>QP@t}vvPsi2(hwE7? z^8&l`fqN1(%JnJYrB!v3bKW74OrmdL=EQw~g$KI45VTI3^%3D>I+X#rp+bH1PbR$@ zOByQ$3Nns^VC&@Yke>VY>;!y#o&1d!0{o20=8DwoC$_Xm$jboXUO0(XkC5630?QF- zwT_LGc|;;$rg0|1YBWy_?xN+XTd%-v)(g%~LwVdw*}gg!x3DbiGGMw{8WhZ7}7*#^(l=l%y^o!1Dtp z=nT7XN7~kQ(~#N@Nv}NM$?>is9VlxMMpn6l+<63Q&-)KF6^I9j?^c&}La@wLIjQ0A7=G8qrG9v%>u{PRZ z<0_C7x@QSwPp`3lW`8Hxnw|Cb*!MqlKmB+A@SRjCZ^tm)+uDUQ_p`GzTWkN}tfgq} z6#~3paC&-5dmzEe=5k&Y<7>W&lrWw63iyr{)@Gt`j2SencQWA>8*?)OmIzh{cmvzY zP))${6oDQl5_Sl)#>!NZlYTr;oMrq@@>q5v`9z-*4gzRRa`66Jt=6EV!lA}Q1cA*E z_{^8SW@PaC*S~QqHU_+h$o<FaarSjz~R4f-S%4^nJ)T|y}{FX0*fFKZ51a^D;)X~^BREV&G z+B<`$SF1VlkH~nTjs**bexUT*_T^Ez)U6yi}NNovKcBdWB;FZv?q&wkjc5y33Pb;?V(-T z?H1Kkb6vS!>|@Sv6L|kn(a<1R$b2%qxs2EI-NF+P|eXO zs`chlD7l3s}9Q&ogXh`6slFH78-c` zzc`;;lS`0JhqnS9jSZGlR4(E9+^pN`3uD4Xvz8byL^ZHDBC;C@13#5EV}q{ zLvtCjc(5D2OKKTa1egSCOoYXCTz^N)eILBOz>D7Aj{gglYg8!ZFRI?d{Py_pg+LK4 zv2si<%Msuf1SDAX;~NWy!*gKyeb=oY(@lJ6BZHsi`G*IiC~7)tmtf3tq>n_ghi$b^ zj>xt!PBD4Judas=eRo9>uH3(Nv9fZ#D~hc~-u785dfU!)vjpihqN{;aT+^@~%LGeK zWJ&)BViP#2p4~K~ks5@>!|d-bh-LPU&{?@VLA0FkYJH1304Wtq`&yHkI`@Z_W$cZeP?U!b_xmy z5fiVyhfD&gviJQdWUUktb%WQgf$aVfX>DuO2wtCPw?;k_J**QA;D1xRau*dYU8BSA zJdY~H46=j1T>`9eM`IfV8=|DM7vxv5IQ#byeiyLES0asrg^FyBz_@KT&q;C+1Ox#S z1cV671Qa>66oGbYIjI$UH}a0+Cc;ENxk8yb-59ku&1@4z0+hA`VwB3>C}@5C_I0Aq z{4sSKRqA$H*yHxY&wu^cXn4L4$gnlx+ge8O@n+XP7eXo-qZIZIYxOGCH>jEhTYy|{ zw6{ILp5$QI2RZ5by~Qegwz&^xvsu#~z-_@k+-zB3$GX6Y-#06e2jN^?Nr7yxcOJxL zd;3_XfCS)RE|s7L$Y<9H+k=!Vd+3)NbgXrS$oaq^kWHr$d?gMN#o)b2av*M2K%iHH zU8oRW1*Xf0B2x&6W#$wZ@^v)=)%u7bm!tEtV}?FhHfZEkon_}%m$B|Fvk5YDE*nVi zm&+JHI44^p=FZ_o-`=&gu%MI zY2{WC4_V2ZnSb39j)0-6)~8)ruyHrepG$7(Ao*;LKvRX0aION!%C2Fozj=<5!>%BZ zNoNrCCPy7al?5j}KC(-+S=%#?<{0uj2EnFGwfu9KwjMv@r6yU{c&^BA|A zcgtQYiyy7E1#=MRHY8)H*8t+)X}2rjo@SDh6$HE-&wH4+^=@Zhi8!K$UA?+Tnas$e zdw`qj@Wu(&-5i88v(g6V*DNLSw2{Z`rNMmW&FX07*Q52GM`})T&Rd zh5G*Rv!J`>CYaRGLawHl>>rfqr+?%v^ml*!^`__L;Pw#UJ%mPcd9aM_X(lCy6@gj} zglcdE*@Hn>m?fD?hgp5m-Dd>)h<>Vq;HrzynCPnAl4q;W%^<}^1c7-Ht#P%M9Uq^! z@;9RlDH9(MlW7%`eX68-lp6U8E+l7Lj_WsWQ7S2Gatq+d0ow>Xcm1}J<~6Ur|J-rF zb{4KC=$!k4{NW$`J9_w`H&HSv=B2IzESUuofwtNg0<1u`j3^}tY!88Eau1HKFQp%T5(U1M;TNku?@U_?IT|e|@`qK}8YT=yS1D2Ph?PhHGdS2@et~es} z;=PBENQhLOLo_@X&nZ6lQyiG*0P+22q-=V9M{j!t_WL~qbFb6Eu8Krf%1hM^>ys8slg+SxKLKUL=piG=+*Bh4f3lg9koGpE=c1nffKKvBzkzlb4jvI4S-cM{I7?u;^w5=6H zZ%*=DmZnrhK+gflt(KI>$15cl_KG6>B4olct5O5M!d|IDbp%M;zC>kBWBW*&X~1Du zm`{WGAco*$(cE~jm=$E>7!zOdWU<~5l4KjO$)#IBz=gNY7POWkw~7FhPcaEqp$H~; zFitKf!g5#5Y$lDUr@A~?-G$Y++;WK&jY-t36sjb#;A?MgVI^CiuHk{7^AULpvm`TO zDIVw~fa4Go7_;*}RnD_w(y$)wbgXZn4Trs@Bw?N@DH&TrpbIiHBD^OGC4({BQX;u% zXA$5rMJ8JWD?Xl`2Km((ip`#-<6Pvg9|*YBR{ZYdynGPeYz@G|!KO8J3;9j;h(h|9 zk|YHmjM(*n^_uWvg<|l+gE5rrp4x{aIsMa^r~`; z3Mn2)Pvog*Zcrg--H>^bQoacSiwHdV^s~mna^*7BH0w4qi#fS-MC}jhjc(A1S7j7<`bL{{xdk0V)ZSOltWOHqQQ>dJ%xM`U?o8A?$ zw||37X3g8z#k?*;@%H6*2{KHvF+9m>R zmDg$VLWH%=M%b~knZTxyFHy_rd+RE{o6q5++edWuj;o|0@KXRw=ZkxyR|fs7H|V1hpUjtpaSF_5ng}N!u>3!7ANt zXGX8O?{50FUw#kW`;xuoMar42B2dM?Tu(?_w%P_!E}TiQ*y&<#Z{OIT2vc48{VE~| zbYax1gXD_;GSQW;YsPOuMi3ALqJ==SAEz&z7U^ZVE*0ZlV_&~ks|)#6w3>PAwfWe` zo-lOKt(#PNuCu~6N|5W_`&-YlD_{Z{to@dZ~fuI@yP*RUl!R_1cKfAo9y{) z(4xTxWrK?CNK$e7-id}DTG$irt0VspUDK&{e4B25_M-+io%)#(7-4+gYrvHBxs8CL zP_|g1gI7I3u_OY*e&tidK^v4r!UzuQwH|@Ue;A+zmOua^N(chsN1(07D4ob-Pg&cl zKV|rllp3rBTGbclckG{CD5S8* zXMGaJX>{FN{}RJT8~)?}%}b&iX0}Fk}WDt779)t62u| zx?Dn`Mzdv0HRcD1$1!dVnJ>JpO3KC5pR$|hHfLK*=0H$DT-@$?zuwF-zWCnlfOPA$ zCd60LCBub)?2Lu0y#lE%vv;yE`=An6sM(n~(QK-4F_)uOyJbRtg?IbZ!++CqB)zu? z9f9@QZ`t2FphB@=6gwCU>G0+uoSNL5 zq{kKRFTq*N@Ecz#Z#@F_#wnP>_k{$@6sm2%vG|$FI*5!A5ImyT6H=Mt1^JaRy+AWp zE?=YLTRlXj@ag@v?OQ#H4Let-cpM}JAp6W9D$Cw|ucOT6yJ+yazo1t2l#(!HUl{p} zNji3>ZRGhj*JT!dt|bOpND=k}LF^N3oaD_KfxoR4L~Pe1Fn%nqzcK(<1YB8X>iN)b zRur+7*P%0@w%-A5>g@%#Omf8%QxcTQ7b#UJQ(x^;w|0#6pWF-qmKT7r5irw3iOeIg z;wGEE)Mg)=PP+KrVwsBxXODQ$oCgOb`uU%Jl-~2${j+7suRtNtX}3WR?QXz?Kvhtb z2?PSFs?o{GF&!LS3Ka=f0wj|nyMw@((AD5+lJ~d}$zBj}fIu-VV+{wext634JKodcYiPgrRoC(idq#sBe?@=!DWXT; zGE0K>;A^kZ+aGz59)IGmEmV=$ue}uxfD?T2U;%#1l@15)TLwvr4;2DKU;UMWGbapH zBLzU&PPx6zom{x^|&KFHOaIc`OD0_MD+_TkDY? zpnWW-xOSPYkA|-qk1#Jjcwr)90qY z$Kl+cM8t-5*G;D}`@UD%TWCA4CvRqY%pX&fq3Oa^ZzINAUQF|EGdYLJv_XD_B4g)7 zZ#gWMlrdnfHR|(K_Uw113=%Gb{0gp#*rbcchji_ZYep2$p-a&(x_Y0uoNCSfbHKBT zOU8jgAdPz=oyt;gz?1#iXI@~G+&M-3eI7;uUVeKx-;#*}0^zPhsdCw_FNIt($HNOb3!VRHy?b#q`i;MI;=1O28FZZ(7&^y2HmGrN__F2qXoh>$7ue4k_ zi-5diX7SjSU!!&p#{1HRKFH58Ukx0i-A|Nc0wg^O4YA46pIZa*9cm|?)ORJL-5)lp zo$cG(Mgkj`Zd8YriLEO!9^WWfqtEPLq0GJCO}*PMlHP4mA~8qQ5Q;v`H|Ms*D(+UV z+g3eH%C-5-<9QOV9l9Yu@vevI=im1htQUF{WWfy`B@Z&97}o0kty2r;yN!UZ_d-X4 zl}L^VCwIH$qF4Jq<|Qf!u39jD<$yp;eAR|Am`Jb?$PO^372ES*HOh`^)9l5msT2T1 zLA<`{1oo&;-yTvWIiNmlrVd~Oe&=O*PwZ&7a8&JP2f+a$uYdg;X>Qi;C_lFnwe*oe z_QyZ|IQ`U5z1OX5B_BZ`&i&_yX4flGubogfcNb|`Umo;Fw(vcyFY|G~WQZW>Ec`rWC+lIS zK{f2}4u^fiCe|-Kq#QvY=m-x`6p~zyS}q#(H@XAL z7xpO$^0E%{m&n*2b*vC&TPp37s>coXZ{2v%GlLzE6r4@eW~+D=OL>$6O-)+@RtMNr!kJf}V8YxExrAK*+`byg==$A%e&E&^q{c z?flAdl$T%xx1ZaEq;#o7<-NiMSdDs{s)yB!-|}TM1l%O6v8IW&9$@V%Yb9>us`)#R zAL9=98$DA$ok<#b#}goU-Md0R_~<+6BcJ#yQf@p;iPY%abm8MR8RAQfE4WPNE5GbI zTgRj+zB=Hjg4uVldP?I18!|=1-Qr316U=pm`w{O$I!GRIrWxLv}FI~ZVRwUdAv_W#! z#l9R9U3C%Ai}$UV082y=5CjAPCkXT~p*q$OY$3BxXIP?p?wk;d+6~&zAOO_?A~=f( z0wF}80)zW%wF-jV9>!=g{t00dipmZU=pe|S5MVg~PLc=$JAlAp@qW5T|0GPQoIA8d z38pj%V5{GHoW7m;A-eBn2NzW<6_WIeKl>Q{#&7-M#W7dDY_c5hiUQ`DINBp}l4#Yk zyt!&})Heiz&^g`EA&7ROZq&=Sj<9h-yjLr-4uRnIiJ{)5lcU?Pf!R0q*Ls*oSI$J(RpE8d;Rteu&nAJiAs>Zg57l<6Q{p3V6nBH)cbNc- z%jv>MtgG|An+6$H7UhE40fX#jv(BeQb_@Yk>!6>H`d~1sZuV~B{u++wN-!`KEd+tE zAuyykFA71}X)(Wdi7vn94cNTs;(Z9mw|0w|AZu(G5VqP~=*#3z=k>fewu4_Zj9=5~ zIH_pYvu}QZk}rIlS|_)Rv6qJNkBA@;Bm{<-FT`vbF$GC~(M1rLM_@uoGdYvYWiH6C zj7=JxDwaURTvyifQ@>3G2>Lb zI-(wC43#*4bt(`A8``=pp5f@WqJhZI;yq)d53R43#WL4rgoZYIp07*B=hL|~{Wl+Y z7rp1P`>k9q*8~882KIH>!CgcU@EZX(;yXDx2|Ni_Tv4#U0g@AuP$0l0S2}`o@!uAV z4t4B3^KTJBKoAfFyhPxF5GzrkV+^aF0U=f)F(9SeqEfO?2c-naRYv<0Ug{xv3j&)W z@bZ`6M_>Hn=M5(jA;8)cO-UaX1Uec!6bvb$@T!-HAP@`$_KQNM8HAST!#=fEcqNtV zUk`#hfzUyrE`9TJAA!U0kI-FLCqZu>eC;)Q?f1Tl{`PO4oYGUCt5aYE{;QZP_|Qb- zTOuN0kE6~<)1YH~wkhpa*YMHkz|ZL9slPRRjM}wRYB%8% z1m|hb#BDne&lHu61pz@IN(gAC{-#l?q143-1PY}+ien7k8^WgmTgEMwOOdgR7g%pQ z&rB+7N`S?F$?Q9AMm*)G&ZS~;r4DMh3sc)9Rf>Dmfq(Zhe`>2bGeHyAJ70j$cwd2i zX^GM)1#96wgS?5)O~|jdbx-(FuKQ(VG70LqVD>H~SXO&;w6E*HwuwK>ge^MT;{LV_ z9yuN{1cU%9Vhy@W)k!6jr1p)O#x7Mm6m@lj{E92eR7}OGT5rx?Z1GnnlLe_&lKKPW1)hY#KwUaHVuG#gdHK`Xa~`Y6x0bOd zPv_y}d#PLr6}xZ}V$mV1qAq=oWX|1m4|I=^p(apMzDyf}L_({$@ZlY}I5~UF?X@CvC1|q^aicIIRj{aoNPXq6q z()bnR{+5bA$Ve$+L%{iRlsP!9+>Z#x5EEB~!1Vk^%nyFjhb-%9mYUgKfj*0Hsw!~kUD+@A-C>Z6_BqK|*< zFR6EQo%$epWm3=uv5WIU28#zkd5*iu%?Xy9c`fR@`iM2$eYre3MXa+7f<+Y+{Af1} za;$r#lSK|l}?1O$N~Akc*^UO^ezb_GEn(LoSMCA{0C6m;z&aGJh@@~NAY(9Y~7 zjPTV5nKnqUK1QWS-$}*%gskoF|I}OPe|-8oq_)iL6nWjmdDf#K zePumHQMkfo3&7AlW2B!u>BYR~9X4s!Pbina3+v-8>K~7sQ8*ZEy>=9~s))XVKqL_e z_LwMWkdNoVi_hXjB1W2ex{^3%Rc)O3KCQ}c{#-s+01-;tv3~RU$#3@%V1K$!m+wTm z8{I?I&zu&Y2dheNY6B|5-?&l3rreykNq)8NnUc@vP3^FH{TQ{|^*PNZKiNM!oyI&S zo}(URV0(wZAggL47`#*cIh_t0(iDibG{C8;JYI~Ek|`Mlw^WzsO_S38H1R{rk5MV{FNu@%9z;+QRX0ueoKj}J=e;n&;t{;PdF`~izI~5@ zR3nwmQ{j6arBW(E$6xy_#X!K}u7lwE>L|$s<@c}9n;v~HedY6?pp)-Bh574j8?MjA z>J{8DlPQ*p1%>&(YBi_vb=RbSTbpal=FuSngpbJqi4(j3oR@hU45KS2L|2A^gii5StPO37WS^4 zz31$uwR^Q&WjTC^yH&j1Y6sx@9j?0T=o?R?;pCY#nELK|VUnS*2x! zJ242(dUz+D9v}LuN7xE0>|di|apF;!&)rFfH*V}O30Bxza8rGQ_=e$U^w_vz)B0^Q zeGswr504mFv{G2Z;JGi)iF25bvUE;wBj98oq|h-M4j3a$?eWJg(k&yyb^kdTiu$hP zx=L*Gyb}Posc$sz#a3ITy#vh0F^5-Ak3jbMCF+A&b~A`;tXA8>+I0q*o$=sU z*B`Crx2lJZXudcfr?O5*r};WaX9W&c*OCnBC3jz;Uwr=$&?67M+)@g;C>RJZc}x|C zG$Mk)wh`bxq@$xF+N)G3o14r@x2@N>{6uo%%sD_&@6x0YQPwsVAKN>u0=)qL*OgcNHCC&hBIPlZezk)6e? zFS@-T_%-XmkwQce*hK`IU48}&0oE?Iz0_F{u!6u@?q0eq1XwdrWrxS~iI4mxz5B<1 z_~Q88R}1v$-+6%k^uwRJIJWAG<>lv9nQU}!leK=Q1zWH6GGeKfC3`{8V_oHys>w+~ zAS?(BeKl4H3o4>#kP#T@UD!h&QDy%U>~5HRWk_cyN3a*z)J|YxQyb*^@0M=c7`yBi z!cyDdB9Mrwq+>sMEU8o)zGS0;sscju$@?3=dFRJF>iBA+RJ=`H*ikJL&X0rb*cJA- z%78>B245;SeJ1Vd5rym7M=%55WF@AM#`bU63wA>|P-|~_)4NfG?{l1;`a!H%1dArA7|frjguJZmg`KP8jN3twA4S1P7R(`76%#%PnjIoK@N_0L^b zUcFH>{PRDjnQA5jgGip3@I+}aP{95Q<8S`V2@ke;U8i2R?%cw}SH(ivV3p;8HM7e$IpQva zNvWnMOMHxVWXU5AWz7g~SVdEEL84PSfMmVd`l^vQ#K#scEAxTPP+{ zm&8Ct*HRUO2umRy4ECK1LaJpI<$G-qE8w1wQGcjWyVYEFDHen0pD|;C0(J^Q|B7LO z`P@!0jYCsw&r9;;w)MYXE>T7fM-2gf`EBdD8#OFLTAzM@G(KUnjc)yvjz0Bg)W@ck z3X(v6AF)AzNOTZ5y?vcZd)E-XhBa0u$1;;K4r||a^OZl(Y@FUK zZ#g!Pz!DG_F2i-)xm*#8Wm+g}-E$?K%h0oEj>~4JwvMJ1|f+XMg=GP5% z3Wa=-)Dm3;0nZU&J5vpNiK&DM!dQq7V{Nx+xQ(ycB)s7~CeJ@Vh`NB)w0Tf3jXO0pDu<|ae zv>7Y`?I12=B-w2r0k?MTme*uL`^5GFHW=-L z_aT~>VoD13Fm8_M#`>95Viyj%X4B?9SiK$y)lB@HH!XQge#QAT5Kv)Wxc{Y6d1_-l zFGUH1#EQwRN+7@L;qrFdx)1j>5mq*nBNcgSc;0mk607;LlL)Spp?YiNyPXA@90%l4 zG7~$O))e_wF|B|&kl+(OpU-@aT=?zgE$D(eZe$VnC}O?DN1r@cNnstrE!VPHWch^<_H9aY0~L5fB2b zU2XXY)SI2s8?~D8A|K)Rw9 z6b4mH5M?&dy&%2^h+NB@swhG=K-;*FDLbLQ_tQx3vgct zA=2qB`t)D^5p{0ANV*C}d)#+^N&8}woTOqtO|{1QzQGFt`9g(SVB?-=r08HRvQQ|2 zp}X!^6+%@`r`^DPTgEemu>-|7h^=ykIKF|9jc^|i`&dlr&#>h4JF|ms*;4trmc;d! za6KZc!@l zghqDdwtdh4CfB=gzCuX@GZ^lKmbF}n99dnVV)p`ats zK)?$f&k7MiAZQ2#kpwHjB+(+SBfxuRD)y#Y*xTp5VK(Sv!YdI$U>X4?2hu>=J~SK? zgaB(A8~Gkx1bVPKuj-2Np+tp_F|B*%d^^38>{CX;9xrU8a&e61@GQOO>coIOx~N2} zX8Wa4pgSg;dd=(K8kowZm5|ME1B09>5)}lRu+!UThe#1YARq|j(+MHK3P@Y98pnlK z(wz||z+zhi6?5`xYXBQV&DiHl#TNr?^xzyGiz!shVLt+WG)GU-m%eHae%<=QoMr<>?PqXE)lB;1OY5JbntKg&?>UKVMJ#g4Y^VfaDu>2 zl3zIiO40}dVL@QiSN^8y1B4U1F2+_4TCG<$n}siCJON)R1%7;!N~Tkp83HVW$OgWd zijn|POq}AeB*8tBG^CkMm&*)bw>?X)HOW=JtwVr)V7nTx$IZ6k$oDNpg<=XMSR+!O zb$Rjm9Q;^2T}-Ih-F2#ct)!J}qJsbv)MViI5XZX4CjO7ph)k1T@$q5?`*?Nk(j}mxp zb+LaqEh*d~yXI6Ea5jw@!iNDh?mSF0LIDViiEFpo1Sk$gk$0lb?cs zO$5Y3({X;O^XJDqu*n zYi<~x!h#EY;;FjfAe)J;_`~I9FsZ=|%($QUo=Sniyj;nG=<0lsXE?Er8nW5#Q3a$~ z)!KTZqh)Pc!N8p-WMP$dyM@VS(ID73dhSWX*|&|hZZ;aeRjI3vo|QdarRMQ1>VNgq z)I)o!?Ka4xCWCR`6hcAgB>XFjprJ zNlRl;&~SfwTK?#AWtVPQ`oE@xAk}F4OadJ&2t=EJBfunB1B@H<`4Kt9Hr3@wej=MA zAY@mYW4Nn1TyKr;K^^P3ee8!T9z|5$ReYu1;X{Clu|`fCu+=!YM=UeLwv(K~P6@ z5CnWjpvyLClkF+r%a;NL0YMu)wX4!uL&ZMzWKSWj;bZygpU{=d@29)&y39Z6?QeQ1{lzC6|5dE@tJuj~A)M}K&a zK*WCpmf^mn`}nV*X^C6vD`QY1(pSgT@#FqBZN>;31oySbS_HOqzpmBGN6QMzgpSBo2z!#?QncN=s2uHz`R_6xKxFP$-1*h+=(>J{5gO71n?^6+e5H$oA-&E$w zuQ=#aIXL(7S>?lpSauPU>m!2z8}*mKcB<)123e7*srMCW14Cx4G<#vYQF^^mqY{{B+aO|z zniNwh5K&EtpqS_?2Pbm{10^OVYMl?1jL8XbVBu>@g#wtvXVGAsSmuea##iNF1k7t) z%@#*bUOfOCr?K*PT<-YV3{Py;i4ExlAogpqb2ob?LO5Fi2P&d|Sj+XvI76#UHLXOD*PUO zL(8OKCjgpcR#>U5aFHB}t99IrRRS9-b3SN{CUar)&6<;(`!b*3n^6)SdTyrdl|f+yI0v;f3b&GC_;c`8(ks0vJIIeSb{(w1JzsI z32_ex`pGA@PmH%jT{$cWY!!hX?w1KU7F3BLax*W-@CRf|V}dMJvXUC@1IFP9$j4J) zIM~n28a-pPshl=pjE+6`Y%WDLZS?$V>Tx3|7`IWgH^Motw_zVNng=EW1bu8cG7`9Y z<;tc|NP0maln4y4*w=<_TP`i;)uC*_2r8XoM>LT@A<#%8I8_7)u-fn-uD80_gCFhR z@pADd(t-`_mp}Fgbor-#fl{y|W_j;B-$=i4L4dWG`=(_s=4khb8*A`(%d}qWWyDf; zOWgQ+>nd+tlw=?XxQl?x_OC(Q6kZ9K*Uvbw^IusxIT-{5*jOS!lFpWB@6y!^jq=4j z9pAoAJ#|Chm|#`&qJHuv3JAz^)bCd8sJvD?*>5r{Uo+f{VXJI0_ArxQsa*thT0@j! zR+b!FM4$)Tcm9keo8KRQg)J42?K1E?Ou_fjoScLSv~qYKv{bpjE`XCS)P%ok5#&@2 z5Jx$c64JN2i~WlIHKqk_92D>OK*ZTH4ufml6PflkXMfuSNaGq)#9QM+M`Tq*brAZ@ z`;)VeHcKA+gQ~`)SBuITe*H!4HNv-q{f>2Aqh@n*9s7|dQyGwcEpa{_D-xl`v7E3=3j2*k)B zCIYdT7t%jBu5v4HUV~hma=4YdwS01^#0>crr{cj;6XXl4gs-XA>q{>g6H*zImpB-& zab=&$j?M|PmL_!RMAw9+v;l&mSZX#j9+O}dOMBF6)@%(5vzZ(U0ln zczE-Wu3SZ=D{O}Kz%+FG)@=|b`#agIVX~D12^+hp@q~LY=+ohiL#X8PhM$eLViGLy zN>iznG4$yJlOz_PKzl$vg8rsSP~f9WlLqFKX;i- zh7GTh80|TTWX4fBm`p2q^(FLyhwr2R<8wviyL#i-O_WQOl93&g17~tM<9ioGt;J#v z1XymCw3~Tl;W%C_jpk_edW*VMGvWic##C-%%=3j!pJ_p;R}ge?vt8`v)oyk%AIVY| z>lCqPzHTJ$V%?xoZz2LCV>1zcj0MbIZlYWWzD*O=c&D!Y{_OfRWP=PhNV*zQ8=ZHy z*RRetOlOB!ePwb^_r%S->}qATpIg0dvHWTBD}L}X5!Tf!WxB;ASbm8`^$!k8^gsOa zd+5HGRbbT8q~qfz9JUq8V6P>6K5p|%WhrMf1Wr#8^;nEBHv>^p`-VWL%@JQ|t0Y*7 zb8-sbDjmXt+Suc4;ln|bI0%fcMK8Ef2%9AmDj#;RcFSz7=feBZ`MeNdjq#Abf`A<03Q0gcI-_&6bW-2l;sS*}(5TQfEa+`@lN zI5ad7#hJ;hSeU%3e{QGH?Z=2eEZsr;;=6Hx|65{0#l%;~Pkotw|M!0T;?i362;sF4 zE`D$G%ac!j%_#oPJMY-08dA0(uvG*)h=Zuvr++~2c<%=c^d5ZeHG0#VUQ3_*+}|!i zbH!m^vksu}7LaXml*o1|qXd4I8R{qqvM;;gs?)QvLLXF2yFZLJK2Y_ihedd1QC;vUs=V=?saJp z>!{jdzhFPOWU5SQY;E)h>qf!>j^PaFF@PJG`vO$t8It?r^P zb1@aCYGXun#jsa5AlS0qY*PuwzUWLwl}W>I1Y3B6_|WhbZZ;?SO(ikDs^9_O&pKJ< zlg|70nx-!Jjjziy%;z!eqyhSq*TUQYLVo2n%Cq@rVYAz))n*UMFF`;M*a`wdfVCCa zrO==tPyzF59T8_lHb+2*WBtHGHc@81tyK15R2H4~VrE;8R()pbXuNrwj3+Of=QNu` z8STJ?R(2d?_}aZplIq=AR%6DXkS|&$=i*7@Jo!~IsTh;8mcisbt80*dG1=Ai8#lMA zA`@NRKDtE-1>D16V%B>-f61?SgK)_XcFULu@&aO#Mg-J6FC)n9xDen={%(mB#B5nxRoguEFT!#J%E zM^*jibM!Aiks_^CH;h8;%mWthM}Bb*mB07w6+tVwB2(@DrQoEHRLO#$l8- zz&c$n3xd;h0ugEbCCy(|lQ+EX74%Dg@6A+z)7>~yopC+*O_-d9gO2R)ANWd~x=LR; zw;X{6f^29)OtTyyITJ_(woQV?q|+i31iDOeg%9sXcCp{igjXVhfL91yZ_Vy4@jGmY z{pT2*m_!5tKM_bAeu=Jr>yJpi>n&8@`))sr_PwkTvD4_@n-FD<)tI~!zjbSTZ1lI1 zTyy}aq|A-L6&T+aK(4h)I_>3Tiiwm0r%gOE)g70dL?T0;PH>N4Ia%pZ~l6i(dMQ`{}Olx}SdT#~*M;fMrujBS4tV zG=aW+-4=(-%JWu{h*bmxEUQRG;X1w*y_N0G0llr8x?p=xW{aeE8sTpaqXzO03S&ch|1Jq5D(iG!-`ABy41pV9<2*=$NrWrEvT9k}qYC^g zn%eAGCY{M!B7B<8JPT5(h6(uE_Zx(Amb?~#S0&F~MF1On<{dFDv3&egR{vps&HSj%D!1o~0DEvcRN)iOj5fB0_ zb6n);4j@n}m4*Du#da^=|i5qMq>%6-qom5Dp3{ACSef{@>wiZ zs8(ecY3tHP`+?4PApu8MuqxS1Zh-)+qqRu~`C2+%AQNJ5t6A^#b-g|&M8={}IPa?r zoZPxy-beqC8Yj0M8RmDoD&>_psqH46J@r*e-h7T)$A{Fz zLb|55H>}$Fr&b)BmMm;fUZm0Ytt95P=?^F}Dw^bm>YNVQ@gGj{D%~ zR+V}kyW_?+m2+@^8KgN&#?Na?vwhludMIQ4Gt{;s^9g(?V!lXMf7{mIb^=3PXQ^DR zsq2}IhdgTuAD2{qoZfZCBAMYVh=tr}?8D?&sbZNDSOe8NP0}&$Ddf{sb%g+Hw#*q= zZ8Y9H-uy~~{Awos)DKU@#fyDvT1;IO>m!8dqUh~z8?gam;$)?^9@_$VR>Y#V{3 zvdO!2+uBFB{95WVm9dA7XaX8X=SRgFRuRe zU(r|a;o!%2U(3;phvFPQjZxIU@9s*Pg_h-w;*G_PJlt|nc0-pjAa3S0&Qtyh0)oIU zAdrN;A@Ad)K*CVIb{A#K2h=>efdHZ!B@rxKr>GEM?Luox9d{dn#r>cQJmv?HM^g(#jY0ER^qFp@t!oH>|f>k*3EAmJu$u=Aa6cFU2)~FH_ zGZD?M?Y6o-%4W0FL4YsIVi2t@&Ql6m1-{ia%h^m{n9t`ys^!*vY&vKEzsF)p7s#&` z@pZo@o0pLSsam7qtj(R&hwb~aS@xHYMqhD)!8Xz~*pCYL=uB|fZ73pT3IaQhfcGQ& z9S2ydA4~+&U~}(*Fh?X@2=Jh-T!Hh?64u;s)n=k?eMcNkxc&Ajd8&6u_g*0b2X;8n zTV*Te#fyeIYfN8ED@Z@GYD}kMaK^Vb8ObJN)X}Y7J83ET<_-dk``pUoh8e4xyZLRX zPAHSNS|f+IG!}T$sSKF#5d~M>e1e=$$Eep=sooeFujKOuEG*l-_uTI@p=_iOC|xM- zkI1jEfykSPaWHIMx^f5Iy7>Z(y=I@^fvFBVt+`@Q5||o^B4I{=UuSk7kzuT_+;^U} z8h0Uf$W2|oi+=Wjd+B#Sl?Um7Gh^sxy-N99#&B+};W^Ivc3W_A#XEhdcRj1ae8x=b zmCWWT|2^MN#YCJ=zxf3VL<-RuI}G`K>cKlIR~SVPX7a0Su}Db}Y-k`w?KB#cg43vm zwinq21f1U|&PbaUF;yFFx{gmGgEcyA76nS2yp!DmCQv{)RmK{C)~<4@gS~Wa=(6b$ zC#u81AqKd3quFbal~=o&*UExSPFj6-TD@*kL^?e(woy_kN?*Ez5?Ajb<;JtrXHo|| zC#xVY_f1x)|Ih=kqz7Mnb*(A`kQ<(y9Mk2?SJqxD7x<3=w@*!?l=%<5l;|n~OoGMx zyaxxDEX)zzDOySFmRW@khmbZ5#ybY-Ra1hHxYLa!7l#Pk>X@%@spzLdfaMTWN#+QF z*f;(No-LC|&O(Ca2*#aD6ssT7^I!kM0`b+QS9~80lDScwGN8i0S-$wi&(nhsJwh#g z^Syc_L!18<;TZC{&wQR<`qG!tJukW2W@@=y5QrWEZP=*^0ao)&mVUY*q&Fpb*I*kTL}lVO#T2#hl) zD{Jh_#)&V5*s1l*wH&x75VEqN*z_(SdfEbOOFFN?(pD7$aB;+{vlT?$4Pd*KD)><7 zmhM*{Y9>Xvi$EedT1QUjaeIpzG$jGvPb4%O2u-T+H*ux$&@_;tZL)TAj3%}(jcvx=+cGly$HbvRe?XZb8`4F zVVHz3OQ+-S8XJ#sHEp&`nTvbhYj~~Jcn`s5N<2V*HUfC!{A8S1DL z!?XaZ7z&kgaLB3GYg8(f!C>vr;&KD!@q&cDm>s#xA_%`dD;nw_DiEo*k6B zS=P4mYGZO&O!NKMg_Dgv#`8kH2qV8qKLg(tNOdNxxz$>Y3h0ZS9|m;^u&k%gyKink>Q5<&Zx9mUElZa*UjX%>W8lP5Cy9V1E3N4 z=BjJuoWBTEt7jmrpBQBMTe_4c2)Ks;KWCV1&o2_J1R{q=S-LRVYBw7O;Z+;YZzjMJ z5d?yOKvR!XRX2B3(6A0BA_(|}K;q;{(hmQ2p*SYN(zBPTlM(XQ1#ou!z~JP0`tm0~ zLLYzPqXrU8DD}t>{-{B8#l%nS0aMIE+U}y2be<-DWUNCl87K62nYg;2&l=5BLXbm z-#xsaBu(F}50Y1XL=4 zL~AlPXd!Jnoxbof9_PL4Z>z;*S1ltzTcJ=iF0I#hci$wR&(qk3rr+BQ8?+Lfm(S{F ztGbEn=lFfr)^tk6n0Tvc^uJgt<9a!g;UWS$=4IJ*isGvHt1qG>M+5D-ij0lPuxd4b z2gBw_dvlZtsKz8zc1wsGL-gJ9)AuA^&Rs@5ixT`redoE2V`5(yas zyihb+uuP({6R9ETY6nDo(Rm&OsX+`fEE+BR@T57D&BAFqfje>JXrSSCRPg*)&dqZN zh)>IeM;#E|nY9S#5eL~-I?bL)fTGyYZ zCZ54PT>}|mXB~~9Y1NyjhZsxmW8)`_=tv-}Y*c9of=gfIyqp0X3pyY{u72qW3G3+)bSlrjPdA>4Y7af|O1k@+ zUJ}_|002M$Nkly$)L4iQ1XYXk;Qe{5+H#pnKvwEKRB`igsm1xpK) z6M;q`&cPhct}hT@{qTF=Px-rEO@nx1f%s~=Lgjm3M@*FU{PWM!L)Y%4I!FNhlpKOw zeHCTD{T)9@cfR^fG(a?SHE|a~d5ZU7W24oKPYmBh1c6;bpo!@9m7I(>cB##SSl1M@ z6p92Afm-S^A^fdvIjP~@8k;z4p4Qv05Mc2<>9krWCcp}sT*|Ypfp<=Nybl>EnO?K^ zp<+>k&j-k)hzKLV1Ue#ufFNK2fq>mBT33giBOKH*9#YSa=pX-=r%4B429J+a1Oag@ z@rOj<8-x)puoKm8&w9u+F6D}kW;|UW)gIljPI>>!#L09m@Fp- z8yxn9V!>m)1!IUOX>gZ{3+9$}tkie_KI-{nD6lD9waN2v())G14b4 zrCZTS3f(>e><`Qzg9r=#qNz=Yt&(^~Hm1n3SX+KJ#BhJl+u&u0YP9I0U^MeMnk?w9sz@(Nyx8UYv&G+oFF|AnXsgkB&L?$3mauq%skSo z_odq@ffqsSjnJ7C#x9Gn9gV_zEiXDXrdBGlFzRT6g?V1;jT#jSWentpRLm&Ezo!?n z=C7CE;X)vZegMK`v}upnDT93CUkDdU-e}ABQQKfFcb-4z(P~Z>dicK1=PO`dcb=!D z^b&#bJB$shCyRp1N=zk24q)sER=jkLF1`8z>KxxB4GYg2#$M5-c3g&t9FHUd*!U`x zuTY^_Fvb^+vlHsHL(;o>ybkgpk?11O1UXeMpP_EMMO8#-SFpIP;@#b9v=EuydH5j} zk&)Eqc5rLdTU0C;sEaZE*|Sd?Q>!+}f}1sr1F_M(Em=zlvMt4Imdj(YB#20V=SS|P zfAGZ;i~#(bWAiN8J+lUz75C!utyO3|Uh|?-TguZ5EZIQCrtyzK)Max$$0=eC)I(7| zw7m~SIK|AHbj~U~pNhNMCJq9eUle7CJ{xoOp5ljv+cMvp%kp>ox=}eg$VSu1deGBo zcyxpQpa1eW^-pfn5QclI>U=D>tQJm=zwh0zvz?6Bf;#Os42^TP(@FyO5nzIl+FYOr z_e+r+1p)sN@Ph;^hL?OC#Q$LyA-oE6>+P=YeJsM<>aI3v(lk{Fuy(hL_*V18$&;j2 zUszgROm9-<)@SJC&PSGBBPXJb025!eu78vM?Em{WAg_APs4Np%StY(2qr(JQKlQ=? zmVWbp{t$ikv!A4g9)3I3IVzP8Qbqu}&wS<+MoEwUQkjR1%D@%Ir8pQ`1 zDd_icwMKFLrJ+AMPU|Dz1pz-1=<w@gYEVOqx>nU1C2?2TD*lA7hlT#vDri_B1UuxI*80qnSl^Av_29eU@ zRp8AN2>}8s$d35KlFR2Q5l_L783C158Aolu`MiIQ4G~D&OvXf56_7DC&es_-=@`hd z7O!Xj({gzqzKavmpx!|IYRqt5cZ_}BhwMnPV^YF;-5JJ~ehT|}uuUn;_%DA?;J7>D z{r&5Xp4-i(iTBSwo-?Pl>UI^8(glGXL}0bG*bV|BRgNwK{L&v{lTXAw1b88Ug_&!! z**rC1V7gbS&{@^n7dkWSRw_L4SiMl;UQPYWsjXo$g-vlKlb|97$5o#P$5v{}3;W9^ zkXF(=y{4E}46+Foi_p#HszvAl<&$x$!a07|C69g-1K~w8qzgM~7+ETDxJbfaQq?ts zr8|PR{Z4jMekZ51VEs0IjPqiM8}Dn*WA_$T9CawSAV=X$xRO7(LT`NZN9ZeG{5+jL z|84LM96M4=5(xr9L!feS7iF>|!%}{Zl@BgsY=U=G*SaBN(CQ@mSU|uTGl_+a-MwU> zwyBAzu*Fi0Iv|XSf$&U6RM)f9Bbx;U=l$8Nol?Gl2rD2!?w?1h&@dOQRUh=ouv;#jqcHP`sIK12~tmQ8^3$!8znY7ja(jD1f1XRu6NlWV(4Uyyc57! zZ7gd5TD!_>nVVhbnJzZ_g>^lg-@_}BvZ?RNyd0ghS}$wY8H9EQ37&Oi9jT2(BbqPP z%Z`ld(dlSZ$mgh!v5tECIwe3LuD2Qpl%`R$jdf60+hqlIOJI8FfmhPq*9vwjc5!X9 z)f57(3pBR(h4*sKP9+-I_F6zn_8I}NNw5;B@Hraunm`-TP1%^UiG5slt`!jk!iK<$ zt>jvjnE)%FcQ#I0o4H&d2%IA@c=}^&u}GYJ4FNRnrDpz~wb#l8(LunB`08zs`~ZF5 z_diDQgO?f=U39frUH^V=pFZ@fzfQmXzy4GD>}MYLg#@dVQb2z7xS`mu{`zlH`rz)B zN)F&)G)V6g@du*lElOxrVluc`Z{&!yG6Oj&2!srQ9us_n1S^YsMMMw~1Ox#y1k_}O zayAICZXDsAX_C>6<2K!Ur#%8J-urDLFjl>Vckp>2W0R}{bLdJbPS2S*qb?}O%h;Za zFNMt2!mQ=zE;;|n`x{}9u;@99<(9A=H@_=wyQMlz0XeP??~sWI0)jwP5wN?ev0WTG zojQVTmPti`rrOOHs0F*pF7{-dQ(&Y`)UAV#?M!Uj$;1=e=ESyb+n(6AZF6E{Vq2%b z|KR4__r=@&c2(`#Ywc%MEX!dDm1=FM%1Qk<{{RPFMX3DnR_BF(Y#5XXG_-0e8Nxw~ zk)sIyiFsw5|Cf;~K}HSHyU`Yi1YO^>9sdAr6M-doyhQj^$I!lEmH5dn)K^JVJZ{{O zEN8YS-nGe4;p)qfHI2IAH`Lk{x&T$Lj>6x#ta>#M+F=$|%=bIbtpxeJ{`#Fq^IJkc z?bn}~bLilM)?_$x!1z2BL>^JgJIWdXn9J%zYNUBw=nH~vEk@Cyt_YAom#S@+h1zDO6UkMN#edg$ z`LRIY!zV!MR}cuo$VRa!DpIXorHI493uDh7jX=6yvGZKG#@ELqV*O}>;)xZFKjO5KM59bjrvU=_17HwdyfsVH>|GhdZ%=vW!!^nDW(aYHpAk4Ux zEab%T9?m-#MsyKgjXyZ6>N7oyD8Y933jc`wTH)~dBi?GM92|`9Yx)F82>wIT*BaPw zh^7JoUV}AT|2r4ld~c0ECTUBo*|A&y+A2#mr^Xe#C(iKDKv$zdlR?@ZyHr0{VP=YS zuEGt)LJrs@PFN{R+_qQ%F;2-*%WATrkC$z}e&7D=@JONmHdVr*(B0!s9(zJA3lwRg zJmlQ40-;{R0=#%QMROl)fAN#oyB?H~B|c@#Z_#a7>U~t%4F0QzSg3@AuKgcE0Q66= zR-W@wB;AN?v?o)BtZtuZB=XT@+5?mR6+;aeDdmO+R#n%c=ln1e6kH9#!jZ5` z{D-nC>23w(g`I~-Kv#rR>;9&ss^nYs-Rpw{MueZQJ!W1lMF zQb`P^izN` z4q#0i3!Bf3Nrb>(*c$p!ah)8j+>E5Rz8X352owog~ZeJmN~%i|%LV|m)mq5&=6 z8@@j3`MsQ)Ov}vB6G59%rszbuZQ$K*YcAYfbywW((re~!W zhP>L>u^f=Br$aJn_(RovlOIcNSQ87(wKqYmMp$*pJg{JD|H)F765}rU!0zu`%y(Y5 zTNE$=VHVs^En)a)`!oN^!)a8Jt!83zs&V^rJ!$Jv!tXUTYq)U@7T%=QfX{f|so|tB zP)Ka}J0`{;UW7ok1)|#Bt5foJc zafJo$c&GEk6)NPQ!>n$CIlre>%g&zHph4E9JKhwaD4(=;Dz!W<9_JfvQAy(FAnj!FZ{q>x z?l@+Pd=+tR^`VM9gT)<7zN;~(G(f2Gl!p7kbnR*oV)M=DzCh~EQY$iIDD~*`&Z_Xp zdBY+1nzgdCZdu*){uLx0mx#PAJ5w5g;`Iab8w;11(H#Fk9ym+Ya^gs*(O^Dt?fh6@-+bt!jz~TdiFt*5uAdwFH{eMQeoPCW9z|Ww9l@{`5 zp!uCMc8wVJ-2j(cIC#M6xjwL+i1x)M*CTe~rhkVo4rU4$pgN?U_YOoNnF+l7HD7mE zvM`Lz{g!-t|CUYoTKoR$T~P1&pnTYm5|BgdmLbK9EfL<87K4bl^FEdKJEnNv`Fj2i z-+nX_z~VlohS#_tId1uYny0`#b>|31re$eL>`O&q65?SimytXe761-SNJFa_nv(-f zG+=(eT1YP^^qh1RD5@>pI<1~>M~ULS;mm~jTvYTt%KDJcy?yX3jbmG`tJ-U-^qwqA|_2x zqGF$sNdJtAHtD@jFTr;DQ5@+trdR70I#`On_9V65YBVD;N+^~q`KOE<&X+>)5BR03&Hc?8fobx* zAk}J>e>!FrtJxa;u#5cbrhhGWcUT+MsP%otmsliRm_Ng^QCATmqk#SZ6#*y|loEoP zs$E1n_+4NuU*8u9HNZjHWNXa?K~h9S3I}8SRIRW1b2AFQP;I;Y`3ii^?s9fSq zkwiWv;HEaJ25B9oZ2?}3eGVpA=OA&0%&ZF zE@Nud3g??CClwyg!1d=IX;L~WOy_7?3662TKX4u%>ftuRnEC}UU=AeyXqR#Xt^Xn@ zk;X6jZzXUCZp>uj2(yPX&V|<--OL9#I^kX!eN}Jx%??;y-Pg1N(31^O5&=Dppq{ol zNeXxxGw0NTuR45aIM*QxNaW+fTkn-Je)%=(dgbw@XNLGQgqhN)OZ=B}=>gGHhR(Ms zCT&trDb92OEj6_}PnV3Fs=a912>NP+(H(5&+Sw_C{q-r&+gy+ygVq}}ICMYc$y6EP zm@pLun}vbD;eM}?kDZJv^Q>l=mb)W^tISnwtm(QQ%`9nq5@h%K?unT zGXb>v>D6#H)e2ZY;)HINt@4zSg4Oxr8~($K00-LIcAo7f*cyNXL+Ts-EtADaa$~+P z)qao8MD9Unc^@@dKMs8s>hVwCPEhTiohcp_17Q$ zn-lA|-J-Z0NhZfJh8veRK=>23&slSc7*|)sl1T9|aV-=H3>S5d-+_tRBo_qBmL} zLf7e#j;3SmGKb=!D66+u-eTS+?L+EMIQx|z2wJO19jGrqfCW7>aUYr1EAK^1lcx;# zrc8_46iSkAefMC&&9&%4<*=719x}RXtpRfmo8NW+bJ`>|f5rF`Dv*jyy!Q+0axNo5 zPt!}nS9R2L)1J+LTDL(5MrSgM3&#=mxO=>*WNR`+vaaHh2ayKdHf*a>ms$}A<;IRZ zRqRrfQpfEXduKJtgSps>a9c$R@Gf_{dBd?l&hU6 zu=1$O2zr4nB6%(EO|orNdm?*0im-DNAFt)u8=IA`^%8qL29;YEF}F^?(ZheAeH2r- zu~p_dzq&7w?rdzUYh!5IL<4*f&p`zwmLLf3uKWq0{`@1bq!PA|pUmD_rOc)8(xGCt zQjSDPXT@cYr5{E#cJXN9Slhut)_sUF7GxZtp9v}Vz~#OZH@7FwFE;~hk6QA1#&@wK z7XGIw;s;R26|!3E>^}T_*rkUuUf?1RK7q!^*53GyT=y8-i~+$BeY^56869a72V=i? zcyQ;>tY>6EI|*ncTE~seM6DX+isv=2(|e>uwXr`_ncygroEe#h;n}p^an#;#x{7a- zp|T-SP0pTsUX>gDP*DZ9+fFD!JyHBYLBEWb30iBgzXFd7P^Wd8kn=iCqzLp?R#9Ye zAaVCIvxy|!vOV6w=d42nwf(LDhUUonn%oC~YuH^jX|t`42SKhZ7j15+1Ew5ewOXz^ zU;g3~c#9|b2lkl)^!z-W(lLlLk-m~+^WLW-e>zfIK{MShTkU+HepdRucBWN)zX`m^ zc6|OKge+GcMDiIn>8jIj(w<#l{QmnLuJ?UL*zO5D;21kaG_Jq<;&wr(V<0brcYo1v zSu-M$CS3R2VKLldh`*-vzT-X&?7VCw12>g~z)T|bV2#FyRRw+U{4i5D$<}(gOMi6m z_ZgBvK^zq9bz%RM5zjTsoU0`S&rOW1uBw&S@V^qH{n^KnTw~!3V?hPym*1gMY}t<&b##-l%7kJHr0or4LYVPWFVzCbS`Dk~tdizpr&Xbnxl zUP_$jK;{A&mo}p+9Ucz&6p{XGsfUQxTQ%u^(N@agl~Slxo!Fxw_oX|BVCgc`T`=~D z0S$CcM+4jUtjB(V%>`w-X&v^-8t4>oQy4WIU|83;&q_k2-nRE*8`wiOHrYJDYH28- zFS@T9g5nb_rOuySp(`FcY{qgix>jDH*bEEcqsVKD^5X3jbj#o_kEqTCkSsu<&8XOdp}_Klpj8g7|Ff$7 zQ2j~^l4DUb61!A2Q}wJRHTD+%LkbR$cq64v%!~Z7GnpS3z7Zyl=QeKz19Y<_@zn-= zd(X7^@ZHcPCRQjfqnXA%EugYogX5o*z_Sp|?p){|(Hj9=-q0u%S~yvlARJT}*YAf! zyxm0QGh_wPz+xps3nIY~M?G(T>(I?PEneo~+&ob;$dn zRyNgi1$?hNfAk)8^Y^8TE=ifVyT$Fg->S2Q)USO4C_-S#yYI(6dd?~Ne|_Kh5SG|^ z-y)qJF?#3r+#Lxx1bF^!ye{dK=RLj3m$(13oqiI7%yGKl5IG0{DBB5m3+}W(XL{v) zzvBvgIz8OVf1|SJe%>54+xTP*2$@x>TIiH5WP56Y&xi37?9V~sC5BwL!|lh}oKn5Q zf;j;~SJElmN1A*b9&)jC_<=)feS~0KhnS&CxrT(f{uc>pzM}u?go*mr(TEsEOe2yx zV!Mi_D=Iti2k$Dl6rTo3`n0Qb67`RmN_RiS!L=10wZ-d#xMSn%L@+yQ5k*`q~{4zo5iE8~0?c70Mp=NbM$ZT)UB7n77(w&E7 z#!@`*oxkzx6HjfxtGi}&D_LKziLhg!z%DSpT&E=89-tFYu#3BKn-T+?!6mrCX4Vpb zW+UbDE2#GEEhI~+93FQ&5R85yO$2eaJ{-751~9x83SKvt0Ut@w{y)eT zmnkYKDKy&|0&#DohB`aE*c!HFJm`UC^Ncb|zy@-+8jJrqpiOV*##BF-fg(KZ^_mG{zQZHtoN4Yv(c|~zRX8T#(*bBk8tr4pX*)0fCK$d zHtThJnLn93fn{cg)xiYQ?akrThi{8|U5^3LX!(3?thSn@4%fy7BlvyU#^}fvU+gOo>M8f0df=6Kk)`v>RV9#(t%V_kZV7l;8XHV%+zI+3C*5l|Zq& z-Ya4^=x^Gu4KjJYNA&K8{jk&5lf2TAsNOE>7qx5oyE@fDLX0?u$GJ=Xu{y}20CZYT zj$5p+*De{A9w1>789N%UBE@yFo)UnEN^S_K5M_Rr$G#I><9_8is$Pa#BgjJ%^d)yC zcM`PwJMz%|iUg784KgApnI2OC4Pp)6WA1UK;Uiww=@YxoTh%%I_W|rFik66MZhRmg zj47n_ih3o50#^e{2_$ziFCL6f1OjMw{?9vOLtN))lB9|2q@eGp&`q!hA-ZYbd`zxMYB7=6^^SNhg^5yq%XRPnL32=VX~ z?IMyT2fNwEhsH6>QS#O|dAR^J>Xe+?i!iG2gGnG(KkULbj2Yr!f@DKYiMnYr2EWKr zFy+;(&CZS$E0-;p{&fPxc;^iYzpG%<%%YVW3gF@4`o@c_n^R;TlSwH`U>K)5x*|R% zhJssSL(*N}>Ab~Im5~*q{kd6S@F`TSWF1E!9^5M5*nQQDeO`r_nGBPZ&3RcNZwd|r|8m^EbMJ6PO0mge3 z&Vi_38Zq$quEQE^Tl%0)N|cX^3aeJYA+M!5QduF?zna+6o#&IJKq6^@%6u}Rye$MeB+_PkWLkQ+1-*8lflTv!Iu>qq-I0^$g~Xh9;Xmz zbMP0O#`sqhvN9pEh&~d=M;dWHk3w#Yc)#7@0q5rLq00g{ca_qemkT(qs(gvTfXvs} z7&8^J9{}r(64%ls8PmilqIgiiF`34+SkQ!hC@hV~#l|qXuqOsqL!xaeiaQ%!JlX)b zeQ*#QaIc$W&*R_9`TIqdsKkArjB~P6GP4&(QcRj~ATAh$5b5Om4gAGs{hrjz-=?4p z%JQC_WE4Ik84j6h@PNmx_o?4UjJ)#bIGPO4zy7ty*NsJS6Pmu~&RoJpp;)AiAVu$! zPB?0llk+wO@~^@>eDzbjl^`}`Lkm}|A&pBP)B%uB8LfGQ67G zmi%20M+UPQOb=w@$TI zDNIF8l*d)TLTG%g*O0M1-}#v;8kKIV zn@sK!k^bL zcWx{O$giJCm@(V)G&s#cgTN>74{=v4GjpbAoDLP*!*MvDk ztw!)|SklR-#lAD1IK0kLECkV^7U8bCDEK^-QuzLaN~$M^VQe)sOd=5BJ`nC;y}5=7 zCRdopNP`MZUSXO%kw;+tE?8zZ?Izl8q}VLBe2o_sl}?~fDqRHS-}Cy_zAz|dUkydS zQa@j9`lirK%nl4nqp3`ZT!snqn%Tc&SyVs0$#l@i85jVjc66s# z`vaWq&OtW^WTh$l*#m4#=-`bB-ZC)WpyI{EHxq_@h0q08`*C0Br>1#TPt+OdxMy75 z&?_)fQhT%s{-Td5rjcONSpxS+hiz4`BA;!c%@367mwtLIweIt@t{k3lu$i;ozj#^o z$aAV)HivHPe9j7OlgkHwp;wU)V%g;!%Ao_?@q0pipfJvF6(8c;0tMHRcg^;@*ja<& zg#(LE;Lanof1#^L)C&7kC_cdki2q`04o0RFZ2==*N~5CwMdbIUyQ(KbiB8Y=M)Qb! zU0jcNqMfir+&85D`CdCm`0;f;-|bb~`S!U)>6^*_urFOs-jf+rW;7dlbRh5uV|fg@ zWc&sF@j176brkY#yY3=e#s9<3J0aW6$D3H^sYi}IXJj3MdL`s7tw>`ABv^y!{r7LW z4`6G72BmHU4R4NPnEH(Kud>Q9sl|U~lqd4PU3<3FBq+Oqk%jz~anc44{om*x_{zaS zDXEKPnlnkUKCzvTF!-rXUgEK;)EX)bDdx~#OP3OJ&0bYSP;sao=3QwC5Vs4;+wq!Z z-CIPFbKt<^=;4DSM>C1cQQs+Zv%t#0p|&kyrytS5avir$KT_3jM|-Sr9! ztCDP)8JgLvfrTRQBSBaRYz0qL~S-!BhhT@+Rp}$S2=QT z*Go~58Fkux0(r}3?Nv1wXq4SHT%YWuIIv(@{~@2Iu_eRdi4+*r1$~*dKaHNWTmv14 zp(K@mFal92Xpqv3cs<*?M9GGO<^<6M27;@a2JT1pMqL264D8CCYvsZffLLRI!g^+K zK+;dKU&BM-D6kfpL6hU?@>P-8Y@@Bs#|UF!O#0pJ{D;4V1^0{eB`fJ%r8QJ>5!8qK`69d*ymM|^_AK8Gedo47JVfw2m?rK1A3>N10EX*O5rZIc~wVVf+fUiWD zTW%3CW{HR1u0hTGK>03-199I0{`bLtTT{Gq5V1lT+v!t|c3MIQQN(!;U)M*sw7yDW zz))BeulTKDr!;jXPA7Q~4APqG$Q9d^mj>vb6v#9B#8xa%xq`?6VtrIjGY~b zZf^$Q-}z+>^E!14pLh0}o}>{gGEu?k7*R`9{`?q0oEC4SF}U2O!etBC34-y0#|mQd zumQ86%sNVS-8t5vDKDi@F*NZ~ESJ7%a;z(6M3+|ao)!Nm;PvhF@a_G4ZeN7hTGLeF zes8JmB0t^SG|Ri3tfaK22pBRq6Q@;+B!?~&_1AU2f8|M`fke#yr;l1#HZ7_I%xQ=M zd2htJBahdIAe=>{$3LvbKxQ`V<_SjMt^Da~D@RgUjQ4R~lJ4{_$=0^*s}w^EkM^|` z?MUXg!m;ABkNlK#95mQUY#sO4LZ1-}O|?C2yhbrRB9Y4$nOX44cB7FCp-}MG3s$T4 zmX#z|(%P4Faaqs|qmq_lX~W_lr+Qha{f~lwejj;C#1Sc0GLe zoUYf+N?@h{&gFf+*(P=N<~V5jn%L3Vts8&YcKKUD!3Kuw?m_U(qQMo^wz9%9{2X)J zyAb7|!L?(Jkk56SGni&qcy)ox<-a@j0JEviaGG79APsVzhcXBwmikD)L}t200!;3) zQnlJvEhYzZS_l+~nSs}#P-JiT@)9>fXnuh162NB#8`alMFiBpF0Fy9THj@1{$JC%jX)TDqDbFM;%REF_HFr`-^pm zY9OU9uh4JaL0Hxw&x{n3hKsANyx>_7d`$?zPEw7tWCsw2jP43nW2jkZItAS<1tCLs zn=Q}aJ+~_bJ5>X@bAR_tcLgW4WUaOb;FOWoXZkD8{|ps?%29hCf{LJ1@?j9g@E(+y z%%%ru6NuhfBHm_^I1@s~-Wz&O5=R^%SEW<<=??X~9y2ckRZjy+uqCs+A)+A?1$uk* z=teI$Nq<_h{QMDC4xPI|k+HkffC`d9%dxA4SWI}HY0COycUDI&($gu5k2W)G-U+u@ z_Rpor%m5+7m+O<+XQI#fx=6cL>4#7vlsKa#Yd(B+TYDeN<2v%)d9jwpOib?Juxu{! z+aT%S{vKBH078R65ui?2TNTx5Bqfm*;slXVt9YR~2O}f+4uOrP=K5OR(E6nR_6=*X zU0;E&gmVBCHwDHzFcVY zCx5w~XN0$$ov-RirpY1oG)|?jqr*#1U4$%hY`5Uml1vRBmhBIu!>)TuWj!VKvzYo? zPKs492Hw#1p#j4TuD-dEe9oD8#}C{*pr@A*AOm;cMcj7>o)U}#PzvZXpUYS5JxA3+ z=)>gs_*s3b z)4Tj9XmH)+Yegu8px1+iw7;Y4>>JLGos53|ZZmK|5DA}mNED1_k)HHs+s(N;-bicj$g!>uG9psIAosI3Q$oop{XU_wWYw+z& zDZ6((f4c%jJFz>HxJEv@&Pr_5t;6K2tE zAsd;(Tk8TG!$Ds`5Z!ryXeA%*+hN?dvur2u)I}XlR+z#!`A)21!i27NTXt&nqp2Bi9Mg>Dl z3P)Q+kb1lia}vd9W%(^2izly4qmN5zkaulhwRye@*unu#?KNZUT6ZWV)N3SSF70E% znnq=laQy){>C|0@xd*#GzVZ$YVIt9XoKZ#9YRg9-E2J9k>G%lG3W=EVm%(8d!a9ln z7AKbOZ@3>AY6J?$+@qZj1f_@}K4K_ti;0m@&V6@0*ZLgq zzcAVIntOVT=Tc;EWZRk7G5P(%fWD_*{p(v*GMtU0?(U@5{C&3!%}|wJch%|de<3svQ;nwL;Qd>e{kpXs8$V|Ltf{%Bm?k#{GYehX13MdY2}Z z_#d=JXM~L)~C~>}{z3ecIc&q^ZrKdo0{Dga^?i$)GzeG!-aPpwUaz zua|`+tWsTaTv|L2^;Cuv#oGcJuHBMsy+wZtK+8Ds;1hHQNge&Dj|$@dx_AJUwdPW}EUap*SB?#< zz*=5j^^yw~?GQ>ylm$n|00zxy0w;885)n5*5x}`Ax>lPfuTbW$xHVE40E?v5sR zd_+qC7hyV;7`s-Lil9A>h=?BP?_MWDea)4+B?sm=Hb{PTM%62Q#HMA^Xgzf|PRO^w zSx-hrpkzyJyUNDask#>{pBFis`@Q@@Cw$l{#OVSX zIZsDqED>F9%yA6SVFNOB9)U|P_l5B&;+D(qa0|Wc zROLjpl!Gc*NiR@P)87Qq1>K!kiIc19zL?!uQU}!VCnsA_LrJB;fAD{H(@2z6G4<@< zT$rkrYC^daVyQ&bHCsK>JjZ91vqhC^Bh1Bv z?kvnF$zw5VO}e0eKnxc+C`CWZ9{jMEdu8yrmaf@=DkoM=%)I`SfsCuKs}y*&{C~bZ zB0R9TPzXm7&+nKzPW>7kN*0*Xn4xtuKz7)UlAia$!$#4LZ^FpiGWF&JYXZQI=nvA& zzb}2Cps!(p@5@QAs3CRDoE&qsFukvVlPwnZ%dj*PxVPa`UZR7C&cjVlzqzuX__;9k zBWzx2Q}ifKb@Fo~6c#fehZ>kicxZl1e@6GhN#3IbkpLp%Kx|AefM1Q>3ZK0Hqr(z#@p&E;V86uNB>FyOL+o|vXt93!~ z$s_P=#LHbzNua8&m2K4!T?)f(Ya&3_p_{q*>44*@Fwv>zej&+?%~ieY+|+F{dpq&b z>(@&Y`dBc+=PT}x(`C|>E$%f`^ztRGwih|M#=Q=Wq(17cpkOXHlEL8}3m8n#cWPtm z&Mk>T?N(-jzF}{yjosaiDo@8F8@@nC*x*J(4@KjS&!%yQNHDIQa^eyMC^S)UE)ND7R9kE!yiDWvS8tgg#6`Mk{>$9>D5Idmr!g}F6GH-}WS zEGaPS=}1h7Tdvv>zBD5lIoOD~s!CjvBFJO^Bf!?fqPf_S#E+UHu4>wDOZ&X?WE zu`<ZfY-y^l1nAW3 z=Xu=VN2<4&sKLsSd(nWJ+W9+ZT)3m=e=-879iX5=*uAvN$*qJ)P{pA@P^VAk5ll`w zAe1Pb!LV@uA0Ht}w^HG${ug(KJ;;i~&KfsZRoh&$Gem$5Q6H{1FZNXEjVV>Hun4LM zk*I8u+jfYu7m5v0m`iwu;)c0_Qg7$$VJ=a4bq)c9q&c^BALNC8Tsn<~kp400m;;C2 zetzILi#z$n3C~G^7B8$bDekp>Bg!VvoGsb$_ki%$OWYy;ozJyzr0>U|TQ@jW8`=>O z8pPVQHR_fvmbS6i@8*WaW-5pcOt8WJDG+C1$mX_&ywZSIN$F@@Ss1u|IzakAi);b$ zjk$X>5;_O@XphC_4-Wc>);#D#LSK9`SgWy=!2y<*f4lQ(rw^y{p|V2z5Q6>@wR-Qz zY5(*;CwID|AJ4ycIZvOEe9|dIv(J1y*t7HPwjds$J8vQuqJDlFtY65Ollu(K{2_+W zjOfed^QvR7W=Gom%897G!+wsQpLJ5#Wl$TBHbQVCzj9Q83C? z=7u;O+V`kFbm=h1`#{esBWlr2n@S~bS+6uW5DYt;t_L;={>R%ukc%$Q9=dFql8y$f zHy5Es{1Z|d}y-8Gd%JDDJq>QercNQ?gOEUR65m~wR5sVef8xNtG9W6dr2id zF3)2h9+0MACh|wCdas>v9(uOUrTsdWRC7ZuqM_(00;JdR7?LVCV8MfQu%Z-g&caS?hjil@>c4Pp9{#Pu&?Cdz(Gj!Yug9<89U1ENq9!-C4E zHJF@S-jVGj+J5OXY4$9Z$)a3{S-I6z#>~uk?Cd+c+|r zUg!SSLl~fKB)rrukr_uPd)Vy~zwTBoy|dongTNWC9mrV+09WGcO+y=yd+WXxdD01q zNK$zq*f3B{Y4O&aX0c?Iq&O5{3<^`{F3(~Sk$QrOE{F36{&4iC73-R#&u)CtD3biY ze;i|q6ZU7Vqg+)W*U1SuqdS$3Gn18X_X|W?E(3{rE6Cx!^(F`?^Xka|vmmt?{YVM);y8G_cwYCBUU?Ko>f;biw$wa3kyQiaz zHne@#l1tXb_?zU<5>vK+l|Pays4BVl!TTp@61Aj^Chr5_Y)X>dYgsY_wN zay0Of89n4F`@-8cNq%xX1R5m6xn|OH7Q14G!-%LXIS|X>R&M^lK@l${Ph-?|ER0(j*Osgusc@3qFQS9XU0wZSO)VN(ZzP3)MU^0OI`M8VYff8f zzRqyw!0Obo?7t}WQhNB*FIk5?# zMHJA+SimB2A3V)=tHVbUXc3A`gJ5y^y?=U3YFYZPsZaXoFp8)S9D4J5HV3Z&D-^*3 z;bIhc!4N{3y8vB7>cwEw`g0Q_{+%GV{pu93FR?rQpC6C2=Oygn4vYU9()VfYbw&nf)Rj zf3C>9=FOaox?auWo83@#rHYaZy$Cs(KHpe%fa#faR=y6QU3FfFK|RX*1o;H2WlW!W zevf%|>LoSP|2%RWLwIu!m~)Lh)Ue{yYNBgkVxL*_7wnCz@W(c5IEt@1lif_JLpvDl%lIbJRiKMTE} zSZT{4T6^8krDysB!T{PiB{Z+VrR0?^nz#i|d#q#}k}ZKX-Ps}S^uDPLu(->|49 zSEf#r;%YVq83>)u66so8K>NQefEdS&8Nq)`LYc+CBdVgXJRpjAa%?H<)}2sESDJ&d zG9Zj5h#`BNC=q=%Ubjis)OKZBu!$LGdxal7=F$rpBm$|@N<9ljWY`wY;aJ=C<6qk| z1)O{j?Au(=vk}k2UQ)M&jEKkizA$zj^^du#hTg{I?bwPPkNhbP@;9(*B%~N%z%{F>pTqh?%~l8%aXp`bCvYPil^ArH$l#IeP5BPM;IBt5{21 zK<08M`MLukV1sE{A#vU&dJkhT#oPgWRey<=>nm@D)N1^ZV*L2fA4~`^1pWp@ zBzfpAD)XwOk3L729zve%%hyQka#$QI68WvQ~&~!ZqkECo=+D@{EK)a(D zIbi;$w+s}SroQWj*Q0|G8Yy{e5dBOv=f6-hQu&p*%?il1PCng0>Zng$|JTJXy(7YJ zisU-a^-}gZ*L`fz)g8HNsYtBnpnIC`e=e%Kwd%(_tNZG^d6~pouIwvsV3{g2abi_R z3Ekm4bAk&QhgOmkJVBvC_HB}RXV_AW_V)SL)@Tf*l=qM`q*_dcdVu;3I8MNjbm|JZ z^079DGsDwSoUi!lrM#Xoz_v|0Yk@-K$Ul?gWJ@T{U*!s;cK z_L&uVsi9zWyX!Vnndgbc+o}9F*ys2p(*{(S&Q+_PvEc-iC?=GX5#9^erd6`NT%YX^6NE()l!<_h{lv5H-wZ!T@O^x1+^zy; zNDj{+*u|2wpUi}8?9Pp7^L@H;Fp*dQ2Xt%#*O5DEU#P5?lBC)^qRns?+gBf?KZ z&*Q5LvL>>L^CP?@k?qc8@y;y@igOfTa~rf7`Ub{(l&BwP_cpWVi9$6>n?GN~=9Y|I zh$sa*JNC|4ZmGIj!+s14INeRO+Xdw67C^)^LAJAk00o-8g*do6^lh)*swKcamG|hY0Z?I>C z?4|7?i{wpPR--=Wc)vbaEv*=@;Tjk5>X7qx1Tq%h^KLqA2}pvHMLmusO1Csf z@Nb9;J9!Zf>r&WFz@{?J!?wwxUOm^*=Noy~RjrbvY&Pr#aDkH!pk?3>Wn%B|xkQ+{ zels2U85%Nxbt8wpcGtxy*sxqXbsI0mZRO^@^qua=mZJ3AfKGqo%x^*d445%3k252%UqkLxR3s=;o-*)jKn3+Z@UTL0aGZmP6UT_Dz{nUi_@g4g)f+O*zx^gEjIfL>+=K#j z4gZA4_I+_gu=I+>Xd;-XrlZdOxX47y;IwK_q>UMd*nn3eiz}m3WgxUlkp$|})4bGg zVP;4j5|7sL-*xEVr5sPTgMF80A+^RclEk9j$Puw5lo(qDX5N7Xdt!wpfI@@U;I1-Y z(x)G8;lnImt&eEEFQVjSyhtNhz?J0=(^k2&VeLY9!g(iw=SEoos6;*a`~H@~7BWCW z*;O?oAJOZK(`8BwKfL|dB44f-hC(J$P&$gVB@2N|NuQm!tz$2z_j6nkc?=e;^XJMP z4&iOd!KMWDbo1d^#+**De$==neljeU){`sUy749N2i(HW^F8p2i(W(_SteqT$cXlhqI=D%!$P+zVBz|ge0X7mz<v5Yq_SeZqkU zwbo>dbm(d${M^Tm+*|a!lw67VXEo@SZ-F2On!%P|4jY~X$C;a9-v46i9JnKExG)>r zww-ir+vwP~ZKGq`NyoNrqhs5)HT8b8X07=NwW{jggMId6IKQeVq3h0~y{)E^{H{3t zl@Xle{#V24#SXvfh!Af%8QI|1NqhRw@r?|OeJl~Nk>G9xq`D>{&4QBhX{A$zl!6j6 z7&{44b?|2Tr#$2;)2QDKz%Q+TR$ZCNbLl?dhQv#No!uq(^Nje-_eA&!WZfo$wV-B zFFN(u=)v^rB!p!M--JoIn*OTgc5i%xl%5c`XxR{CBPa4>yv7x;|Hq$zhKSd&cf2Va zzM)L3{c`S>`cDOUYmqk=evl@1}Gn`#jSo?&{353f%(dg8Z28&3N zaxc*!kjfP>f9*8}KZLHo{iHo=aLA)< z2fN|wwM*HWg~29V0eT)R7Vm2JnlSrO(e?LkK{W?rY*}}o_ynpIF|<-JOOnCePQjvJ z1;1*YiV8@A($%6-o)I%<~DB&-*S)Y;xm6rs&~*+vYfR_xot2 zk9vpAdn5PSiSxTmd_BJ(A@DhCH7inA*s|-(5X1*wUaXh&zKXNBAIw_=MRP9SnJGf3af4!s^_?Pja%cnF>pY7zzTK#eOyD@4EJvqrng(Qxq})2l?~O1W!L! ztG2m4Q4BiB$K^=tX-=-(;^>3BS#`rZ7CAEa*rjV4*5y*uE~-EA{A0KK6)9)r25Ew? zA_x>u+6X%;!1<5qZt1S@R6bw{2i0z$QyDK)m#YiZsTu@+CeAV_Sk{%3Iz~5)+#dcb zZIK7QofPU45yZ&9Q^2+RZ_&J`9gw8m4GV}!B_z!)kBK(vId6vo0)k<)Ac)noHxW>b zMHGy1@%!8_Og;RN0`3t$)Oa@)D^;9F+OdZTOYgi3gAG$cEnbN}!d~_{eXq5Xh6^SO zLq+%VukF^De)t?OOyP~?#U8^M-uZQek)2{48{mUYm zPxfL{ACcnFU|g0A3ur~UIIi9~GCSwn*ADMR?d?^IG2=C_eIxC43eO&JKjsv@>p{u1 zji9>s;GjjRtz~W>QdKEUe;2e(0-MA6OK5{8$b|&4L3|>^Y03>03qYAOY^CkMfmhg{G-o~SpoCQgvFDGfse)or5 zaj25`SeMfgO>MO_>X{k`E@ffnVSgx>SdLxUT^N)jGIE&Ga*WuLF^5kaxBBk&FQIPt zQCFICYZJMY7IKZ$y>^&)xt!Nmn3F0{M~Dlpp|I8X%GXnTnEwFvGAvFbvZy|)P~lcd z7&cT&n8h^-&+$otrpA|34PPFm&dK`%_ftn}IP*vAV-{S_siXUf)jjv1=+qGMyV@d- zsyr0b4w08cZH%#$6qr!1jm1Uuh7IbM0o76ee~m$DdH^$9vcMf|-HyYzQw*gF7XAwB zArgLpBK`ac|5v|9WGjU#&ml3Tb>e2Fwz;`^gMOVl8~qA5fnkFl+1a*8?Wb=U57*ZPl;p}00nYao6Nl_2DfZpc?^}8K_53`x z-o_z(aCMQd=gz(N){ob5U7`mQa|9&JwD)g!A}=y>poXPJ{G=b%0;Smi;-be^jumTg z*FFP_mIFJ9o&66MZ3zy61_Il}U9`24l4jyGCkP~wg&jQmP5-n0Tft4r3K=mqCM%v6 z4ZHCL<4@(N2*5o)nq8t)SEk3H*m~jba1cfZklfa9A2h$GhfIFGPNQ~wJtEtfM9{%P zCiB@Pv4o4$jfQAlnvDA4iZ=_zxC8}x8M~K{KMg)89&aS=)jK+w>xmq?LlK<5In1cJ}8y~R?NNnJM=0}yO0G^XKXufJDkl|Q`o ziw#errH_W$nx8zePPJ!vIvtV71s1^Zzc$43IyUKOPJdYONR|g5^2pD!&PXU@q9})` z0@9ge&`CRBKxCj?rYk`u((H7GNSeZ5Dnhmt!*%^ETQD6H6_+AK zNs7OJhD26=SX32qTI4*4@3U*Ekn)CK43V(AyTyz%7jQz@RHE_=Fss*3|Fm+us@Ta3 zSnzj5&BWxiy?n!@r|7h1NzAGzV$`O?Rjghg`Y>AO`SX6U^rNJjlTYrHs(pv0+hC!<6@b!@Ae`B7}j~ekHsj*dwhU2hLX59rD z`Lg^8sR64n$m9OCQl`#&;tgmz45{jK)zol=_7aoeW~~Rx2p~Ak81wIeJBZ&h@{qP3JHoYM*`CnMR8( zYg_{sK-EIJqWVhzfA%(P*`c9WC1r5T2By67#Fo0zVj5PkaHY&?*C2UDK{C+ zz$Fp+ARRVQLFf=24xQ+ru-=b-{SNNj1$7=cQ$GtSv<9XA{e z*rLSY0z3|+ErpXw`%+0zf8*~6jXFKhYjc-~B$+1_ZrtXSlhGH7ZT-WlIk=m-3*Qxt%||o$VK~kqm}Mc-UZwv*?3jT&rPO78)CP^8R`|vR+ck>F8#` ztdeer_+ds+FR)UDqy|AS4&BK+upp`mLNw?RKbptd)Gi!@Q`{vJy858_ zqpj`}hGr3B2n8KX7gqS zk8;Gue~XVy-%W|aiaFz^h+$mOXK~Cvc7dY`W~%fmBT93J0;b3tH#F$qUtN|CWv4L2 zq3^aS6#RG9R45vU_mb}k6ny3q7xH?Df#C<-c-yEqfXt-q!u`p79Wd7wy(5x+oQS>` zp@E9)yrtNJFZ`O!N!+iraBg*~-C@SfaR_n5^bYBdf9m2I_@aq+B672;x-e z3H#*4)^`R!;&QQ!&&|izlK}rBCte?!gv-ghVjBCdvAaK9?$dLasP9PDGm@lfMoQQL zYvA)FZ6#LMyRo9VS9?9tN(99?v$+F-9=mXsYi!scK2zjTpO4L&(l+R<{nC4j+{%7F z|3a^h(7Kq*e3YYJckjUGpam^SRqLX9B%AM(_y-ZJh~GD$X-CMzG2tT;th3|`f)}>< zr2e0o$OB!nsEaHtNaqLr{WbiNS`8N`y=(r5*b#z&;;~)y(HrH+-d@|m+hkjD{T;Llyywr3 zT`8t~0SojM&o{ST4DR>BGa5ty=o@dN`VOz`-{C7*vmM`U=k0qXjl0WOx2h;w00qU$ zPrv>A)k}|HlCbIcFN(_I=n@X&q5HeMcQCxJnoHV(VlTdyhv2mSCSov+6~(nL{R5Ej z`m%EjmpL7OK!I`6XXX%7eS1xMq$>>h%#g}LOiDPrI>KY#-dGETrvmec1vY(A^buTJ z?Do=7z*64Ssyx`?bhXgUF=GpOsz3t2G(wWTe}8#EC7RoseR(PHUP(XYhH?M$w6;`K{og3z{`bo0k>$J_48IEuCYc@Y zfxN%odC@%p!pvJihPp;{;OqHB0cdXez9*^|ypwO#Hbrf{o0h{oxy);~i+)#huv>w@ zim&APQ1X41&(4kK{rE3>zG9@%igD}9OZrg;^kqIJ7aO{cr^j>I46g8L`J*pG(f~8M z(Zf>IPXtfJM%26)W+_nUR}S9P3Y^Z3wKqiIXoV|hAveP@qzVEG_>4oLT_@OYa|)kq z^`zw#At$!tN>Jb}pJwhQ9NAq|#32B)5*&@fQs3K#ZZWxM#y1jt{-pA8Z1c-<#@X?! z<}(sBQ0Bgp6D2Oa*go@W#~)fCmzR5)Cf?rb&%u`2Lpl7=^C)*u>?;x-k0%0bz`&Yq!-l+%iw zs&IewGV?jyUM2!6>hcW!@UZ{XpeCCaIRnq zO<3}*TwnN2-eWQ*BRpL61CijtN?f;!`(9Im#{V`E0CKd?j|d4-Xvoh1)0~a8 z{if+p*(8Tb2I81={>4Mp6z17Pi{XcuR1*D$FsT#jh9eT`L1T5~v~-Uq(CUA?{I@Dx zJ(D}jq91qu2c`=3TJ|B|<9s@-BrbHAkG-y95LSvr0f8*8&Pqvz`TvFkOHfThHb?5> zoPwv0VN!K)G`MT4J9pab(3DVQfBFgyeT;#vTZGb86v^`7Nb>=vD!cCX9F%CoA+LKj z?%t1iw|fPt8dT2u?)SVN;h*cB&kLCtKrvC!&ZJAxj;b%drQC`)%j=7oXFsY`GF~P# zlJygaN8BF?zEefs5s5_$DGX<8lL$d-W^1H~5NjqJ%~rWa0OcBYzoBhCuJwW9TS)x- z-^vXzx+g%N_gF*MMX0%LR_O@7Lc^ zWMnGre@Xf~*i3j;Ic0^Q1o{bkPp*XWs%}2H_Y3I9DOQ#RJ{>V+RhYVoEZ;wKj?np0zvVSt)-TW`OD0 zu_{QgWCJ5lQ9z>xwlL(Arbi;S3YOU(*F-%>!am_yqE{riQNknx^z)6fPb*9)^%|Qf zk2?P%i}6hLh5KyDh^wU=qPa{a{ziG#qF5@us6w%FL6FIF28g}+iK30ysquwSKp6F~ z|1Ek1^>f-ox`N!b=gV?H)n$zUFa^w53%KR5F{*6I=+q4XMjn6kaBhuf+w#bPit9 zj*}jmp|~?5JOBk&#y*D1Mu(I}4LP!eho#3hU(c8toPaK`*G5Jeb6( zTik-zNTp{Ku1uRv1DR0x59{GNFLl@^QzZqY90U7N_#|rBsLraG&KNJ0Str1Za6NQP zUK$YbLOc{uuFXe?79xk#3j7>NQxrKpCR4UyhaIi&+U0E6Xha~f*`#tDPc0wJWpnxlN$Wf*B~I; zO8LYG=FktgjyzO)%m{J-;O`yY=ffl9=-(42c`cN1q+8UHn86w`$|n10nafw=|LOll z{Y2Om3%Vu2n#t8xHp8st6>%*v!&7QOQ~8{0;9l3Rfp9VAZ$ldCs?;r9Y!vH)F9EB7 z-)dK?QE2o5^K5QpsDy-HbkvSF(x!$0kUyDT!W$z5dSjgH0kjz6$4IklHa#OI8lFhA zXB|RQmKGoS80{*{fvp=M@8)hyxy*v2LDDa55Wttd4bknJoag|~pXSE6|K%+rRI*6ke-|3ms z2ysu_LJnv|RY-Q7g!UXl@{JCDgY$qnrsny`K0fq7)qRq+&_shC;Wp!--;$jEichG5 zpb*mB>C^0)U$*x`$>@^HOMd=vE0u-%h zzP+y3Yi!sbx<)@8HJp9nzVK8Dn`$#?5syDw0{iaptzNF8drt-lJ3085Bf$`ONLnn{ z+DJ7Cv%r>4NuF_aUo6`1{Y3w)Vl`l0#TsyQudAPP+AccqNgs;5G>ilE8Hy1ys2|tp zz|yyJm^%$5O^)Y+8xQeSRFWhM8OtbmRi!Phg-ZgO80wM|ByNM^=wWXe|6K#@M1&Bb z0s@4&XwvMsnExY-DpsZTo}Te*v(sU`W&&ulR>w?K*_Sk-|gN2Mh}v8tdFkkckwQrh)Q&vL4l9vn17(1!if55a6g1p z8lzmXT4Y5k;!{}0C_wWZvU85dL$?;i_sIFbwc}~v%SAzH6hc)-O4G17@m6JEhzdwQ zu%6e%m?62ck@EOKI}+`b3E2HF^@$n)DJRPiVQ%;>cYr~~z*cD%LiZh&j#RW(My|*G zEpr1~#oXN&DyOg$ZjzfDG+f~xu*6Hz1&Tp^<7pqc-Y|<*-034{hd`)$Zj{&X%T{6E zohhe`=XNjce=~~9L0Q@_(?eg?gh%2&@5TRmuR47wxN3r>(=qb#Q(m7Wik~|~q0hB~ zxqL|Ge{NF-l6k0*eW{>2x_QOzQM?qtJ#J>cGB!78U;pk^gnsSed<*6~38kWk`6V7( zf$1<;p|_?7{MDdSM%W0K)hZb*afJCfG2LlKS8R2H?xI}0kjUe(74tNi5H%rnvzX35 zbRxG}HV=7_4P_r9tOZ_-#JQ|u*2qsT!^`}nG5n(3h2!MnD&|qx{A<_?Ng|U(K}2@$ z#?1;-M^JG!_ioaz)BXrg&xsm@AXTf>%6H;cep@B!Ir+1I08#^E6ya^#1v)Z4+y{RLcvBL7;DgHRYZCSC z^JineUE<1~%@I!ouI@*4Dg+o@oELTIwMtHjPDLSILl9Av%et@)m~}$yni!IBUkfSk ziVfq{Qbk_UgLJK3w~r3E`Y)|q(?emB8{=Wc!AXaz&JwKyBDw!dAN#b6w)bgzUZUH* zp#n7c6fah@xKim|B;uC9HZFLfuhh}>h7XZSJ->$GL1$A{;FE3hovyA)@t_*F;4WL8 zx(BDrdS3mI?&KLHX>NR979OMWeC*??>O)+W+6-}Igh(m4Lk;C|L%IIf$uodl77+k& ztC|e9+%*HAy*H`<+J)P| z#s7p%sue#DFhNT~)fEI%)$4*$yfNPqDxw|=vW)Nj=J~J6Pb7c`(`<)^YPfBOWv*lV z253HX%cN(SqoG=Sxi}$$O02*dXit|gO$Xt-sE??W??@U)Sj@U%M8g6KJZOkiO`4!;I^brtToSK zfX=}Ta}~s|u!aL$pV_MvG|yzB!@j+!(C!VWBPB7>+_~7!3BYM!fauLmwmc^IfCt7y zMcXFPy((J~9Rcjo&a9^kSddofx5Xw-bm;qcZi)$yvBmXYcR-oIXW~+yo63s~tNM@0pkN$!NEaL9G;Fz^*I=6gr*M}yR;?E zvB6a63jy)^T_@?b5Dj|AP1E>AUuvNh=UaUfq2nPHA1a$>rQ+Cq{<1*7E4c3`!0cNE z3_#!aO)?e`f6vp&{>J42UM2xr$fi#U5)*uWNxg(8 zhmT*Hy0E(#6~@xZkvumP6#e5s-fjP9H}hkk>bg@qMr6^eEeP^N$OY@qpy>Y>WU=KQ zjN_ym4jqxWU{%)HOFQjNV=Rtj5=duAs)U9U)89#KAT8Q#rTHG{%qzcGfA8_LSi#?g zI>*Cbey<`;dr!ywL#HuLz4Niu&&@5kDPAB9n(w`1G{9+1bC$iR{K}gl7>$nHGvSh&ORIbbZ7z|YQsDaL@ z4wH9+_-Y#+?RCvK%lf+l!L%c6YfZ=_~2+-9HXx&znlt)x{r(6jMf`-#Nn;&S8g9WDRzK z;7@V}3vU6_$-bzDJ5<)e^n0U*O2}^FGqKds`wTI#nsYAn z&g6O_57n8~hH$36whM~u$CH0#DYLu+Z(XqgRr75gCY>y8dd2sXsDW-5#OTrP@oadz z@nD?&20lyto{|go0y`qJAxGjANK`CoPeT+Nz;|mzTd_YGK&(RKCx;r97BLm7RXeNJ zP=m(*8nveb_5;ioBd8Tx*-C45U2ZUBPLuR8j`;LLO# zGMPlS`%11B*&sF#o=s;BCP6UtWJc>;M+gDi`0;3Qim^SjgKw12)+@Bu1@1QJ8SUyR z;^|pGbl*T4CIjzONQuyR{c>TI`Fev+TLraV^Mw%kW-Yl`pvu0>vF^ttwBquhXQ8x4 zx2QJab0ThRaR;w5!-Dy<5&J{bV);-FJi~!nd1(j;cD(JAHq#7S58WJ>4qGFVl6oFu zZA|7jZ+N&wIjkNH&T86dmtRphuIU{4(UxcgRjLyPw8Og^49n%fBTIKKvfX|!nG3NW zpVpq_NB`7pE>j=6VEF!GjCpC`ct9-BC}%sRlh^BH+PlJva;5L6T(DsV1t}IO6^FJk zml%}>Sr7cq8fodjiTwrvHU+=g??M2Da6|+i21rdig48MW7b&td0`sEtSsm z^g4T=0;YJ)qe_O`Czv4BRpmk#W{?sS6g+1E@jzh%1}pJk2%={V%qEK>g1Y@k+9{O& zbHcgLijSm}YwV5t{UIaU?+plq%fROj9W~H%@ziTF6y-TR!si`w^|eQ zAG2qHe(H+z`-kWjY;nuKGE(8B9f4-Yzkh_&Z}ON!Cm!YjSIu>sf8oJG;eT&mW5S*b z^|!G-id8=!z<;kq?<4!V*YifpD+zow!+F}ur$K5@ zU+f_wJ%)MWxX1Feax!W?hh&*ibJ~9$4}5=aB|GR$xoUmV1z4LHm|bvbE$%29-~#M4 z;I~FDLi6mJWu3!5fEzX>2w=Z7d^`e0e}^T?5Gl%QPKfXwlnq-~g(W1?#Kz_>HAFN&W1;~cf1x}%dC7>qahp?ii>>=*moc#bU7^9-x-P8h7@It$LL`t`muSN9#E zST>M|zL1&OSe8*ge2#BRS^ql0(BbzKp`f(UGb^t6O(yD8wweCB(OF^fOzBbI3Hlyd z_hubSE1rTVK#dG09x&=eok0n{tV;p~0!_*|{E#R!{7~Q|`->v0{Xkz@ZjdRXbAEBeXVL!yj=#!ejWX&%F-RT80a>v3jNtKNCB?8LrrsjLwQM| z`gIkiR14*&ckg3;zF-J~0A=rdJ^dnYhg`Q_+WLt)*b5E&n+R=MV7O1)kk1Ys=y_x$ zV0en`ap588X>6xaT|N|s-7jYQDf+W_j3GI|dw~fuS){>*S5O)wH-AZQIfIl(1TtV4 zZJC&R29V!m(wGF(qXvoKgx9>Q6auG=LjbF3{TXi~ILxKMOOsXzfU;hqTJd`APFXoI zrP=LU2AoNf#v9Zh+^`pGjb(nVvd@upxHIR!YzE=yzLQ5^Vc1Z=l%D%G&EY`BeAVW# z^yA(q|Pvs7wATfPK>$U7g+LF%F{`zVy ztmK60na&DG9I!8kgE5d~k9h1=UL=srqU%W1hJ&KIqBQ!)04vp?90a(zMGib$h47q~ z8d5O|CwO`yWb=a)lO`GGnnSNez1#EVJu&S>^R`fa?~+OqH0ixBQ?p(qoYt=!Pu5-e zwL;0BvAI84ymHaz*BhHe>AipQm6qdXA)&D6mG^=%mbY(64 zlo*(72Bsk!&IWw8gcPmb!Zlc}v&+s|;#P^zG-^^YM`*>1IBlu%7D3R13q({q2NXnL@J&I){$9`AWt_F)-g>l-s$wlo9kuRbk;E zFpYD!)HU@G@$%`e#^1Sxfh{fqT~64Fn#vnqS0UkkdaeI~%{)t(xMsb;llwu$*YV@a zIcb_l%tz~5DLlL9@MMw{QLmAXXYC|JUtEZ&!BKm_??m54#fNDg?QR8BnC8j*rVOlF}2*?C6%@xlwuA#jZE>Rl8NyRXNr!OC%FWxQv`psTA=d7cI=1R)fTG;%q>J0E=P2+sd6! zvp##{zJSqyUxFaKA(EObi_9otgJOr_DC264SvG)Uf#MF$jo!mtY#Fn6o&^8T4F4Kr zZ0|#^Eq_z9A>Em`>zHudm)wV~VlJ*zAwTopjJ@aIe~ zX8)#}sbi}320hP>&_-h?Zzph3b#aZzEib5h9k^1b`OXh(_k-V708 z6%-%?w%TfwO^=FdteKd*>xoE0M=@k1+>gdTh-S+x6mW$0%_yW-WvGSM+W{Z1^HeS? z^69Gl(1V64vtFKAZbkh-@iezGavolB&ctWZB~*T#OpvV_@zp$E{v;GdeMzN7MV%fD zg1r1&#O9WllTi|mMw4yq+(;jDp!E!4lfs_W$bLc|l%O;5FUNKD^Q72L|Bd=+uQ>nj^L5;|}i#$^u?37-5#@m59NO5})dw`mOfm zZ1HBbK*mwQ3AL^wfJNe8ZwWv00XfI}@G#8S6zwl=xgKx>mD0tLPAo)2`{s|IT)N_U zr>;Epq+*pzxQk*{t+?fZK0X2MV`|oX0T~a*dOBXlD}y`s*!li| z7OmPF9|v$#ZR{aYDe^ueqw;=~HI3rmjF@i<+Kogg1ix7`svS;k{f&aE*`ZoE4gNre zihcHv9t9oJM12&JPdQ8uFbK=Wvol8&9Ha86aetd&%+f&!q8@U%Ecr-XY#3?k(UGs- zZ1%p!UC9JC85qc#!IgMO;H;;cHKeCuPudR1PbrdvY?N^19i&xop4%n92ewMT+}=x( za?wP&OnZ z>!pu06zeX=ega#i(XYpbohM0Vcg-TK|Am77&s(1u1k_s#C8e#T#e(g2tHG3A&-{@E zb{-5WGg!9ZCjf1HNuc*(KRWzZPab#K(W^8qLgcG8*zv7OWNYwLH4Qy>fPrwsxYX0_ zVmsST{Au_kXYBaCCFNeb_x{_ql#eHE`uOzfrc2h(6y5J&y!3Qb;4@b$WO$Tf^+?(T zJrHC0m)mr3?QtUMf8%0A5K>#&_UxY<2j8l_jxzNgZ1_Jm7WJ{O=kESDFK6eU?L2C~nibg8h%csY^NvV%ke+%#rqE~oTk*NJz~ zKX-#40DhSK=j*tYFG_7s@_q*GNW7|8R7N%6s3^|)}+O#pc}*K%f8%H!;HMD@z2XC?C3UgX&-mJ zQ5sk12IJ+M>Fwt#Jz@3bo6H>0H+dsg;G1ua*4RIX#Zq~mT+y2xx5;SF*}aZ^jcr!R z9yp{}xV@bQDYR(V6dwp@2GsMXP8as|c#JmcTYUx~(k;gDh-Hm7-(=qK3&ybPFpWd? z%^JMY>7Tpq!gz+?_7NdeIpdjRVx8{+gkGVVW`8vbzNvPzO67u`i2`xR$kehwQp65T zXNC{Ho9U9E$LjkEoidTK(yo$r<|G27>M~;>o_LSd9IZW(H|c!7Ud01ce^C)t{sTm% zVgU#nco0XjKWnBpV4$sKV@T1(ZV;D>b1O9jVsIla#;(9D@D1^%1GOxhWf{pf`Cc3w z1ndI;&jpZS)DU5uKVZ}?dgo41h6-U^&1N&ZY>>N9jk|i=jMSx#V0{py@w|j9VL--a zMyA0Yd5pO@$0?_p6zDEa(?Xw><2}51bJev%-Qoi1;av!X5GaBx`HPL{#e)0aF>i~j z5Y_1k=chy+ zoacumgUF;kV*@Um;h-BY z8Hc;cs*aGc#mR|13-*zeYk2o=7V?fKLV>-yk~ZIeMrT@n!YRDF-u#In;1x6W&$|T* zE_3xqd@?k*|Hs0^Fn5lL;B=iZEOhozR3b;fO;7QJd^T27q%Th3A}`@F(^)xa|6IHD z=86<;mIl98I%qTZ(Bm?O(i$=JH^xV2IiM)Gy`pIf80mx}yI^ z93$j6>>OA*`F{Nr?hHNHA0S@n!7Vn7?LPPAfXo?+YP5c@_J|DuKjS~Do019GlF?k; zB=J`g4a0&Y2<~n(u71yU`T-OjlTbxB{H;Dz%)K%%J!0LhThY<{S!fyAUGlSE)A|d5 z^vB^SGJw2|mxXd4A7sIBl zAd_a9O{;G+J|?Omgkl80SdU~Nme2F3j2^+(3Hp%ZA7&<8va2FD6En z(7#N$Loc6)^7Ln68dwf*Q;m+)0{+{J`!gK=^%Ii3SVtVH4llqq8onb2YXcV^GQ%jn zNe|1AWsT-j=qiTBbt@n5xa7$&PF&y>!PKr-*6IVz`5%NF$mJ|c*;TFBP@Sbw33F|0 z8*=O0*5WVELBYPC%9U-tUvL}lE7*%qNGg1tzxb!n9Ip!rTGD?wKoL_?3JM|vTneXu zB~2`qS6M6)P95`blqRzT^_hZIq~KVJhr&^uKzp7sB+a>@Q0Ol66ZF!&v5p0r9RPpN z7=6Vif_swpCIC&&J9C+Ba`(Jyma8CFX0jh-J`~jqWiXWJzHE{7SPdt?TFsRVr@ssz z;Qi!I>y;1~-q#cFdvQ3#XRK{hFGRstgc3bz9;@uV!~B^yQqA>SS=^gos}PP;`dg=j znB=fz?HXT|U7am+4jenY#Cxc4i$h6X`@6H*QyH@M0=9xTD*jj5dl7+9A2f(8>+mPO z7`en2@~W6fGTw3vT0C>hI*VS#qyjM_8trlV8xpMY3A)GcA~a$sG6Z0Xb4zxBN5FOn zGk%FXXuA@tsu`74zA>|Ua^dWDXL+dC3|hB;o6?FHa?bd8x+~P5T7(2t_9^%SH$sSg&(mo1>Ea>Zeyb5kpoyA~LP?G~!ey91p#@TFz`T&?L957= zPoaXb$4AKuDJAVY|Bc#Y5U~$Rr|GMWzVN!u_Av`K%wo2aw7a+sy|6LY6L4A6v>ZZd z>j7T{oztU%T=me~z3%w04`JeHy>nfeHT#uny^}qEh7CKBLl%#q;=n#ruU)t0B9B~` zV}-PLegLO)o}$e8%B-raKwN_cMK{4p2P6-60rmgv<)K9YA+{t3*elYi|DR=ljj?w}jR? zGIj2vYG)AJyqVzEsdoY{kor4T4G_8-4gUx2WE7Ap!3`an2LfP#c4v$$ZA;R439K$uqJQog0f|@5frzL%$V;>_K2q0C5v(%d% znFVQfv$)AC2pm$aEJd{H&P07Uzh9=+0k6Hpb=!o{7>E&sll)ed#`5>>IQvG+8{t+H zxOsLNcz0JjJLk$zNx%C7>?ocCbJHqaDFFd;LRcs$%UKYtdsV2T!bd|hpAs9xg*|qj>N(y|xg~e0?QsU~rnQegn}TL}zp-N>h>j%%iEh;j z$H~AOaY1`^7A?*?GQCQ@>7~#f{RfNMfyoAmIBX?PnogLr{6#T*s*9*2_gV1+@$aG> zbAH{>rZITUG-_Ho*P-xU>l7TPf+E8U?9Y$OF=sCFZuqx{Kqt4<0i@@`(Oq>-^ktos(`IQj z?o9-Bm_qU-$K2^lQF{p)VHcKk;pT_9s%PdhQ(}Mv$>2@NG~`=r;Zl3~h~P;rg%pkt z;;rjl->8I!fFJm}U7N%QvKPx_oprczc1RL#@9%09C1ika9%2OOO{19?&iNR8A==~+*Hb>WT~E(LT{gYHNHv+8&7&ow|d6C_CyhRere zfzVgxN<|me2Uz;tf(5Sil}mYnX|TA$jbxCsRM#Nf@-nga33~)^Gr^rdo16If3|0r` zBx52iBR}3vuaflca~(~$&VEHp2IH$q*0CFpUNzU~E+3sfbzUHBaE}DLFpSk!Of6Tz zmw~n%gN#knsTuik(F8#;gAO#i4ryfDgX~w?jc&=b{4yp_Ac}VY>*&V7GNo<9_=4Zf z9voAEuwHWXWBuMqv{HZ68i~6Td#pl>@sSYZp643k#r_3s-Sg5KgAVp|3009B6WYN^ z?7Il=k+_5jHqe>7s?Tuh@y&SN^na*&%b2*@He3`Lw8-G@?(R-;cPS19ic{QOi#sju z?(PE=cXxMpD8A?Yc6LtA&q*ekHCcJ&zI4m>lK4<;Wia-f4wYasYvFMw#zl^V{B~J zeQKtdXuN?W;<)){{q&N91SX;+BmC-5*>Q!2QF7+rSdwn98w%+-Oj8G(#r#?#YCd-F z{3U97KK|%F4EcW~-EX4$W+vMxBi?8R#N4z^edOutnG*sd`|;PJwR_~iX{a{w314Nw zQ?AyJM3EpKo)1!8pow`jaZw{m5v#?PwiNE&+|D)I#g{q5=V(lyI|$~-d|}#IhA)io zlk%K`U3Tv-_ba7XWm%m{&ZN4{|NX zsY&@)8w)39%BvLNzp9DWxEKyNz3#0OE(xzL9n=8>>pi~W+Qc@AK@W(~AHz>q%`#6W zU-vJ*3GfoE=MUQ#>EI+#0m$oKnhVu=MUFQ5~x(j-6i)z zfHENiO*xy3WtE^)kv^uzUt+vI z(?i;`d;1$ADpbhw1K`iFdEMsn3vqdZDrM9dHI2^75om_ZVvsUG1FIwfbPR?NNw>k} zMFxf7G$Uyu_fktD?GASi_Ad@8zWc;|OSWSnC_>L9t6kRZn@B3U`lc(dl2QT z$1}zXY9L~I&RW6ybq3p$g~c0}x6&ycY0W4DU9H3v+#L2Zmfl}Gn}-g$B1nrdy1=_% zPRCm7pWj|zB`)C7_t639K@b=QXoIwfC{xwwD?39}!o7gbr;StwP zSc>JNwzTng6ULM!1^Uhat2Jk4tZljFPe(98ox`Bhg}rrG=F)8Mm?h~|dq%yl@3ZBa zx%|?5z24KI3y1u3XUpxB|IPa*c589t8IQf{`|;@?jt*2Iw==tW{_YL|lRkA;I_Z`r z`PLNEY*HW-Ao?bR^DUIAvj3-c5w%S1uhCmVkL6X__n?3l_{Jur7-}*!W0MOb_}Wgp zDc&@T^^XpnQX}D4Vk=aCN=$>fmw;6VpPY}EFaAD}|4w~LUWbyqoyO+r-b#MZPKT&j zeY;41@H;;eR`Q$`p9y5hismm||KP_18->3S$PDz78SkI{_1EZDvNDt5dvIZ4uSB4J zhbO9CM%0!l}93k&IEj;DyBf5z%`g}Vw_?;sq2vTKIcDDr@8)$??o-;xL|HaWX z{zkH4Cr(1iZ^6t*T$ka>$+I7(T(G}K6~0RLT6SzJIVeS+?@oZk{VjQ|0PA1o5_?}3 zbfxR{ctZH@*%EHNvO%c>d#H2O<>xP^esp(Xzhs?%E^@Tl4D-Xz54m8n&3bapKU=$- zh#abO63^(SqvzG2JJd(zLFZwlgaQ!4I*F#Ar~}lA0}(&9iPm%(=Y+NS1kciSDp!}e zah}VqAG|10O2Y)I0Jn8kF2xC%l8iBv(GRIC?!;2W!&WaIf7xfojnwFPbydsqYE+Z^ z`85u`JC?Z+v1GO-2eEGqSUq_W(PO8pef{eI&;loBJq4R*$?N`GH{JxJbLj$Ru>fFg z7Dm0U)x-zVZiTDqKuC=M&XF0Rx>40anFIQw$5-(qF5-bs@_lW?VEO|DC}Q$jnJ{xK zJx1)_j6h4asgu37@xsK6h`RK*au`2kZ0HX?%c>RM)c zfBHk`0#0mH7ez@ESY%No4v^CLe?rA=3@BXvP_i}+e1#%kXVEk`Xd^_PC{BBB3dIs@ zqVrDP9G61{;_+K?J>jH2#d^DLm7?UJqX{-pS7R)}?QhnE%g~E+s$KT7-y1<5xrWvA zH&6|qq+N*A6?xnc&nZIK6}GVZ+NJjV3*aKtDdi43suMtFz5z`CAcV)*MZKuzB*h1CsPleB80Byjmxz`{~0`b~ARpcQU+ zEebpLmmZ?slHTIA5?RKk$*}?UpXyR)KJhuKv*uMBs$IfFr%gM;t&87^btFN46jN7UyPNLIy>O%n4M{Az$Gi-C{8BzfSOi^F^GS?|{qAqNz^^yQ zmRnw%#4}T)QWa@O!zH3GmdmoFLST}J9NV;k6i5kWc)@rYI!TD>KdWA*HLP02xmG$9 z?f9koS5c67d!Das4UY4G0TZY`0u=eV+-x#$yh=PDj`WcWl-+r~S$g1X1cy za(TZ8Au$MeiQ-`?tu77YVvw>A3J<$ug&l2Chi7{!ly73hK0p896mbO;zBV;(^vVES;736J-lyIh zgXMnGaQ4O@#6aCiAN04P@Y?4eKi*u8Z>vedUR5uF44v*!FCje9geDzH|D^|T50LE~?3-1)%EWJKdP3nXtbx**Z9&3DtXm#7?t zAWeFnAJYzP?G8xN75fG_DZ@C*z*5b#`8qNC%Vu^(lHVcP<5()=X)5~mp%7zsL_bHT zS~=K|F;0|$3|e%Uz|)Y=^h}iR96n4uXUOAYVIpic0b}C-lMRJ}fSKxVEsQ>>7Cnws zX$5qq8lLaN`Y^|n4xE>{#;NhJJ!)v<6slmFPcND#Cf(W%?!NTof`P-J00BVyLzn&} z@bSn{9jNR@^zsX1?aKbv0l8KHMYr`XzaMhrh_S&v7h_5$dg1V#Jpbbst!)mS`B>O`m#bssr1#<_5}Lz{*kNlqhR&DyLzwg>$n}l*PJpe1ltncQX5zE z_DFha#eE+3y+y?LW)rp+YVapmstYrFOFX89m=C4sKc$d(Wpi82|=Rw zXvXY}RZdBu0SUf`yX`jHLSX{*0tdfUC3EyaM z+c1Y4EUx&!PF#lo#v(rw7m1-xT>i)vv738z58E<-ZYh5WO&p0ceqi(dL(Q{*OMrEq z!-lWo-e_&vHB*>?FMOkc_gDX7aiu(nw@;t2bLIEnqnc1@6hx>52~azn_W=TNcen(l z33d?x@(NAmT6D6ILjyzu$HjV+LIquGg^v9el!}5Yz)*yUO*AxrHRZst7(@NTx397W z_O>Ecd0*Rh2~>-Hs;)t&T?W0&hUSm9jYAEsG!Z)f_k3%dj<0tc=j(PBmUapfaueim zO=efLb1!@CCPED*5I{&aebwJorB;%M|K>cKkT0t+&cIe-gLKoFd=Z~g*1fSFw6Wu9(&o@y%ocpB#lcn$F;4esi~H`!lA2-@2amz zoJp|Y>+*hQ)LKW!iu}QL`A^MlKPi@@Thn8+t>}YQBI72CGG8J$%>7rZ#rf>o2ME5Bm!5U_{8sSgmmvzg}Yw-*Jn;O5kYLR#0q<_{vKQ+2TB0<3d4u2MS z=9WX4plalkw7Vt1LzsyhLYV+L{IMrkKgl9AL(AhMdNM;-J@eo`nP9I%MIoWI_NO|h zT!m!Z6q+9KWC1(3@km74Y@>~2FO^(KBn1jmjXNejgwXBZ;AV##eBG%WfY>pc0!<;X zhUn?oqCjo{!k*0!O@Bpfl)U$);wtv|{<|?v)E?*MhWdGp0I!x3J0Ln>J&6%?)V2EG zOf@z;|9r%Gf`T+j#@9;NiJ%VVOKQc-gwaxz3fj7p;B5!s#YiOp3bz&Af3?Gw0cuU8 zwK!1cPmMK5;ecrAs#HloVvw^isgw)Q(rD1J0KE3yHD>E! zj|g&Jq|W6$v7*HxZC(j6!jT8;5hH54ryOaL!)l}S^9I{X#;(5x(6N3hay$(}yq6$$ zhbsbf$tqYDz=BCpi2q8_AV}r0f*>eBXVG7ghPj;Ml{6|e>iV@|p~LbBfc&}`1+>052{(J=&E&NOR_BieLs z4i;YL*Wp|YnFAUjy0j_VwcS>2Xk@A238|qz62A~p7n?qqkUPRJCE{>lq`uU*h;MrWbC{hAiKyW#(kOVXijs)&H{;It|nJNH%6ULI~& zZ%$xgBXF{t>Os_U>sp^})nrR=>uP{ooRaXr?R;4IJuX7io-oilOr9HPOh4MUukWr$(f(~BDKVw#FKtW8u?0!s zp6Z~VX^z_MWNw>2gzAp)3ClpcG^zKKKw%93yb9Pf5!q36&k->Gl|8DPhqR`Y!rfNX#bt~#E)pDF zy=0}8J}pLN{{{(+ ziDH04NeiQ}D87G+;EE`vfcJ<9(BFCu!n4^ot$Gt?;?{$ku;hz%k z^Ad^;vYqQ@hfBbK!(W_0`wq!xpX||4_T4j{8kK|PPcJ%bZ>fANqqU?;PwD~ZxZc;p zdntTP&{8dPs^EynT2stOO+DYhy-E?h!iWWjl_|-n`7DD$R+4iO(d+E0Y53G z*OmtqD5+7gL82h|%;q&0fW_)0U;hONBop|lW)*L;@B;|-jP-R|j}(7|JRr0vT|2_6 z?%!v_VkXg&;BS!s=>os20V}FNXkmDBb>5_s`(fc=)WEsRS=jq>8A|w{Y_>xYKe5Ar zsu5faix=DG_{h4jRfv6Ub~d-t_pj$DsDUHjkxIBj?|-JwI%d=L|Fq~6_`VxgqYM34 zr(Z1mb^x~Q&l;ZJAv|i#0J6nSszZxe&bl1~& zchHY!#fWcgk(5cYUi7m|f}!e&7=XU7pbcoDQoUX!DE4rO_J&mxb5+I5y|c6i=~(|? zIv1UHe8-|Nn}KOodFPSAK^IuZq?+ljQwu(i&{NX_TZ@?_*VhD7MZ!1p9K@*}ZKaId zr=UV0bx6?K`$au$@4I!=qyk**wsrEK{}#HqG48SjuU5>Y2o3Hvk-MgKvXjPW6hpW( zfJ%BE$g3KRP`zdG30(6p+mQLDwo^4)6(|SAt2gq+U zukDXrOFCkn#EwuTOyN;^=&gpV62wHm6{Z)(wu7%%`}EHnAqWP zTV1GlQnbM4fH4bssMXD*Tk|^(l!5Kw+o@G(wqU(Lcz1<_?R~T&W5YB4!YJRUdHx*A z^Ess#rB26AXJ+3wi8ddXCl*7(=m?LcIc_{mB0V0f*2h+uXd1f%7}(pemgX#RKHQ_` z>wK0~NTE`%^J8)=Eg&#w7)xd!tlrfHn0g49-!dS7-&OEqquACIbt_8$Sl*MxzN3@C zCocN!@@r5^q<%We^uK8s1(IR1MTb$1Up;rGO<5Y{=JDC*&!8Dmh!he21mDkfP1-gg z$y^Bkz8NSUv4SuUPbR^wo*Q1tF@8^LMeP7dd+Fef6Q4ws?Nh zc6L54AWNr=*MJvCOK6~<3w$TGZO#AsnWaTLsh9T1rC}hAfV?mqcHkC3=#FS>o#XBB zpZL&DsZQL`^>GNu(A0hOCZZf5Q4>|2aBDJuU~q^@E4c@=@Vx%qrk6nJQ0~{-bZ(m;y1-RfOw^@o*$`X6; zoT52BcAAO)Sz}Xu{)>gEN!KwX?AE5n`ft22g1`QI`0O2Nq)FMm?wf^W0JRs5*=KH^ zD3l1Vuw$Ei`!`{>%F{3w!NNS$MYj#6ujI}C#x=v=zoFF|_5uUPC5u{jUf66m7i*&j z@8ZB^W8&Q4;ZbcxeMRA*90ZmvPYx^%k5;Xld^(zkLANF*B+t~-IJ3910u3+eGF-At zUaO2eKZ_-*W1Uq9lZ>8;2(@iE%bdNoQmR#_1cRg(X+s_&O83ZL5TL}!a!+sIc}>wP z=eomO_vkbcIffc@Srfg$(mJ$Op7Dg<^HQ=Xlr1DfRBS$dK=fXknU#;Vi+IWh!92s( zy58sikC=TCuu7Z^tNpy)EGE<++#FF>$RKG~>$h})uf6YJQMoKL!%wRw*3XFO4GJIv zq{ENV>KB|JLz;_)4a}+|^N&vYn4BjkBy%ojqkq?S#V-Z|La)eQ!OP?WNA|)?#AuLG z`Xv#};^JTCL?P7u@;LH+qR@v8X9pR1%D7}fHvr>Z1xefCf_@}iz<2sMi1Of@k4~;n zx6o`lrUp+m$c2_4pkrZWJ6O~STlVB%*GL9Elx&qvXLWRO(TCFkK@fO6bth#k$GECUyDAAzow1RnTVSgO>HMrr6#n+q85418SYEf+c5JSxwn#=^ zJJd?AA}vtE3~}UUF$;_J%M~0xDZ?c?-rGX?5iA##F=ZiEQbn=&KX*-H3^)^cE99(8 z)ghjZIQYJts!$uv;TEiP=Rdq>e?AQ@Ht7EC{qUoWcHsjDnN5|7O8HMQ@%dr$yRZy} zSP<9m!pV^uW^nVftszsU!Z?c*ZYt_LDRyd3Nzj0*tk zSh^!6dJD;>Pa4Z~7)@As(uwe~~m)HS5RGAn=v_*ok)nbS&$ zakYN~zc5n3fh9W^(?k<>7Hb@Ml>jq{g_~OBWQ{Pyw&=EsH4p^yGrsItwWf^{s9QqY=WN&}Z!f#-fK$ZY(?3QH^;zW=_d zDh;~oNZUGi4QJV!vz+_*SRkYFj)q{FuXUEQC1B}ZirNEDtD{zf%gt5lU%Qm9Y909O zNQO>KNLq@Z6N-%>#t=3M{`e7PPr{4vV0Pvno>y$RFyOTi*6JM|x~RK==ChTbjXw6_ zj$iukka3!6PmeK^3^%-9=em=O>eQ^}ivlvm^_KA_6Y9~F#{t(>S`542et89nI-#l5 zsh1vzV&O38L7%(uW~(*$c=X=>w4#`C7J#Cm*gU56VG~C=MX zZp&36ASD}j-v5ls>t<~$x5oEC-U1G|Tk+2T?ji|qMV2Yf7}75$I`QqeCSvn-O?6hr z1r0zR3gXNnqwd3Ja8>hiFiv|wQP>Tvm zEek5q9Re1 znycb$TU*=>ozsS_XC@sb)YgslJcc%yze}DQ8F7WkKrehdMIA9Hj88*E~4M)yOJOAF1}dYxcb|j%Wys6r`@g! zYJKtJcR!Z;%7(P542{RtUqlK1duf{oiYf9%>mIuo%dSaB;<7mj8I&5SpMgt>*jHfYsIvy{0g{vM+ zp(4T`$(P+qVCfJtC4I+V^6r*b5++QbGNU^?F<=dOD_7 zrU@L=fJD=9@GT~dBS!%#)1}m?UX*&ON|vdCWg?`eSm>2s6!yn<$m6F>&xKZi>q)=6 zYKzqIIt$Rs2AOkoy`OfFOatrbu=cgZCEQzulo`RA@<3X$_^G2E5#Fuzq^rlQnM1CB z-^k?c94V2c8`$(Qe&!Pj^w4ts-DzMXF;Zwa>wq<_I?;d|nLFpx1Px~VMr!O&PjwaE zZ}oXp6%-KY3UK^MpDtTExF>enb}QRE9?}|QV_pb zSC;d^>f=>nj6wy!fh2|~NJhcsF^h&HfZ304NQ8PsNWfm1^6yRz&@MJ0!%+*?E@7c# zu}9O6VR!Iv@iGGVv()3!Qt6T==8OmDTG0a3HowLGEgW`1N@NJ;G@wASSUrRqoD`gM zfjL;skk~2(k!8YDbT6^!x3y(?F}KEuKaFA2X#;sZ03Pfl_0D?XZvQl_1BT>gX`^-UiKh7mp0~!xgXW|roHP#hq!qsjp;2I()tGt zIr{@2HmO}p@7hO$8~U{vD%EF#%`(nlA4op-?j8?vd~c!Qb-qOa8gg81M*rhQ%hWdh z44x(F0#hyP+px%;Yt9hbJJGl)@H}fzWT(C4eS<_3fhuC;SlTm#82p!|E+M5`i~?ui zpnW#cZ4XQ$?ZTVoRaI_SP~@*{@_1OWIKL+tRmg_5ac7DyjSM0e%f7tYz;Yo37JC0t; z!hasuoKyufSYPqukV{rDGCo3Eyj(6$*v)wq2r$2R{;@c7X&U9YW}H0Cwe-w?xH3nt zj99~1?;E<5s&5B{C3gz9D!F~vOFLkV)dkstCh*|T>fE)$I^X&F$EN0g+J9kr$tSW6 zE+2|zPApc-NvN^JiYG`OB}Gr4{xMx*eSw$-3qIQ?v1yUnHK1=G2nn`3NUO)ld*m$H z;alYA0M4Tm45)MOImU(-^kzz1YoK7n{n%Z|2!dZKF-TZDLu`Fr#%zX8sXkoG;d?Ha zg~~gtyKb`1*Rb&QV0n?10CS08L=8J$md4+1l$bFII)eG6e( zC3HeA@Fln@z@i1{^rLH^MYhfAAm|;WLY-7c?>nOgPl*l5Lq>*P;vAv)WOK0~O(yI} zgjTH~Om9qjUGSkpIs^aL9gAURf_xCn5G$l|P9IkOwr3p<+_(Py_G^p-j`%1k$+GG> z_phRX?8sOWBcDPo(qkqip7FFcvnI%hyPLGL9@cvdmyLoBwSXyz5#`jxWEYzVqiG`> zsa{bO{T8(W?&zkZ%uHc0Fp{_zfu9g6^fxydGNZ-6AdutmQ?D>~?QE;|qj2{$qQu7;oG@F-p*)Z@+8RHo? ziowgN^v2qlEjS>l=WV=$*=lDXt^!p^{DFew&v?`>VM?Acvuo>AVO+ttAo+0=0w&!! z1Qf?IS>SR&fHeR}S(j(eg2I8Y=o@crP<1G~f;n+2DXA7lx{U@!QxGjp<*6PG3#SP4 zflD49D*AHi9LdT%=bOcDmNNKz%r{*&@&98;-9G*wL#l{k`vE#8$50e#ng*9Z+OBab=0ZJ@R0 zrIF3qdHPt_c20+2fFUuX=8h;}MbN_NReS1yPbE0ExZVIXmntMW=Jq}Me|{uy-VOT@ z3w?nK*Y6IBp^ef|^T_7&1Y>qf<=V$KpN{9tyoSO~G|rV9DSN*5PtBe+Ny)VE9^s<* zIR=|A>t5lR$&~Q6;-o1I0rzw;Iqyg*<*wx-PFc%FJ+4QJe@MIOWXcvv@|>D%wfK6W zt9-o_PM-xMjl7Z(ksE$c_t2X<(-x_SXZhm02t=5Go@Q*b2Wwtf($2gBoZ5K74ORft z>GQ7!y$>qV3i{qOCNQtk%HvKme_LjCE4j zDu}W;s^J~0)8+UjdWC1wE#h)UB7g?OBQ*6m=?2qXJ%-U_Ca8*L5T03@ zcOaERd5_KWD8GqI3Yx5Pbi#@xftrLT+qKN;!5@0!qn*O?_a3x9A->0o3X#Tlz%nFU z0Yu3%!X&oD)YI(^B5^C}*qKwD6jAyeJC#AThzK4JF>6L}N|4dEtdp-VY`{`2^O&`{ zfqP}f&auC}wHdf=Mm1Y*Il4I$j30OZd$WJ8@_)(Oh$Jj7HG8TKC+@mrO>-YvDf5VU zekhdr(y=;HZ7yr2SVvI}UwYWCpx=~pHqlEAc9!555vJVk9| zju|2>r3yh-J!9}Y=@Zb9LCF zqnxiDH{3cgzJ;i^+DN^h(_+EUnWh(fA(j=8PhVcIQ04LP4^BYz!V>EGJZ)N+xY3Ii z#9pxw&QFgRvJ>>`$p0`V5xyz`Bepwq43@D~5}QpO`>K#N&!zJHedA)4q5=lR(V+F& zX=E=)5;J&Tp`C~%C#nlFQdSxo<1MdL1!n1kL#+1O?6_$OqC|cO1k6QS4!MLu(ynVg zxdR63XU$(V+Q-Sg4a;d2lu|zmK2|#XX|$Phm|MV*6ID5BA?JHyBo^TNcj!=p=bg2}-A-?yi@Rsb!?h z^kpy81v9SPJ_I}?%i->a%!4cc$#_WN&&5RrDcs2@k6;3E$w4U78HIDd>#FSe{eKKG z-B#?NKWoBJnilhtg6eC}tnpKNKen!@o{ARhHHBL!KrF6JUI~per(9+D7^6YoW9I&9 zrf)MOjf?`M^a-v(_ioC514}nylGo7vP7C_I7FZbn!#Ti!Te5ZX#C}AUhBP!_#O#SJ zffNXTx=ErTo&~{pvB$)+IP@9~o@?ZrS!;_v=&lfBh%OS7paCOS05r z@4dV%e=xs$cOPr#nAzKH%8lPKQ>oG=yav;>fv0kYxwaWj$L-Rs;sEV(wz`COaugQC zLjQOdMdDh+@;@52=lWbxIcB84?&)QMMu=(7%H(`La|}mD86-tqFcTrghC=DG>Xv8- zjG%`qpS%K$01csqFQ%Y`LI4bSc7G%oVx?!CzwT!BOQL)UY!oJa|0f;E#_#^fZeBh$ zT`}b!Ec~=0(ph_E^j5J|aHiZdMcJKb=m#l(-XrL7<~kQ9h22~9#*eGYX82B@00yTT zT_vh$$pci-t<~<~Yr{y}@r!rXxS6I&LqU%^m3ESKpT69Xd<1B&G3H#dH2y(Lt7dz& z%1-L17srjT|@+3G2nFN_&%(vjT5fq-q?ol;h zquU8CZ|jOIwUKV-qT&(@_OE`^ z8ky;j6Bd8k^osg1C3;)>=QPx?bCK|u4iPi#6XIiowy5pRyvPe}*9w8^$Lkgps-`Fb zQ6amA)%*@z5)@jRc$;`&@g9PyW0(driE5AU($gVB0DOht9nrkU=hWN?&qroE%~PEP zvf6h128$1mKK(UXVEm;(GgH02N;5~iHl@y^O>%OOXd_sb4yQrKQ#u#3NtmNo=t0Pu zRVXu*Im|yaFGmLbS<<~`P5Bu}p%P$ZN}s|3*4&A*Wu0oM-EvM(;$5qzO9q9~DFf4A zls8YMK4}j&r2GcF*l{GWFR1?;&x1s#;TfwB0R}DeG~kb4;IGBYWUk>k6$Y2b01{0> z;+DqDOlg*ZX0JcErd^U^QpeEvYytci*f(FkL4Hv*u*3eIM~dRdzfigr_w*$t_BFM- zg_+B-PA9}}SyIsun`MVwq)$3mqk2Y^oBOtw%tLkXxi35%QAQO7Egst$ez|BrXp@RJ z=%u%kSb$K3K1RA!EhBD)D}FlL^ofbA7qL7cUsajkD4%}wOijm!09g~imranKU6RLe z88Af9^sjyUjG}(`K*(7OTW@Sj0vEF7U;9LlKSRijYjE`(Wz?!=G+|@@D^EcjAJL;? zNjjfmPk2%6r6$V6M)BlK3O=}tZ7&b=#i&3vk24#igoYG$gN~TKUL!3uoMo!7sD1st z@lzoSqfd9St->>P&4A!-wPf=u6dlK$^?3n9S;+ZDV4Q`I>I0zD>1UqhjpipEl zwjGbQjVzl;tq?Te#x*84tAOE+9snAl&CR8S)3K_LDur%LOyKl=YWt20#SlA$<#j?s z@4NH)_WmWq@9D`er&{g+zQ{^~)#8KYHfZ`WJI|VgE_s zfi?^q9nQKc&Mf2Yq10k#)q`Qbgzni$y_6LGzOFj{DeTYAta6*fK?59^m+K-e=4o#S zgFKoVY?%?mZpR1NuuI|l2Arnm)2rMvt&-D~C)zZnkJ1F$+S37sd&@1`q-G$5C**J+ zjv==bOMw|}ZR{VB!b?iYe8e^MSJe6R=89H^mGO(cKw zq)TWgBdy00GLdNz-jU=FE`OJ&lhmAF#-LgMxpq?I=X+3O@$wWIOkb5#m)HRVYC_;d zBL5RO_AEL*qj?InJCi+fSn7Cy_OkbR8GJ9#@=^7?cJ!_2UkIt=4~nl~*97|wvx5#J zIXoq9AbA9uu7+UT@@Mz}$k~ZiftrJSZTTuowQ8}jo8SLY8#6wb0KaL?Pb69~;vfe= z0iv`4!w?dh_JxJt%hpazE~SguhxN2&YwMGzj(%Riatxggrhc8!>uc@!dJ|hFGT)5R z0TW1y2F{x#ok?v61Tulqbl<6ER*t);XeO>vI_lO_#*1#lzkPlk92pTi+#{G4ES0ah z1Ln>|`mw_%6rk@aZ$lC~h&>WJ-spyf9znqfHOYjTf{t4!R_gpm|MKOiq`R^etcl&G z;!+=i{lE+_#rf!weLdwjE#1}Y*~mE5&#HljJMCyz^Yryf&bA2$uHWD&&Y%DrfYU&| ztlvO~AKMKY2Gqfgc9}te;n*ipk3In@j7JbelF`j&Xewru=cxq;Ghth0;_egQflY5$ ziTxWAP7JgZXsdU6(Zmvz`iC;QwVF`AFj}XitH-Xjdhoz3A&eGqkg6Bbu`zm)iCTFQ z$0vA~{`M=fW*LohK%mnMXP#fCmOo3FFmsP+8eQL+v8B(cX5*;kmA%Ab%!x0JDr3qN zY0Rm9)Ac>}i zDCLZ@E-dIMb!2Tf{;hJtLZ8-Q$K3oS|F!qCb7(NCdDz_>UV-EdWY`B^(q5o_V#Crc zx#f3hgYylXLPB+S;%0K%>nB^mK@tV_DncxTVS5q|wtU8dqeaQLl=6*TfX8ZCqnLz{ z*hvOfbU?$vbGd<|$ztMR8|{6s>YCfvo(nx{K)^e@sd0E8Vx+rAS&e^~k#G8IQ55lM>nqv1hf2 z$=|IL%7<7~=!9w$sUPnw)Ju#$e`E=NK7du=v0^&9opst!Ns)m6r;*q+!MA<&D0#|D zrF7`SVagd*$x9wWXMZ~oom8phu|mxG5POZLUtoJHW>%BBkJ9&6wN7V?nA1tWwqE8h zYUp{F|6`nVui9dlSgwft>7FxbZV^(TE15UC5Pq_%EFxc!^je7gvJB)1&|!2LVUtmu zpL@M0_*`->be$UCYCr6`P(A$uPSrAo3uH9plPcIgE4exPah9dZ9XWCo5}#dg0oU4OYZ5gXX}z!{Kj8T z6}>XAP|RpeotG}|6D2n*lQ`jSqmX%F^-c%Y=YhPDlnQOdq~8FhtdStr??J)=8$~Z3 zHR>1q*Mm>lL~8B=jrPsPHE_OE``!aVY;`ZAu{-CjZK|f;Y_00+r%D7rZ;t;ey)7;5 zy*Sl{$8>2NA@akF*CA&d|5}9HpQuC6{G-_G%&JXq<{XOdCPtJfd>okGDN)q`TnV16 z(F;Q(geSFHH*J8f%!=_m#~v3N$sVtPlkS=_+!0V$Ec4UIvna4Ge%tumUCH9hq-?$U zyH@7d?VXq8<5zU>Dx73|;#mBvAX8Gv044)_bkHHXXK@^!%R)ka(f||wK z!^>j?F7@$WXi!51KiWxURs5s*6X41%V227x;G~In0!Pz+=}>oj-Oos$=55 zpH2*wrLFm6w8&$P#L18w8;855q6)n>{Ns7a@QwCGDa^)7O*>YhbGPW28#C;jhe8z z?~U{SmF<5c$?yB{s`FYqsQd*%=&c+XPKO50gjIOW;Vr(=Fv{y`liWakWIBkDL3%Iy zgsd?Ti)t7KwnB>DT$Qa-4Ru)BKf;py zCMSY)8w!%Ti@vvn3-0jm%#U+~XRHbi-BxVyIcZT46kBW(Jj4F*+8b+b0K!_SL>#`J z-#J)zY#F6q2_IwPPBa3mb`Rkt=3Z^9b9^uW=y9ULIVFs+PIAoQS$>@e5x4=q-C9+u zB?4=BtT&{WR>syQJLKV!szey?e&@r&(~~&B+BK;rwE}zPRr4w8BwI8I(v;r6vBE`8 zWWi@}&V;Mcw&Ft%De_pNqAH;MPk4br^BcH&#?D6ml7fiboqRP$wCP%0O-Z1m5%P}| zzEoNRtv|uZT?WZV2vjWBN9?;T-?5adSe_7`Qyc-J#1g^+NFJfabs7N;mVXdQd#nY$ zg4xscFV=mN_=le8lGJ}7-NMnRRf~lD9E(;6xWoE|Ix_-|=82~q8GKj@A#h2| zOe^u@er|X%X_1Wuo3eO*NWQafy8cFabz5h1{&C6gap&0geWyO6VR%l1@fa5dK? z!t`Ucd-lysjGjjM_)y;+$By3^-3=vZmn%%EgNWHftphxY>ysLLbYkpC_M*My_YUsG z(o^c7StotfI`|GSeTn!LHc^iG&mw}7Byhg#$jq`ZkZEBPH|1o@|5?E0Xp%_%Q*yV0 zal%Jo7PVWx>vm#!g$8j=I@k4+iQ{L(_JCLUyVpixX6G#xIT^?aI&WWy74Wj$Sf#|I zt%Zsp@sDo&Of|4k!*IA-KMyZvd@t<->1?+5H5nU>xuFwnv+H74{B<6@bFWZqYfb_8 z*4;<(jK4zp8`1boc{m>Ua-MXHH_h0bB~qT^CK#OnANeahhH;GZ}e>FP6bUcGotW)W5@=nWVo1?&F@5b8StvWGU?b{nC_t_ z%}*$wPddN{t43MRQxau#x9s@y+h#$96PE>(l_gw@Ahkmlc8j7p3LrUVY~|GrWJ(1G z^8BnpsYu-q3MheB0Q%>~+(mRTPkZE(V>`(?7WGSwr(1G7on#p4^AT!0%|+pIKDOOa zJT9w47qNRrU}LecUZHYL*Lz_1@_*Yb9wZs)o0Np#7br+_5R1@>OPB^Pb%j|R$-Ku> zVp_RDOxv~ipD~q^IlU1TD83a?e;{|7rWmVg&5}Wx%^IXdmN|_t7Dh!lbEr7lcu&w* zjh9}R#A4G)QI(}K&ndbTf-jUh7>uyB#qjO>9?rfWE}2I(swk%KdBtG5<^ z$@fRR11Ft$C((cuDKGH7Kc+fjIYh?P3f`{%d zPg(r~+*$=&@-(rRu^K+45+~>tvi-S&a;HDIBAfBeE^dTk>9|vt=C0{aol&CeMDJvC zWrL8e)RG~yciEy2xFd{u^i#q(r4sH_Z(5j$}fHiI{G}V7_ zPnE&jw588chacvd{O_}f8sY2ir`f5lSAL;Cdu=CU61XRqXN5oPW|P}lUS#riD6Y3B zGm6nC7&m9k*rVCLwaA`yib*LBuk>As<%n`~b`{*!`jUU`}KN z4ARu7A2m6InraxT*6ybdCJG8XMoM4>)=hTThsK=7l;Bxw+uI5DclTy_gi07~-s+daB; z+U9`XLw;tv@b+T9#IJZk7N!|)>$-~>+D5TiHmhSqY6Q$0ho0XMSEyMzMBll~-I~5(O zSRm^`px*MvX|KsKKno1gVp50eWsRXkjk*3L+0prpMz|zqC8fA8V3Wl}BaproEsb3W zxUI*Fp*~9UhepBH^1lAEm%Ej3-6YnPaF?d(C#!`>HOofAk56PT5+`*=tsKP&E+8;3 zmsrNK@ZT93f2V$Xs^MVfgUR4+Om0lf&_cgo&pq-qw8_KC;ZyL!&haAgJ+_OR>G8kG zpzd{i@yT>(*)%P)pfip3NUGRGNXojsT~OtFcZnUVJU z9mXO8Hya0+EHXVXKvx}^?9mi9gPgTsh1PeztN2sP+EmRUD3s{$il=jd?Px38R}H2A z-M9Vp8ZbUx5nG9cSHLWPxid@_RC73T?7ePy#++GcJalsX0OC7IPPgRe`xnimT%Q>{ z%eLVH2CjG`vf4=HLUrn`A9r$D8WXuY(`#+kUr>$U$a4m$;cw$yl-{_xenF^q!D08k{eV2_!ze)_Z3f zbW&!K0s&C%70=tGocGnS2!s4X2AVRpoxvJ%P7$CR+SN;Gag~!=F|$8{9K6(B?jpCV z74W71O!V?t-jDoq1>AuO@NEh{O`b~aZdVyDK6~m3EvlI7sDb}85#Wu@dB9Bn9{>zN z^S(@9`x~P7M)&=4zt)gkf`EGjMy-4BtC|PoOt2|Wsa&IBTA^Y}!(M{eI28n)6U^_a zsXQ6e92q9rRi4K16I>DdQ&=lmwAWfQE=ZY_|kKfC!TuVuwZ!d2HTR&Mjh zsG)4D8f8q}`2E@jAT|jn=Rw^Q#G+{Z4*mE$|CuJ*khCF)d*I7IQTN&SD5&-is-D<1 zXJiy*AITH;licQ;7@AJKllwGz@$YF2f}J4~QuX|Qh7bA=5VNIHvC=dx z?DtNw3B3RH`UIyG8z2IQ_L`1;g+Yo^1%V7mfrJDrz@8>m*+sx4ILg8Z%dD&+6^paYo9*f(>7s)GlV4?XMFgzw-!GzLjX#<+>P-+H8QAy{ z<);*C*2*+cK}foT1c|S`YOR4-`6-RfYsSC#H+{pVlpNd4M0FMk)~0m+AeX#SnfstS z8u@P6P}PX}0yc3w_^yCdAP5Kokww7%ibrHk5XA(6_#(g$=4!o8{Gj$jx>%U5RcqA2 z#GlA20x7tWREveJBw-T-fq5+hp7r6s9V9A^8U~8mtZ$T*EHN1u@2J2p1=b6+*SbZu zJhqvIcN=T9g%~L+?Zo}iBEPb9;$!XhDG2zEY>{9w=~XV5r*tMq{SjW0NBokTGAD(G z!+jRuEKTH75SSyt_mCWRuTwSuCQ;_Kh4pP;uNgP`@;MwRE!mEKNle3pPasCfRqFIVeezxOzqXGljlQszBqw1wNOyD6 zpgdk#6ENbW2y=HQMqMOM2w1o0pma9Ladyo4tkorGMb|13_Cbe(?YLvMVD7?Kvk`bm z!RBofGk6ZcNmGym>8JPU_x_)+()9EmO?Z5S`I&Xk2!21VR7>WNC5>@T296z5q#dgx z94~rKfVEA3yXV%~VK?tA-7>nHa@$R}DgV0T-jtcj&6e^S^$LCF!;i14$ni0D__%)a zNyqtu&XC2f)o~)g5@(E{dx+F02<%2cH9hlor%Or-iv+7#MnJvd4PjzZun{}_N8n@> z?LH^L82zw%3;pm#o;r>hwzJlY*tm+8Jv83g2w zGx>`$jI;L^yYBCx_tPlhoAi(4T1FTP-93RvD z2MCfz08VxXd3m++fSze;^xDI}M6LXz^V)bKOyr;t(0}+vQoG@jcNT;IEAo9#J@+AA zr|1NuhSTEBb*Hu-8(cIaX<-qKeih@UA(=`)-CcRdhYRv}qJ1x>cV8DJ1Lu@=WIG-=^ zTLpF00lA69-T95PlplWtI22Myu;Sm2NwuI@EYe6%VSbJWW88Zm&%$agJ+YiN!&Vf935b3-FmU<4ttkcAtoafi9IaW4G~6QO(0o5tj=4 z+H^ops-*MaCn#*ZCb-&4xr!L#S$vO6HFjp-wlO6W)v-@x34XEN-ui2JX9beL&PEu5_Ho>S)q~qln)!@tJYb}oeOqm$6i?*cO zg+Q^yWRts6$@#4a@EmY7d=j>*Y3n50;ndl{PV~90$|aE?;1L2zx+eF8#K5F_I*nbC zLH2w4!rxNnl^1A$-M@JJu4~R5c?v}i6iSi81Xxe}6jgraV>JEp=c#*gkFp9cb;LuM z5Daus@le*WmK$!~a7ddXkU+;SJOA5%{61;--!e%*)R8k1wAn+>FYLS^U2+WA9vR}I z=N_gdGRuZ*!nUn$^V_ayB_aEfhUhQ1qR-9)`zjpyXLWdez`{Jz5V=y$M{Jk+qc+rN z3Nov)uF>%RZBh_yr-PK7cS0TY){louMQp>!f_dazxkAO}Lo@-2=n&(mQkmywJYM*R z&P+_nsIb#_ioa|U2hjO5?%{^FCnnLIc{6j>S(Yl>3_vbBTSNHx2cKEWv)|7Q2t;o_ z`4sVI)FqcMkUES<09F_44f@g?XVmc({RDxeBcK`f99WZv1CwB#^i(brrVtqEfZh;^rH$jOu_*NPT^yX zs%I}!>*@#WDm$7m84Id5H#&s7jB%0yIQ3D?bfl*$dvX6#rduG? zwS;j>DP_{|o}uYesyCW68V*1vcR4t-QmMjUZvFLSmF3lENy$=oy<6->6-4<-ASwh3T(kAi39;bz#|0qTlMg$aw$d- z5Cn)a=c`U7Ox6utzWDQQOlN1a9RUT~-3ZtrH1d04zo%-H$IC#WkY#dQ^R;?3GE9bC z%Yv~@hG{E(5MqIGEF31{(VT8c*U$-}3`mDbr^J*s+xtcOovsZkMvy@oUuY z(%Bn7!o+HphS>e9-$iizcwzO*h8>g16wVVEbKp6WzxpWsFTeaw`X9g5pmYof0c@D( zbCU4xbs9)Mh-x4_Q>h2ytJK&3j8qT@s~9t?JeZ7->?HiyM^~Opi1ehtmwjVaR@9&T z`!r*G^LW|5t0-)0>p9`fY98~*ri>esdvRE)6zSSSbv!!LSlm^qb-xXg=gS1oyX$eM zcu=>4o%pXa)OA;}feiq#2$t5VuyV{PV0+kLL+iO(dz5cw?qm1fCgu$d1M_CB6Vfm) znqUsid^X}77riW5WfqW^!QynGeuYZ!`XG&4$D|MXq+_SMsEQ*@T^Zq`K{nRwzDyMp zbvGZoMjw6eBO7aRa^l7lZ>JnKU5JBZbIR-*=W92@!h{nU-%Dyc>&As{Q76; zMs4bx`0AnrBIWo6A|b$9KqMJo+aRZAsUg57j$$0YOc{MZlUyl|>Wj{Tz*Yo$$8XV{ zH*eFulQU8ZbHb}jSEn@9<=UV8^pIH-dHIV;b#F$yl<8>8v^{d+rEofmMmp6IWjc( zFZe~$YPC;*wnJK~SRlgU zH6U!+4u2euc^{Z*a9wR3Uv0kb?CQhmvgxgrTokn!Q+jbwzBodFiO!bE&a$|_c_BH( zs_A}>^Sw||$`Awufk+?_eJ`{~z$8it0{$VO7w`W(xi~XKA3m(nd2U^mSSfFf+t#xV_%Y`DI<2q#p~5c&b*dgBf^6)>MY0 zM_76U(Z1G836lkl$5RCCVgd*+6FQiY>o_*TB7&91u0DJp+P$yg`qK3C1)q^-y)5J9 zI9mnddK$!Bvpg0-bUHny0f@WgzPBFBxE|$+zcjzpB6!!)1bC)Fx|{3Tv%pwoOG0mn8sJL4N;&Mx!O|bWfx{vBQPk`a zeU=blf}b^xAcH}Riq$H{(Ibojj^WFb#`r~}PW!=90lR-{Af+v05p2w)tM_ly|NJN4 z0g=+Fxs#ZI#U_zxA}|2~7L&{{=}G_em<;pp?hyUz@rPKOdH16TPyTK z(XACm@uUaWm=|V+aD6UY&bJBf5|?D5k1(mn>HQX6dE|%;kXNNN4e7^pdhZm@1+$DB z&49C67NqZ=_{fLpFTeK+WnOu~e5PKi%c~y?I`1rU8H6nv*jd^Bb!N9kNXqMwae0b>X6=(ZTM*FS^25YqrUku&|NFTrEQ+{C;3sdqY8KL#SDG8SS^@B)(wL@)Q>sTi{vaQSF@Ywo#?HA%Uzx|q$o^sySUSjHHSxIjJ zclMq9b#v3lv7x&lzY40&f~vT0F0j`*9V%cs;l`G5Hk>>r*T>2zzwX zNbNh0$viJQ5g!WLvd43xkfMTEL2P~x1OgjNRJmWH(>^!f{#>YN+Y!sV_B!W#GnlWjuRH;5hm3rd>`tqbf$8biT zFoUD#k~H)@2PoJACkCC|f0G)`N2!PzbSCd?ogLE{TL zS(GW9H%vj_nSylx-`(v|89SN{c_Dc@@nS}o->vpxa^*E~Ixb81I=dh3=dR56zUvA4 zsVC>}J^NZ*Zyr(o=<2@NL(7+iqhpi_utr#u(eO?oA_xcq(L+GDo_o<#El`d6>TGNv zBv^sMeo&Q-F~~dC;z58lM&OhXU?sPEj_-UobmQ*mRr=bCZ_&4(`=_Fe$KCniTO1#(H%1}KPJZE@N~p< z_q1)f?Y7!ltd?X+)XA7 z#5u;MrVM&4Mgs+qvy~9~FW3OHwp!0Ts4ES?yBZ54kURu^lSr`eW#xn;B`4{ibeuhza`_Uzhe|+Gautg+?TJvmOfChIFu-#L+T-=jkA}f< zz52AdZW?D;DFPyrtmM(ZtfP{BK~-Cz^bY8B+A*FFA-hs zpd*46)u-20k#uI?W8=@3@3A18Y@@lV&54K|ii@5RgDtk|_#N|p^Unuv)@_sw##6Hl zRjJ5X8Ru8$`fLWBK{7-{g>w)omj@Z6cTq&uUaJn}>M;S9t5O#$PVL^jyn#j>vRN{1 z0`A`0M-oUh_QCF$2a79J<|JN-zg=G6LuD~Gt^rsAU=Fk%qcsO3>Q_>Co)F=cs?8>h zp46q+8?7-?6g;hQ0Qnz$8MICd3^cR}HL95#%xB;+*$xX2cXOW^1zUxA_&dHP?6mVx zpqb^Yo`3N94|px?Bp*daymIZv$?rIQ5ikm1RE6%v%|;`t>akvoz}h3wU-AB4lsbS( zu%gr($`Hj#02L3&Wh*s{^7@|i~`rflJxbI2#nK=g|up$KNyLVvw z_M1>|w?V+b1Iv)}`Ln^CO0AdR5$(_6`D=g3Bv{Mngca7&d-~r)e}ZIfg{qvYI*1nxzN9KoYE=MG;D%o%;}M?mh+ibg~_Ei3IChsS02Crv)TfZb1%m zyTEPTOH99L?`nyv#JDQj5ArLg?+t!SOLBg?G+7t{MqmK~%P=}wpaP#}1mc7MKU>cB zmMEs6*PXu}o<>_cS*EbZS?F2ru?Xg5FulGpgswpdXFx(Sq*S_hLY8s1Rz8vx1ZZp! zDOwkauiChDX7^ZXw;Dj7uw>Zx@4MS>w@eZ&z}+D+HGsByb{#M*{o_<_8_CSbXS>U5 zQIYI6O;gb~BZs8n255E*071OYdT4nX`4(8hN5Bj56={{h01IuU1(iw_T2t3{A)AGI z{j`rd*2yc*T4uc0wCX5F7EYlD3 zBoS8S5W5V%tq}a8F772UV8NPN}q8DQWi2+>V4 zA|w-Ak|;>FB}o+!MFVKzh$S8fbh|{<*nt8%jT?OtbX>Hyla9IeCqX*1fo%AA4^G*S z(-WqDyFwCuj28Osu?w%+R3Ft#hM+MrsIb%y4;U_a2?*qJRkN0~C_=7S0s%LB!xKG+g_ZPQy>DXy{QrjR%0*v#Nvd zXj_N=8!v*4o4+I`F^(5fLThYHp;Xu?ndDbQgk^os-?s(ZukV<3O(l={&miv~KA`Y* zeR^wyqg*q_h?AD8st$%>nCs3et~m~I%noo3+30nUP&{1cCJW9`o{3Hx?>LR6Dg9l& zeCFei!PSdJUy2BV0M{RQo3AofnOVelzBIOhh})tj9dwR0BB)o?aAJKJfmI=(^<%VN zxdf1i1WPvtuvL~JZD%pO1Rc1FWFm0T6Jpaap^qreWErRWj>JB8JF{aXM` zfaMe}PPZZi6bxjrcjpb*-r0q;I3m4T7Wq|GnC(cHQ+ME9ulyVM+5LY4olI>-=y0`R zBA{=-2+HoOVOHU}>?{*tdB$!T8B+t=4 z&o(+qr-w+e(>D7_>&;F#8yi}38@-eh;T1XY(Dl;A$#|c6vE9 zFAJddlE2VEQIFHJ|bG`q|IKyb*o&Z2uj_nv5)() zY!Z6~*m=$%3Nn?)(d!;6^Np3VIT8=$J1Q3wP3urUXu{To4bX9|YhY+5ftuFsL9;>Y zks&JLRN*=4oQ;Gz1%%qZMcTQ?Rz|YD&wujac@1)O?k)E}gn=C5Lrh`UC@~{}){oZw zoJez9xIe(c2rvTCL_kBLCzi7a5GmMxQ)LpYv(WGn9|-Jg@tJ3MvD@$g4QE{<0{!jh zmsXn{@zrDRdK5nN@D;d}q4#s|d+Tl+A=F<1>B9R#!vIk%@kU_p&YNZfN}?CrqiD5# z&})Kp>z}}260B%-3~K`h+C(*WZ^E0mZXucVDA<}sezi<^D(U&xxdbYlyZtrj-1zNf zs>O9J0RaQoV>{3N^%83GRz(i&1qDIGV6gVV2)&icxxzr;u=HRU#hxnDB*8lOZh!+M z!5ZwII+wH`M1u84A1}dQ{6K?){RtakkNfSkj}{rBZHqY)DP8C2$*00YU_3;E9JfK1 z6<*u9w{&CZg14=0h# zpbw&^250|c4AX!-Fz8#JLQAy)`X^}UZ@%7v-L)R}u~a~x>2dJGo<4vQ`m8pZ^~vtw z?-4_w-5%Q}XR|rTN)oymp?v_FRH`69f`2llp!7~c zIev++EDT!Mhn83*SZL@DM|FSKxJmScJRL21R-o^oMJ8A-SD-mjr&ag5{3Y&-KH7k# z1bo)uU;1rfvo08LJClt76JRB~e^=T%B0Ztcx(L09R7+*Z;zN|y#M-?czWk_A%ojjM zM+h$u54(rEqM##^M`!e2PhFSp@ZC6nZQe?=a3!g6B;R`MF~D~u?Szjhmll}6yLkdzLGNqB>qI9 z@@1U+$oP&;M2*VPK9V;|NPsnZRNATNU7rARdKzjjGtKIwSc#Zp!EBC#{+_UggMilaj85zhJDoS#6#KtsH>JQe15tv4x zkL1=Y_6RTumOU<6%RHafqwf9sC8dkTAiz?NEQe1JMWi}1PeL8CP}c|Dl@qm z<2J9y^tAQDvLpnot)oCd=Z*`z*C=qDtpw74r%MjjuJ&}<$@<0PKJ5OK@@1%QY~g!P z$_xNnM?2cs+CrioLpqa%+SUaVHZxcpUf1+{_a6F=B^T|vSt_Tjd0lVus?YymnpKBaAS07WFhYPX}kW@fcz-T(H`c8@-jLSsIc%bACS zH2QbV3DTKDJ04Z9|4*$9X9GfjF-X$LDf)5gM`lcM35E4q>5gEYLyC3Dm2L8BA$dV z0S%nk(ZigW6qGqHTsWT$M2F?0yWAS74+n#k?PR))EVYWJ;)Hs{>?|X5t%77$lTyfJ zPROw)kMsBFBS1{VhRsV9Y2LyYZCNfN3wH|Yjq$=t^jqam!yxWkq(P%`2$gab+Ai4G zb5a@vys`DsBNEq?@P$P`xtBKV-(&qXmUBl60a`#jA;QX+aFHX8V<5_l6DzP_3B1SX z?SIC`f8cd-fvZFyX+14UGUV@j5dQEJ?}LB+v!_77xp#PyH1xtlYOPDQ$Q@SnXb6l1 z0*y$_jW~QJr~1Kc>_u%{WJ_DP=^`VU>cD)j2GckutY=|dNSC6l=ja~1qDw1k!*?z8 znbp?|$!2C{3=lQ#IC9YtN$>UMA$;{)-vQ&`9_YCKr)lGRrm3r!IkxpIIo6qoKS=~6 z3eIhuhtfmu0&VXu7`S1W^SSYOTm}D`g@CW|6rH&vX)-Czb{FVlFX8F!3r>4wLp&M= z4$jNmsFmQiKm7~7+E=M_a?Dygqh@g)KlER!oR_orUacqBT=ebbTwurC(-Cuv{q@G{< zW7XoRu32(mn2E64h*8!=2a?AqolbdCgNwW0f?Jn< z#qKm8iy;ENJ1;=%ji)28c^(~=S{)_wdakR2+E9Ys{9Bja{Ce>^22B*9)P5B*>EHsO zF1;ZODzr$jzVVU-FTRG6XHJB6HbRyV2zkQPc(v+I?|8Xwso(r=>kBh|lx=ClY`6Qe zmv9xkSBi5m0s$jHWKkPi=gd+~vM3>C{@&Zs&ERSatD8j{w=iRP35safM?xeDk~|^@ z*3c%0jyDf)hgUI|%n0~Gz{6Z)sn=h$o{FM~KCx-MPZ=r(@9X(Oo--#40rF$)b~`g0 zmCF^-zMY;C68aj_btj-NC=%#?N*l3Qs* zv~!)ko-pZ$?*L*>5-|j5%y&AouU9*D%cTl*kO*s1CW8+*>W3yrgM`<3bHX0mN>3zM z1td<>Fo-Z;Zx$-v|2C0KtcG@`7Rl7Cl8Weeuj?w_pSw^hR}g;<^kYAKMR7LcN_C=cs&w1D&0wxg_I+WA1 zHJ8gnDvd;h=K3}*zA39{k(qcA(!=%;!i%R19AY@3+G6b>kXhjX<$>5sKx!*@gkWe;yqifUeAYpIp}c zKe&2|8y9f#y>QY`StP>R*}jJp1oxBBd``z~br9t(d{3V}ub`-pH1!QsX!F*_2!f(n zrp%4qKx^|*Sa5yjq4JQk1kg6C|M-3$a$k*$w;&%M@%GK=j_wtGoQEh!doXgAab>qwu|_e*~>tui!h9^K}aQ*18|d3rWcAE1G%K8AL&* zI#$K)fN&3$`L;>f9Lb#W=~nOew(bl;N1A$108!`$)`1b2i$LG+gL7`_ z$vA0}V6{}(D#=WOm5eT3Nh=Q27!qJ12?i5jtz@`_R%w6x`B2KP4-4?h{s6x4#jl=} zPsCU6yd*(2MMk`10_>9nEBGRy9);$s(5yYYg4(&tAP_LxBfGC(eDo14E;$C2FvVbFz*cR92BIIC0Ym&0o88pT`Nia?b6WXgy?&~^t|SeSZ7xqpJh zkjwImK(V}O7D4-|nPajj3gA{KZa`DLgXh8=r+&4!$&Zfi`9cog>r#*{6rqGcpXkxm zKHS5m43GfJCQmF6@iiXHZbPNRpEE@Z842gf14yG^kENIQu}h>^M65d;8t60DfetzK zurLBH5g3zWoh4i$d#Q9Pjq4jC`Y5LHdL>)x6m-<_xFzB%-RPk&_SyU{Rau+l#bOEV zwj^k`j_^_J?7Ed@*(AT31yT_mvNc14Mr&3O&sjP7c-#>%374uhX!b^HkP=?2>G36M zHjn)K=|37rvXnJRQRxH)E$$BtXifR}#~qVZ>wk1~XiI{XNePfez62t;sv|L(CB$hl z;?Ss={@|16tTcZAT4R9fDdvkXM3Uc5t2LJ((QlocpAldLqJsbvU`3}dSd)YxK+KXd zz9cn~EUAoal3|ENc4b$#b&iO41YE#Gj}YkN1hCm`*d^yM?@TA%Y6^@)v4C`?A-t)>FyN&(b%6Z)D4Lwx=csdM|F<)cY6uH-446a(pg zYzzq|RP>=kNLf7%HJ6zp4S+jb9ko2B?X^aED8!KNV0Mt&QBOE1XEMp+G9P^FW%$VZ zuT5rh^_}(wu0QZLS9#))n1WSk{nZ;iwVF*ZB0|I!hkj!n8G%(HV9@3$%R&SwAjv+H zU@gRn6WAkgpo$nxdFo}wK53+mk~6=A`@k&8KtOEX1g*UrXk&=@>L=S8eDNz^J}LM2 zf9un5UwIfQ;;R$o@JnXTroNY|$s)Ni>bF2TcnJ(9!HU&*jH|Ny z+cz=D$t~z$!vrm zK3N>1jcy+ah|ssSuL0Tq^Bd=Ey!ecN1T25Wc`I;D&3`@XR)Qd8pxrZ&pt1@|r|yUZ zi}KjHmyL+8R3^S!w?Q=3-XkPXB4RZG$@mQnUVeo3cy^+yD$s`|d<2LDt6VCBfNPRN z^dlRfZ%wJgCqs)c+VM1(~yPNWwdXJG^wf#f2<1X#)K zTW;Bs5g_6#0UzuNk|3%0Qclv-bd#iG6%SJ;yjtD>p#CM+QkG;PV7(yGwM{J5iaH{` z(r|7}FIesNY=_orr3S6uXcDbx{gvGZlGP*J8b)A@0Nr;x__8`FWb`AUBjmL7FoKPW ztCAawL;wIl07*naROHjk9k>mKN#hrpe7b#Sf73=nh}$|L7k{=rAs!)^7Vo>9R)8#J zU2jZ#spxdI{L3Bzt=q&!^gO7@CVzD24G@vEri%m=DsGM$+WKv7m#UYcP%4~&mCav; z{hizXNU%;yi@+C8*Ixwmj-d+WYT49Ulq54E+yI^XHGH0yFj8Fm=w1w4bXH{|FeVYu zNG5NRM~l!?aBhM3_@hh?K%ckuIVvwJ4KUBWgf5=bJSi#UP^13hf5Su|+_}!I=_eVG zlkwh6nU!&72KOf#dkv7Y86dN}0j>vxm~8O7qU+HX8aUgdWw? zJKTk5{_!6`+rNhfeLW=jU3|}S-@4`J@X}@392#+AM0!K%BEj((cQ0klZSiD*u7^C1 zRs4^#ty&pUFctIg{~y$xb_GWmu{Ho8Nrg z`s(TLTkd~o6dc1-?&xMBLuU=i^;aq8nv}AB@0+W{oa<%;ydt3YM|(70^RH7rCc#># z-VU~{`@MMXu}r_S1&a!owrm83w~_cMAlcSS@Y-JQ4Dr=N6%F70Pwz_xRAperi2V+f zny*5u{6Ju3azV>O;O?8RnUz)3_Qw6o(!>V-B3~( zBq@(REJPMX_B2BbDobQh0@~L1$&fyVLV=&Ml`2%;_X*R6rhWHKXzcp1Uv$3xA49ZQ zWkw)81cC-uaf+QiTsL0!C+@3GQI<4 zvoa8A7Yif62qY5$CcsK&zjCWqfIz3yF&QrNqG*y}kqR2_^b`w4h~k5P1rTwSj6f_A zplcgrV8DpfYUE6rN+ApN45?N&ko;=wbVh!|lHS^Z&utV-MwK#a9a<5)_kQ%C?SLJlK16gSUUtr+ir6?^S|9I%kbBBJk%`D|c5d#0RLnsJoeS;ChQkhGzB?(!x`vPFVifxUZ2 z(CZ*6joS`(n?CGTPISe@SF=`{T9CSa#OF}-Q}sA6Ho`Qx#Uo@Ce*D@!J|DSn(>)P{ zg0su~z+-QNcf8fRGt-4jS0S6r2ccx-%1Gnd=&GgFY9*8ab=Amn{ft2H2+&>%i*p2+ z1j{*AoN|o7fqK@VVSF~a-*j}kU`Y-F{ry*bH-?C>zWviX@XWI#a*9irF2P41|3!!c z@zrGGGdn*9U;?a3NMiH-@4xt;OkInqVE4MC0Dyk)Cy;qyANu*ND5%3aBm@C+;J*9j zOR#rv5W5y#5Z$fi$|)5d-2D>#?9y+>uC1)_2m$rEzlt3cv{#%%=b>)zv{Q5J8WLlL z$wpKZ(?;;z#uRl=7_WzG)HKU&rTL(v&-W0n0>v@3-O!Zc}<)$ zIS7P5u9JfmwpndmsB#YXPU&Dr{N&eE<7P9R#?IF=t#I%i# zU#nPSMqrG9-zkmD{E{%hd%}1wi`Ky>*HM3v0?k+)DAkw>203mFfPuDb^kHEH7=hIz zkVAVhT2mm=$<7qlQG*cjiS6p+=d+H_>P#w&zOor;WAJ)ADHhAn*2XuiqMU+8Ga*h0 zb`9oZi~u7L8Uj^($7xRZ3ulmAFDFURQIbv09~z)sFe4BX1lW5&CLP6U#sdM1=&Fp4 z!sLyl80hpiW1}b@En+Ph0Y+eq!1!fdLB{GbMw4hZ>f_V+tz530A-|#ox<0f`e=75g zAK5H9(&m8b>>1X}zl4Nb7;UY=EVVOWc4ZV_p9 zXRO7iGnNo>6>uPoGH|=>tcHx1nrYfLtMu8)$uKH}=u! zEbM5c(L*nntD60kMl#+!F7Q#*u3o2wWCBA-XRX%rDo z#IZ!=SDO!i05rU=3?yGAhl2UCtZT!6Jw%*BA1Pmi+JldR{Fb*v|C@gUox=n3_`G(e z#1zgK4m=YdghKQ|>kc-AYZTRz?gK1gBH({KhN)c~%APTNqpP}&!Wt4^1?xV2_TfQ> z=!XX_*xV|EiqCihqv;LNxQIv!)#mB@vyF<;!PCxFSyMXoAfkCHObRx+^<0Tc;6ibOIShWTqPsG2)IH(GsgQl zt}?E9Vj{uXZT4WJAmO?>n~|*fa9G&CE$57q)0MzA6bIazF(L@6mp$;#Q0hJplXQ!flkeN2$W1Xp&Q$Hy3f=pZ1Y->D#GK}EtTbUi&539?9VE{X<{ zRC)8QAv^m5`lXB>yQk;9M1rO3DWJMl^f8ze@`E)@a=r0=v5(Jh7Dj*(U#;S`mnO-Tav6^5rwL}_0Kqg77LnpK zn~gZA&N?yzjKB;8>Wv1nQ{#q!AmX9`Iy)hc1ih5^CSKHOQ9zc9py5K_q|k4zH-ucS z0vRb~zTB(mq`FAxJ}BZM1d(4&ORI+@TzqethJ}AK0*(>r;3gPJdj`qXtbz&!WUrrT zlStS8c#&>a8Oc9R7@WQjCcn+x!c`%V8up>pxQm}vX%K;W@p6-MSq@bu%^h?|i}8?uZ0+)atAOY3+3wd(xyk()KH z$3!zT^3TdRBYBvIO2zaPZsZu5|GX z(t?Z=V|yVvtAmXc=y#oB*H-7}%+uLUT$KLfQyyxv#kBP6m5o)=3)dY_1orOTf;%^V4w~-LxFdqi zJtv$FX5duC>pNe8XRrN%)8w2k0tjf$edzxDTM^L2n+iE}kW8h}N!ko9=&cOS03KVB6 zAq?P{a>Gx+6OBHbP$;mk6f|iiVhz6##@oF1^!3r2{s4*pi7cw~G}^%7^F(bo(3WBp z72 z;O=mS=X=jDiYkgJn7gNYuU_lgbtCQ?=xq5FV#;1+k+syvw6fCTv%Igd-=6x+r`=&* zjT$VE=}X}bgDc4q7LQz#_AcE2t9f%W<&pi%Q`8MBhkx1Pez7sKSg1?Xt{V5(mz+`o z2z3iS5aMl*gQ^HLV|R)rDhuAKpQGTTsLvTc+P^=b3dgU#^eD7D?%P9>=ww+vCHd04 z_OA+1_us6b^S9mj(w%*dl02HPW@E(pWHKVKhksX5XZvSwrx>E9Sizb;3w*Ka!c7KO z?sjV^5E<1%PFszCp>fILIWMjX9}*ZzIubyW#VmRn=q|c7)X(xT+!MOcM~q*pbN>lV zCsBj}zgbc;$jB!`-n6iMq&SJi*Z!Zc^esw~rRmop5i((k>x)Jf4iw3Gu;F>CC-~Z# za+vTAZrIu7nZQR@yeQM{CWbL6Fnaw9xyx&w_1q7COKQmtutvuWAK$gbxT49t$1{e} zn{RuvP~berh46f{E^lri^$(B`k&8vwBD}m|0uIvW@1V%&pbIl4lWDGrUsV#jpt_T# z4Ork+_uFLi(?87n!8@w=ksf@c*p1rZTMLi7IC$k9*an5wKDpR(u^L!rU zJrz;mJp}aH+=yc0s%X0vod(%ac;2eO7W2CbFM%wWWshGYI_yx9Qo_UTeAxaUdvKu_ zaM&&of1VTC;&4{bmKwtl#B5P5?^p5mRvAmc6ZP;<49zf54i7OC!+x6qDI)vI`S9k; zAySdM#WDAL3=`DzN{jp+y;J=G^U-1tYH+yUr*@*gObJv-=)C#+vrbfRKKBH8*bE~O z`N8ZuR3CQo=S`hgx>jvpL(zC?KlVn8cZxHyA@5J+=~JSWJ28!)9t8;PkOuXzycUH( zc2tn5>$G|>612YthZ+w5dM(&-^;T%;s8d<=p8E)g^*jh>ll5gbHe6Jg6{PnI#9^B4 z5}J*Fael8}tP-1CjdB)|meR#=HcPERs-K{nIimCL;CcH5{jzZ0m@_V&cH$oXm2||F zksy##-+z2)(%4rTw#15e#PVRtmawlcYAPM?$UAM{`PCy4!CfbubQC8)s@TA{(U5Yc z9kDU~+d@*vd);;M0D@2Zad)iyB5Ep9)>kMf z#`_W{RB+WqKtXxl5FJ_Hxeu9e!3a?1;ggGCKlU+Q8JFCp?`m2#3W;4Y;|=-%ndKV64XunMdSB@A__*Bzqg5r-Q6 zbs;p?Z0%SUd>qDWpPLo426HCL^1q-A8I%N>;d9PId+X2nk1v@P9*Y5VO=FLd-QWoZl`n;sHzcER;lj@ zV}ggLYoS(O;y3rg0PknDJuZoNKivfoO}8s|C$6vV{otz^NcgRo{Uf=c-0i#V=(PYY zXL5CiEqSn8LsG`^+HvlS0QawlVApeoCm6`MD(2J*$*WDJAX}b*lAh+KZ~G1ri}*P| zW$7w0=b8~1c!p#ce6|&_=@2;&Yw+b~yaiNMuZq5&k?e@@d-t$${9Us~XKR>)>fsVS zq1ifgTh2j2_N8Afl2pg0Y|3DuOwesinwbaK7^f;`^V}=N2?gRPn{90fL>*Nv0PNYI z8M6?sqIvH~uuN-f3)h;Ok_$uI)`E9DqmsR~`jhZE`R=!gF+43yXYh^jC$hZm#G{2e z)CuSrJe6xq90aV+#iaq&!-Z~H(^gnunNqk#NT>gpLnq(8-*8IKqCTGaTL7*3bax$s z{$LkL{5KAuENwL7iIDlQ4rWwU9zxcz|AS|N)R^?z!ja-sN;kHIBI4L?2L<>aKmxb)})xg52KFxdzu%oJki&jN+K=_fEr7RsGp zg2BUckQgb01sTxV=F&8#ol*C`wbQTUrkHfCXEtmz#vn zvKDWGx05_;BT@u_goKGU85DMT|92)g=3O-CFRVm}PhqIl!TPwJ7dMuATVWby^NtYv z^))E|w~d)79IB&%%SXaHX9}}gCE;dTvPe16u`<0U_ZD-4;p#>uK26pt=;`I z9IJjVg$+ea{o-^Yfbx3Cyw|_sTlU@0$PxD4(Svzhxen^7C3C8d&Gb3f?u880-I;in zBYAC29djF4T+VYh-eZ3#k}Zl%_ez0o+2HGdFS|yqw|*DzM^>h_Y_gMh8u=CCS=ivh zG^v+Qa%Xk+lP7M>`1)%kKe6b@+jM1?hN^I+je_4WGO~PjXbqzgHUteLW$KE2XwElt zNnU)AIcq*p&ga9^{aMrVBZ~211j$LG{84I|b6o}bz6xdPqRRU~2VU?E77qV`hJL%u zGGuopiW%4XaVj%fP$2qrcW>mdW14&AT)ImkJfP`r*A4aj>>X)$QhJhu3EqEg^eDfx z@i*M^<(F+sL?<08=2#QL;Qj-Tq-s(-k7~jlw%Uopd#*oA+>HJ`g$qyEF*Z%+)2oGm zEYsG}w$Ie!m8MX6vDAGl>B075!CRJj1EM4&PZe{MA{we_!qm}A1@OFZKY}qmMTR%f zCm>C7>P;tb!H@9|*1)Y8so0h{5ddk#X=O&jVx9Z$Z&hnc^i_Ti!{>MrYj!h1FAWrl zS+T|_{4?52B?ma_R=KVxkIgx?P7Sr$^v}Iuc2rb@NkmD)`!A21uSoevME;;Q6QH1O z&gG5@J-eSD(_RM%7M5hngo(txXz@8C$DA^R-E%;T6yl7(-ZKL)%P;QMXC=`0P~yRY zar2@%d6iKZd)hDfD#E~IJnom1&N-H$yEAcF&ZC2W8b^BO5a0jwLC8QK#zeX5BA0>3 zR7h|Wo(!S24Un;?k8kn9yFeM_}kO^6gV%6$2bzo?2yn*~vdfw@Qgpe~02OVYAP!%SrOi=hC=*vA1ixUr% zGq>hUF5b0vGmFf5(msF$JT!?eFJ&=<@40Uq7QkYpu<9?VT;$)2ai)f(IK}5y(of|` z;7)j`yrplu=Y;5Sz3s|Q88L0uJWAb*g6h{~C=GbeNjOKkR2-J)^aTXnc{8so~6oYqZQ7sp7t~A1y!Ng_Kxw;GkM4pe(4AiZ&d08{R}gN z-brcBBs?vgwkna$qC z%61$Lc$d$mf)(QHwP_8zQFWDk@MHaM;--fJsvU3_IoZ(ebG4_cJvTjnnAdanL$C<5 zMb_2R5kUvi85z~-eav?e%urTY&!Qs4g(ThX4<}wKRHlwvW$XMnI$%8I z(lzY+3NZ)N{4#Z;?!+wf_-w4~aEcoz5m$Vl@?d!A3S7vj4|iXfrIXgCJ^3%$vf1Ae zxGuvrj-KM8X2pOXsg={;K6`$XFk?(+__EueDAH0k@K*9;>4(@)t>7BL<>(PPs79Sp z*38I}cwH~oA=%e9oe;t9V6=D$n}cD#2HnKi-HzS{^vNvos;j;|0gy!cAlY^glY{K&B$sr%QCtu;Xl*Nmm>wN)zGGU=W< zMn(y}locv8)w&OZ)^EQ;RAlNfLtjzCN`ABky&YB-9RL#y%cVLTuK5gMQHb`Co5B<1 zr||6_#2iJS1y&dIj@Zk5>Vt~}?i`q<3XDYE7tzz-`Oe#+fTggK@;iUDJdeBZ@ zT=x!a=Y0;&snR5m>`?Qf9X|_=gp(4&u;j|Pr7=#Vk*mwge;T_77<%E&C|3uMj*z-Q zBFY)3h`?wQBV3yo)C>&gjCov}JHNj66%?HjWcbJzDq)nMU(PEvb3SZqcKZ~*oWC!W zZArGF4PtgNP}|sE7bmcHo4NZB0JPZaBL5hdu#)#K(;p~TxANZeNV)tk$^cFo9%OKT zH34tEEBWlZ5kDah)ic#oW$Sl@QoUa7g3u#KN zn4O+u&X2Q)?RwoNb#HF?!HSERQqB|(UuJE89Ao_<$HMFc$BeVce}DoPHU z&6kPSOmUw)<}yyH1|!N}#7?$Oo%Sc_EYP2_7TLlK#Yl!4~$vER6qR6*TOP4k# z&GxrZk>^crKoiDi*wUnJc2`pae6;|l@G)+}Aj09wporcl@rUzvQuMQxt@iwp)0+_C z*Fy+#le66Tj07AOg<}t~uSLy)#p~f1ZRY;f>NfkBf;4g##E9Y{U+B`deoQ8&Qyo0)T*jtTZ1H(gh7}v2&;!4i0%kktq*v`ERicF9Fdl_dKIKR8OZap>nFi| zjt}-;m#4QwNi%~b)q;Z#(kC@V!}mtL1QV6#zy(qnc+Brq*`Fh*FH`mpubj>vGAXmO zo4&@>X&0699(yY`Ap&UY)yw7sP1@jXDSykCs8Ktryc&69{R`2xK>voeWt|@JCuNAq zWm&2;p-(u*dYA3}^QM6_$@IZc!mhKJrPP`dQ~9^gv0fueg`^SPFL6>rpKuRuD~Btt z<8)2#W15d-`mOMie#__aya_PuMDH3CbGhcQa69NNs@B@y?-&`AaN8ZyZgn!vdS%M+ zZVbbRtQGlEKF`SqixCk)EuWVEn6q!Eimo8BNmk|v8>Z^Dp};0A^E$0SfkEaj6qrf&SD>U{=5d_ zPO~RaIRKU|1EjCJb&Lh_gaV=QXQ9yMX77ktZHJCXZ5?d~@Q-trJ1t z(CCkLw)NMLW}Bh1gG==-PfpCmOo=Sv;PDJ;8u)oL_9g!d|GPdb6l{$WgV5^=mJLwx z_QQT7zE*%V9!O7zLa@rp|q<>>3Ds_m9p;-z6F3Q>UaxdS2GEPX{T$X z*Bc{2)s;7ARL!}^UcF*k{Y%n|wSg!wcw6UQfI%O}HAB!mXQwAxI1vb5LQ~$`AupS! zBjK1zV0Gf99YV4K1&WiW#E5cQtFvwjc=tv)CjI^q0HI4}MnmCi7#9ZB5H8@_dckLI z5pvS))`sH9sO(hQ;V8$Xq%3++9p}nv(ofrxoR{a+Mj)cY!;@h}o+R8qT}A8MY%+D~)p5IK64Exd@zW~wvCOg@ zJT)3zb&+D<(yk+~D5=3>lM!GD9+QPvj+e^h#tU+kt;;SddOT|KbLI|XhrmZ7dFmG~ z9=Vov(L(GX24q~?cS4&11UyK~`Sb0t3!eCT&uqgxkt4z&p!Rkl3m+pqc^1Sig&23c zMb&n5^n`=di$nWbxu6~4)^OLw>m-7?7(O;&9uzV%q=vvYrUzxFH;7MWv{st7yh|mB zq47ts%*e}257{vnT3N`tf5;qZ4CK(&TCqwv#i4LQW$IN8aOK@2!7>+v>}MLM@YqAt1Z&wUrSWd+4<; zSTNCkPDBk0t}hN9NpS(j7%0q-)dmJgeE&us!5DzlaL+kw-ou#tUqz)^1irArDN{jf zKgO-f&=2i}(8PUiPxICTEplI*J@5XM$X%49btBc_%r}7##UT~%%kGfGU0j|KJyOVl zB(Lbt@FnSPm>F~?%id}h0YJLq;I!VqK3OeL+?wBje>>cf&Q`sM8WD8c|8fl#ZMPY- zK;nlZ!iv$`_Qfo?=Z8{iDHzWdNoIeN2FzK!34n$vul)?fhaISU5uF;dnHWBq33t6? zl%Y`{Y8E+Q-F$=Ly3d1U%~@?)K%ycNeD9<8*?VLnJORs`0;~3YgA91n?L@d|>zt?Z z$Tw-0b3`E8KU@QZWUALPbec%}O2E?}&U^nN94doR2U-uPNm(^WP8Wg`W^db>o#!9d zY`*37+w+~s#SG0*w%8K?GF~38VJN-6P@LwWgdEu)w`|FU#X_KevSv9)$VDg58lpuI z4A%HWcSA#3aA4|qOrGt(ttsMpEpbSA5*P%aVC*B!ujKB*!xkBCQ#?M)g4lSmIV3f1 zUj8C{&YS(*s$QbnWtnK0kVgmfN1b{2p|ujASPLnp#8uCP6(Mp}BRN3%05lspm_E1r zJN&Gk2K{{?|6EH#GJoDGKkgfh_>6Ggwpo=@xiqF2*vb5&+ULH|%p1Ugk1cCOgg=2b znPA5BII8DJ(I(wa$Me%y*G}!f5 zFw->aw*f+_=<5fs+eqF~;pfiAcYag7N{k=`B}qN-QJ|v$yab*DwNt6M`FRI88#&Yy z_$Mb2H_5Jwv!L+NEBz3A?wX48Z~9ZSh1cg4@jxm4qY2ESx%&nGRShFe`h~A(hLIz6dbb&c%J!Eu-mDSxmb%1;gSY5)8@S z`9Ov+^=$)QV64b4YnTOPlLnm~S04_lBttuW>V3YcpWDfDDjo`O&~B%lsqSEF`l@&p z_6#iwN{tsj;b}B9t$bXx=U0WY!5ojOY$xvIy0Q?AJtZH`6beq6HMMPxceRY2*Z!Kk zwS+)L3VtNCgPmYP*@)F~#a%sYzvCpdm7Gj(Mnl?Pk8+y(rP|?1;z3^zcOWp08{6i$ zg)xjb$G);b8BTQrWebLkYMz{X?&!u7nn!jzV;g0a2L4Kz|>uSsF5IL;vy1a_`@GB zcm2V3T5X&R$-Q7thw8NR4Vkv1mb!TYN-`&n3V|rEUq4EYF#rjltMh#a_kn9^v5q`h znD3qJ@2W52)e#j8n|6RVZW$O2;=b__KZY>cfJR6yAcYiH3v_CO$YgUWu$j}%Cyd>2 zo&;Z^V;K=mso6+EeSoCg?n5--15^d;e}Q-E=zF9Hbw0GC+GXh6r;PlrPN)8=M%=mx zSHE~_0-&A-bW1;{@2q9YoLbp?l+;^xl3ngS%H0=K2XjVLIJEYJ-}_RMB1=4UZ((WF zOC?Ni9LEV>DL%~lD<=?wM#(R58sVj{ z$jAyH^u1M?>?i%7EN$`|GnIcY=Fcyqw97tUY4}9dYmUABkO)iZ*Tg~`IT^2h| z1CMjYq{54b=w8x(DOFvtU=jDAwgRPqwyYp@3aOjqkw7H)4V_n#gzLJfi57D4W&O4r zt?$0)mDA%!|2z~HHebN~40Lj`%7rkZV;;Z(q@PE*@fT{W&VHf|^@G*l6#$2wrIi6Mm;t zO^$K*v@1_$wtHo~|0!K&>|g8UbQMCyz6;EWJ*(uQD{-9$JedtNwz;`EnLNp9wLapj z3E~T`3Fh_4U>tx7*D+qj&$DjUdDKMJP0e#G6g^b7Z}J~chKYlnW^zn1c(U}{+;*b5 zjy;6YSv_PU09yJIticUc6wRyVlB8$w1HSJxOb_e`8hT#zS_1dpqioFh4t0%2aMBSa zz{~kH9DfM^Ym&F$l*ok@#NLZV7r8Bl0@U4z<1#D*lAp>Cx3Yu)9xE29>I9lQu#iOp zi^l6`@o#lWi8=wW;8X&^Q^~^cfM(fNH!18%>$GHI{}>EtU62LU zP`Eyr3W!_<0jo{e+vB4e!u;L{%iPHu{1AU9W-bjK+~tC=A3qKJviOu=v}2W?C`vOg zUjtv#A_N;OcQ4lL2@ei>n^6KKvCp^ywSKA7%6^?qMIFt4!>8KxFNz45_hpztId?CK z0b~1Tcy)FT;bC=J7q4WOkAD1Fy62Nx+DSh2n3j2Di;#BudgH3ATKR7XCMkd>MKlot zay0pZxZ$TO>e*V~J$i~zUT5j%mo!ZK?tBGbX>qt=5W=xcw+$GnYFwKwP_KeeFpi819K(O^ zg}&m9j?l~!fF5Tm+;~avG0t7UKU=ivQdv(<4hPjp!CUICnbkLV)?K!t14qcTD~KRd zBNhiC+6aP@`zgFt+enW$>v03QDdHKCnz-))$Hcr)`;=+gi(_({BaIR4fYSRg!Q9MOzbi-$(7)85OGqM|x&qG79p9*@&&XAK=F+ zDSg?OImIS_v(!O~r1}L55r(u-;6rWHvIkiDP20_j{5oU=F{RVeOIhN@z_)AG%wZaJ z!BMy50weIDc9Fxva1wyaFJCDdMqGxiv9$NEtsDD5X5Kg;ACL0r8WaL(gzs({+sEdp zg>yZ?_Nj@PWF?rm-so}ahws#K#pQRFo+ek8v>Td#x|MZIu)Lnul?E;u(q`#-REOu$ z)7AXYXUR3&xvg_r#6=E`HDM*52FvorO7;VMD*$DCGmTisd0t$L)>scYhQ1H#k&1qL z-RHc#xvdlvPO5f;$P^T6Q^H)5u*(|%Ct57sK@Um8D8&oo13s%s}FPch>KD*A3z zU8;VH^IwdDh{6}_yha8ujxtP1W!`ZgzO4<9T--O?2kx`PnWF7agjh)U-Evl5>j$m5xTvA*!>O5{~Y8k#RYvjdbA^p{Y`sXFf?a+9fqgz zuJT|D!+t5GXVBH1PZzqQb24^m@tDy*QB?vu{E`JhHIH<>P!MgMi6%RNLw9OIE^QiB zoA6YAn=^G>KcK_?3{nx7umZ$Uidwk`=JovTbeNz-Z$wn(rLrVm{pkkkj&!N2!k@SD=esulYaUG^z7j_Jv>E=bGJX3v7N?D#L*E%UCc(L&F zr(h;pza`9Za^Y?RhaI-Rt|?%w9y#1&4Sd9o?sfV&r0;D{G*#mUnm0hsTca#@&5XCE zi&!MsDI=*c*b!>>r~@Ln%heev#7>V!eGJC()mYEe@~?@0PCq5^+XYxwKs{CgV%Apb zf|-FG_sy@E8Hb(oZ1}d@a;RO=Q*v1$k}}zl%q;qY>&r0<^7;(Y=^ZgR1i` zY&46S9TQh%cKH_Kkmp-|pVNN$^n8`4BN@*N3A|QF(&Cy?^@_=~=FE6!gPM^H*xv$@ z*Z)kH(zx+(ka|K_pOQQtN>9mbrBhOLqyU=@X_KJ4;sy}fXMb+TKrB@_WBF@x>}t%+ zna#Itdkl$3lJ{$V1_Qk*X2hzoQkduZ<10;{fPJWC-$9%kZkQN_q zB=+pYL~BDiY)EVg_YXcDG-ZOvX@-4o-do=LN@P&a%Zy{_I_RmY+4H>96 zHVnwE1vQ9!f0KPr!Jqhm*gMJC>OoGTsi&?y;r&40!-E!$Sx7ybe0Z=Z-o;njKiS3C zJEiGu*%E?&GK)z$RcSVX_<4SD^ScZ1Yy@qYp;t;wM7Zshoc6OnuI!QuV`F++!IGdY z1A&CVPJU8)WsuYDDEANi@3GZmC^zv{qPLsFq@_vE26y9Vx5f>vFoxdN;y(Xye3yh9^!Y087y1NGo@i8{1U(UFLqOor$SxAXQHCstr3APdREUp{52VZ?t}ej- z&U5HGo=-ozbfOvnHVCHo*>cvvT z^H5lgh|*EOA3>Jq_;&9`OQM z(81-%qP)jO5d$F*LTMI|vdcJkES0d3k`l!Q)dWcbtU9#V*1LmmcK*Vi4-jTGkY(UgXQ;}C8KsRL%7N<(jZ8^DORd3Q z(x7jlNlx-H9fXh>k@6VGGLp*>e+v8UG?(70&224Ia*#EKOOJ#`juAOim{fAtN*2|V zQEA6-fDN5;gJ}S(^oMopjup(QCH)i+ocXI2wBB+kmdKneOr&mfm<2J*$W-t?&Avvb zl8yl%)af2OR=AYDQdWUH1Ds63AR$2d!|KbvMT zQs*cl&>N;A5*|y9|6fBgFy{ee1Lj*osNd&?`rw~`MMwdQ+RBe5pB}dFk8!7QHbm0o zhuF~;6w9Kx7I>5sd`ce2u1B0n#qQw|WE1{6<^MBZfG_8(rSpjeYSBYAhV#hDmH_(_ z(i2DxYeeyhzIxlbBukj&Q6T?;^TJ$z=eO&fv~~%JRSOvTB2%FLOZNqxtsa@DQH(<0 zD~Bt&lAz9C9+V_0$^pVB5%+U_>mq^PyQ`eGB@B$-mF*i3>H-l6{n&Jku!y|v_pWo@ zq6djKi_jEG-<(^2)-|#m&1o2DC|k8sSUiLn<%_l>c)LH}fVs8Ac}{)#ohUc*50#Aa zbKg+~q(x-y&>pe~XlB8xxAMkR{(%7OWeSND#y?#ElV;j6C}nJKV3HjtQ~G#P0(Rwn zZ>UPIcgcScC4I%ZHr|e|E~@31 zfjJnP6}8ftc)Brun}BD;g4_=K@r8a`m2-NA%eB|dQf@Gh!4$v{27^NCZ*Gi==(G*N#cLl$3@XNg&bqD9pTjz>Q9JW{La(9{e{BAVZQ9{NB52 zb)f1qqJN5N%ZR);An$H8;PR$tL)tD=t`gSFkqE$IN8hhF-Z*tn8Jw#2-XD!$;cqbT zr`axV>fv%ei$~w=!vxjoeOm=8w}ZpD*RVE+#I!F8i7J-iU9;z1u4WD$09mu<(fcLWRYo3m zTSw^c7XzXkZ;oM+PYW*apQmWWA(S*LXek4t!a693HMd1I5jIoP+*_piY3P9`Xpz~Ur#072_*XWA}u~Y z2#uphE;(vvE_a=TTR_8$moh4y&2!&LJwGr@jBY8H$*=~KiH zC!)o45)Sb@eYKU|F;9whONsG9lF?gud9*X;h34bqFY^0s{fBl$S-lCxd^KjJ{l(4P z8B{#YCBuYS;IzkUc45D>Fm<`CssQIJ00L-@{~CN-Z>U;M(^ldQhFoE9b^AW~^r#9$ zpLWLnh)S^XxovDzp=0$CX5a;0njs3W{V)?C3#vf}kO8|b%W#+#K z4?5@|(x8fx{L0ywlyx%6bKsIZ{#3~{IZ33n4zb7wb+OpXG|h=wzz1eq51 zcfmU0y~2iht-*jG;kNT&#jwm$b{G&I8nR?D7*rEVGM^Fu3E8JjUa}Vf3e1TFP$?#H z12U^`mwgoV;3SJhZp|@1Lm;(Y(vX^dVp1-;fh+1s{eJ3(WMb)igPz_*vh>Zp_Io6iCSp0y~?u zDCE^xiUf(m(`I?Jgz4xMEncX}Gm}RXl%k(Rf32migZqr&asW*I@ewX*v^V@sTN-y| zeaKhwWCowh0eDtV(2>qkc!79g+++02BA+uENH+3P5#t-YPbeYGI>jaB$5Rk|%)by~ z+o4wEmi+mllopfH#igOdd{1Xt8wF!UJ0<;0ZyT!<@i&{-b;R?1rs?u0njoSkGwqB^Y0;`u{9jd!+^zQfvlM;-POjR@N)Wt$O%>XbEzwUk+4@>2T zI`1PzY%r`H*>HaQ|11E3#AqM40ZspxjaM{>of#StM%x_g;tyV(VvX8M`B2z}nBWuM zO-(1-QxKu(kzTPbU~a)O=c$_khxOQtPr20aofnz-iL(XW=?ROhcR+JJpog?wuS1xI zX|?fJNq@ri!m7?QEHa;~G**QfWmv_dkQ-1!}FkMIpOiIj3u$jIM!)EgJzk_f5N;7p)Q>37T=Vy)7X>!+>CcdrG9n zL9E6bZ~DeeBH9$B{K6c*)6?7Ow%VT<>gX0dvbDVa$`Q}Da7SB4is;GhHDd^cwl(z8 z(%X-(38E`t18+t5D=Rt}YIfuQ@Sg8m7asV?#!@PrIiKu0=z>jr$*nl~P6<`tzgt02 zcRPZ?ok9{2M#(DMU`%|jgl>eAAl_Q*wk6c*0q<2AtM)F4oUX;~l%oLNhrIxpeRAO9 zjdU&Lu_)&z0y)mJ=-%%=T-+wb~2+mz;%M9KW_fgW(H{ zr9tR*6;oo9`%tHB^W&qD1N=xma$+{LL>A8G*OyItvd4Lq>%(ZM_SngMI?5;kY}rL| zL!}O*0}cGQad<`~NUX@4!~TzFr&0`@uF(h=So{tC20^%&T%SILf!k3^6^j7YgS^p6 zG^ivaOWo?n7n@divw%Vuk3VOo(bMCf*x#NY;v3k&qdI9gz+K#LPaQJ_d*(8Up6n8f zsTkR{SO=dunfsH)>mTs&>TI!o+aIp`@e<$@Bywz(!W_J%b%LE%G^(72RYWnJv~S~$ zPSFkF(LbL2iF<7V3KuV8%*u9StPN#6DK9jSl)xRweX#z1tDpb z_h@mf%(EcMfaCLt1B$&Mhgc+CRf8v<-@Eg9E-&x91vqv}#qrnpr<5>1s-Kbn!t0D* zPux(dsVUt(mBasn7x;YNs~QQ?0X8KU;ToR*8S@KVn;~>73T6sJB-6fG8!Qty@f&+QqbCekB;^W=X-)- z&b)^C_oKJiuXnSgs}HouY>&6FD<({*rx*by$%O+qzfpyVoNyRb1(<1OIBRa^2{@s=-K=;IL`M!*p&uO;t~j^iw88oOc*UjNZjT!C8BS4l1Qs`ba0$zwO=^QkOyBr?6)5$S_**9X(=9% zE-ry|72R0ntVXty@z0NZ<@XY=Z03LA6=SkUG{}Ti->TJz1LzHlN?}9(W|)N0LE=bC zO-f>lM1}&jLWB`xdXPdhALS2SS8x;P@FjzyZuYM$MT{Z{4ke-k*1k;;)9icew!z7M z?hvO+@Ib00xQi2>{hX$CUQsD~70ga=d;Q^aV)l=I+D5#}T$;BDt{kv{xT)CA2-0xq z)gBL)cU>JR3E02aL8=jx{%@HP!6$)VhCdR|zo*E0prDoh$BMw}rHTJkn6{c!NsGTA0paglvB1gHK9PJe5+N57;_X(_nT}7$%O0poN7L&Y zFwjJAD3k$5uFKK^^T=ASz>KZmq87m6iQni~2nIzcc;K6E&+q9q=dlUNrd$d-5ugmh zyWEg;a)QkQ8bUOFwD(P5ptH}Es1O~cm&{U@AB_Hsh)sSYBKRUAGj2G?@v z`-Ej~Z|+s5r{t^Toi>Q*0t4fT<1$$*~@ zV*zSKjF2)}T(|nt8FNH5+^gMJmwf`kRkD^L-X$KWLn1sIZ;4EGzz~$HShtll6XaM@ z{B7!sO8dS_i#63~Maj0z>y8CI8@n&VfwR2P0b_}U9t`W4S5ugzYJxqP)8hl8Qkt|S zWvxa&eY&Hc(|+ciwTxgU3uH#X+bbsbI(3WYU$^*Ysm$^GIA=#J%;b-t?)$PX85SUx zb>B?NE69M7U$*-EzT`b?v{-$t=MV^hpX9%8yY6bouhL4y8gDj}iT$*aussl&^B^$% zbGBA3$4#@0VcwtjU9GmgveMsW&*H5lNwH!>j^6X9>98Y+C)I38m2s&(^V2AP%^81o zB!zim7q*87DqH|SIsh=*WS1ic`rEIwvHtgOufel!v!WxbFcf3E5Dzz_%8gv#eHR0~ zT#B7T>?wR9zG}$hP5`jc|v7zvII#=AFSVhRtb2Save!Xf{*rze7COi$jkWk zD@LB`i?mOLxHfOYto`Q%7IF=?P*W_)=;|M@%qUV`{72=#E13kAN}p$8oN07N9`VjY z$PSMS2mBPq89X1ZYPV~!Nt|Bh@FFPMFvg7lwBOy70a~1)k?C+n6Bc-ZhZIJe0*O@k zU>#P2W0{QhldS%^bPzo!{$BcFan``Ccj^T?y2H-K-E-})Yo%8?lFRv@eCOf&e#+4z z_z`7&Z@AIyJ=-)$Whl6TxZM_hPjDM8a{3^C^c8@fKW0<|(<=Zx zypYdx$opV@b0)+|$Q}#-F;PtPM`5H|B*_hHJ{$vuvk4KtoL~55n&>5Uj9nS1nNNu3 za5@@Jbe*pL$u8J+@6nTEB2D4Q1$0N>nu`5rxt#f{IjJKflgR7tZ~^d|n9vyZH==@s z9QxMKvXpW8lOSW|d6>pjBa+`?6-?VMug|-unK3STVG$v2ij+ zqwV#jfu@@4$R>Cbt`WEm4!2zXSy5i;4kQ>vVY!vi2}W%9519#vrpHLjp_^uSl;Wu3 zr7aQo`+9_N$R5ybv`3!Ho^MQCb9{dKt?%CxEG;fz86559g?&`1_`(83(~CGF$P@-l zX9si1}s+i=irE$KzuJuov;x3GOKI|c1awyge6ZFIZrMJl0TO4f7|GUjEQW9Ub`>9MoTT7 z4{>qBi`cc!=b)=!SJh0Egb$Ghztl3=Wigg`#G7agqvQhIubYPXqweo<46R5{UC*Pn zp(n`Q)R-M=lh&LcsTiS_!lg20!m%l>+#$lA>@)glM_MO3Rpu88dF8QZ_BAOhFR!Sb z{*uJ{)J5dt@|rbA^#M&1%I;(%YdRp>y!W<}um9Xn@b>|;;CvXX`nDf0Y3d@7ia$$~l#bOU0H+RvEwksX#4AOKK zyB7Z-E%m#S7t|q4fMDOjH0&>fP0aEebndCSAvkG05T(5Xd^xSrPhD?g8(0I-7@EyND(SkGeA`@lV3*=b6VWa2ht4=zh5?S&(NY8o9e+^kIZk^{X zL5oE#+z!q$qOCZv4J_FMn!yWe2LQHZgpx7KUrCHtOGdDCAC?`8{ugPTZ^`Gs0^z5~Kjxh# z`M+EzxDT=*0Ma3BK(x+8|C{^%_oaZs2p9ZwGK|>40K1^*m4qVG2R4D&Vy$4Dd@)Uj zN&0-0kwzd7cL7%Jf82c-TC2=Mnk4DBfC2-{;ErVZpa?TJ>Tbf4b>-^fQ(A4LX~4Ha zGys4V!HM2D?$(JnrdUM#=9x>RJee$oUidb^BXZ~!-gcS-j^X6M?VvQu?w9B!r|9$! zBQL_I+GcVoByq{Gd&7d6fRuUHzujJtpR)H4w~_0tOC5eE1W0qNiGxie0can3?^M3d5%v$^ycJHdL?y7dw zM!8#?kZPh#$?nqmMV3D5ag7ubS-mkq=vPaHu?zl)6|a%T7yfExO$SqEdO1rs$~L?) z<}}?7JT{+bcP(CQW!z8pN-vGR`EilrLA@vmn`5}GEys^8J zn*mw6=dwcg!ha;PC<37U*BbW>i^sh@gF*Ht3tKYI8RxPg#8B!DLX zu7_`f=g@WIf^)S7Wm|#2bshBjCT5D8<669v-u>cLGL zR^791Rf5E5VuwaJvc>t!)H^B&s8*fiUv82fPT*O1%^NNYGOByvF-y%oeRMr1YAN8b z>u6L8i^1nOI8iTAaMn>&sqi%(j342=Ixagx&0Z`x0Q8PR2&=!!X4$4q>g=c?%c^4> z#bE9ycsVvQWv<7qE19(1uaIEoqDlyjq2d*+w(62Ln_68mK7^U(9nOAh0L}#t+yF(7L^GFtT}$a!p&>6$ryLr=SlDb$PrC=vq720Q38GN;N#w33Y{Y+Boj ztP}P%BUB@DA4b{00o2^$UK}4q>ctX|zkh5(TXjqGU4~r@i?I<`o6~hKH4`E13VH*}tD-Lm;h(RsTF*mkK0GNlQhQ zDkehRJ&wYHY$k@8H;w#^9Oct9S1q%z3GVB*U(lQoMA^obIEn!`R_`FnmI>3^0yA8D zN-76RS3Nx^h}jyPV0V`1D=G0O3>GpbU!eXpSa^>Q7ELHhg)9Qo1!Sg!P8lj56p-aF8ya zY%~nWNhJi`7c|4EAVLZjXST#>8{T!6E}fGei1POee8U~xa!=2Li@;wXJ`Cfo@ zSi12;%52dQA$jxEVn&KO)&_YZcsU(fa&S$WaR9G-JoD9xmQS;1`r^GA!0dV4iFc-m zn>QT;?#69@X2ed&9T*_-s@Hew zkn7!*CXwrlxy5MvPAeTp?EdUQH6c_U_n0P#PzKJ6FXJn4CVScjPl3|4SalX(I- zO?Q~EgFOR@{qLtvn%-!eayPe&P;rSQ)OA?d7ec=%Mqg;kZg>2s;nMNzOFCLT0<4i_ zM@gLcCr1Uzjp4}cm^R`s9JvdXU+{*)zmDcLr+!Xq+HSkZ+|m0mvU8ID%YC5d_ER>C z?fP(@^$`mEzVkV(Wa1#_5a}&k6JrxQ?$(BwUTD9=f+{^fH&6{BY0~1nwL%v!|Hlb9 zA7Om;kD+U*4dDm|#s0)~b88C>-Tq769(&C7%7!igJ(@Dq3bXdoU3^VLOH9B=Y5kfi zK6HC~D80zsmqd$)@!0&7P*zP0`i1)TuuQ)S@`JQMwol5Ns zr;!6pja60)LYdkA(<1&~XbOt}?HGkaGvWNv=Kk*sR8D|ysrH8MFw0jZ`f!36XAIV4 zQ@W>z4=;M0%DnT29zVah^Yy}p7P90gKz*_`AXO7I+a)t0l!>F=&yEwPkfWIbzAbf{ zT-4%-)Mkjtl8J~T$ykwpSbs>hE5=P&rbI_yG+#~}cna->I0V3ndGHYk;MYu-|yrSQLz*w-5ThkEq-Vng&8k zMQuw4ShN|;C`u9yk>&e`78}Di|72RTmL%O`UwIXZ3uE&jnfeeK;@@sc24|)^(1R|` zS%Nd?AofY~tLZWHr1CXYTb#BUfyc7!D38cK*S9o8)-L2SbNFasgk!=m2D|cP{N`shhx1f3rZpivg>JF^dGa@^DIc(qA5+e+;U#!okYSn z(J1}V6tw~#BV_MH{NB)3dB#_fL0L&Cu#B$jKjm`Za|D{8bMGN1O<`3 zj)ev84;Q?38pv>s0JOWUxS54uKw-t*4Pke_r%zPvEEx0jp5<*FfqFJ{?n5Yo(YJ$RT4w81@iaKF(UNmbHgPD55+=+*D* z5-W^-tGolZ?XvLC4115OzVkdSe2eDbh+>Q#Yfn<9=DFI`3av?%GX=e_yn&?Yg^f|t zb&QpJ&rpLiB4))k-d4I_g8z|3{oH(q%ebE0theZ#DcHpUB)D5G9 zTj!vQ=4D~(-6Txw=`O}A^=Q`BBtRjr$}WOh{IVKgOw)wEwJBVpzAsg^A}6PnNJ&HH z`oidUzDyGSj>G*s_M%tNH$q&(3?l8T4z8$5+Z|lx0PUtyHY+8Jv^m1%*87~`Wu~+M zs**rx^_8{&?4Zgw;`Q;;!%wzHG{O} zp>kl_qjd+RSFRf~nv?a&Nk(B(j7)grCB0s`+f9NmZIWjmS^Pz1^!)qkYwa!D*1xTh zx;}ppJv$%?)?E!%*M+ulBwX~r`{rDYpXI49Se_qP=se3Wb0eBV@>N>iraJ*A3YMV_ z@W}2d3P}`!FTJnLjrc6IMEDha&GCb$%E-ORyT1u7T6QY(8)%or?<4-4qN0sA-_i<) zkVf$}f3xS3)V*F#AR4dT;cp_;iF)9Tr7#pmG$F=uOARSF_JMuu9)+wn*IIglv7O$E zNdb`$#XAH#5AqmlG5*3RdJ~`+ceFezI7_s`+$NGwvW@W^$fuAHv_BT`1Ko|}an;e! zD`;S&B13DLOiTMjXslO&j8rzd5w^ii;YJ;W=Fg)5(k+m^dSZL-ZtBTEM9`1`=P2)` zdV{>&IwWkrobe5H#*=xlW?Be2@P0YaJBd|#mw}$6&Mvg$bxP#%g^C9dw#qrS#4O6` zO5ZNpQCb8$Bo8%J5Qw7qNdQX6WcB;A*kZmHM2#05I=^FZ>r-&_a;Fge|nRxomVP1gO z&$(l+g1_zrY3iFMRl&;dc4aVm7pUaNtK2wCTHp8J09rhb61yj5=z-M>Cdp zo~Ip=JS6z_W1JQWmX7kwrMW5?V_iQZB_MdjLJpm2%LZ=|QiXAqa*jItT@V$}kqtu2Op1#LH zB+O7`-VvOKz={qEr9#hjJpS<&j+});OaM8(u&OM$rv*biz6SKO|I6+Eqj*qKg}&*o z{r$!_{|XSe!L$?&L%G|<>jIzG2uV@JVEWqAM6MY;$>UZy*!Qs>l441aZlvis7t*Y4 z1<&2N*1!=;M)Ya%?<8HgBR>}bT|zpff{F{0Ig*_E#7EP5ecl9T91TatI-wV8H>0f3 z2E&fUnFX5-a{rV;X&}KawlsOxGAJrm;#>c>0m{ZHhR5hmD@fGKx-J+^T;rInb`h`XU^64LgWJ{y=Gwdgid?Oo*H}+GzQ2ZabRVqJo`GJqVyCB+rsUuqw`L7*jnf0;wVonuse`~;p;xvLRd!~gBqKOh zeWQeuEm-KR?}tY>pRh6Q6c5I#1PFP3psy$7l(lt2L&L}7+-_~xeFq; zCjg+Y4aYTrRlC4)_$zAq2ya5UC|fb4%2v7OH?qL%gJ+@7D|uD~a=C84QprknBkD}! zbW+xFq0vSU@|9%|q-1ND%4&5Xy?_)x!a5o|H@-Uyy)P)$vI`OW3#2_^%hTAHB%{EP z9VZodl{$1u-=eatGK( zC&EYJKsPMLGZgWFkH>o$1yH71ok&%_@?%w0sNFQ$Q3M_!9$>Ek$tp_%Wm&zJd*fqSH6Xhs`8TNJ2+NR}p1?muZvFefa2QIJ~kCvEu>jZbVA zfFilBP%E+8&LI+*=Oexcxa3^P79_48-tm*tttl(jPezKMHH1Xf*BJ(oxEUk{amAJm zlpniJHn}$6kyhTxG~|>KJV4AmZje?|1({>BtV(IgR6Q}TtN0=ZeDW>?r7}860s~KF zers)Ct>Wb`so=p;iK~pbn-H5ty~yIQDX%>YizHoj1fezn(CYSu0lc;-nzD|-&pWQ) zk)#tFVt8Ba1_B?3*aY5Wk-j+6n`q2y{W4!pf2ux$G=Obi-|L){-y0RjA*nDSUFOAx zNWCC2gdiT4fJ1-8dLSY0BzfC)&Li)=!|+uIU{qVn_D9ZJc?HIc`=x(3KLbmJPN_R= z=(2&5={O;KrsI7`Y*ok}uUNbJ&SH@y@VVjZtZcaLJu4+F_DmqT(T}j*yKs|^M*)g$ z1aQv}S!g3&pyo14oPL&wkuiHbSar}7{;wF63Y#b7ioKMu1(5h3TM;$ZlOzdA2T*jaK6|66YY-4g1|=doDz?aU zx_qI1p__GJ(|qeJAt?BHy`Nm|N-QDAZxbW-D)Wz+tCUEGl3u=pu2nqBBDr15FV46dJa> zk>Em9=_nh-c7v{mJqzmsA*;2vq(u3ND58`GXT8HjcqEf+)N?Os3ne(TKZI zp6h6S6kR6@o;Rqm_tlbPKXv{4YHAlE=b!!CU9RjaDS~rd_RtrSjg?Tsz-+^W@Zd%F zPFT-hih|G$i-^a3?23VT&s~qZH>hF*N^(-7%5J}Ea+%nIcE;U*yP(`6eVDd||Azpo zE&d^ZlH>d8zD}bMs^7#_W$4fbADxjtw;4s?qcdmoSURACmpS}+@~IxTG%8{%AwMTp z0(>voWLUFsTNPKF73VvYz+4O(P*oa7hLK1mez`w5HF`9EKAo9vji&$w^hTEN0YcGG zF`5*r1$Z>xbqsPx@>-2hg#MsiKdEs$su;8yUnV*w1Sp+~GG`}EgVW3yir|%;P@-dD z=1)wGCGk6q*U7hw755F737v=Cix(lgO%F$_AuaV}?Vc#}D|sF?4@ervE>M?b61uMP zwz=f~tfiPm7%d`o+kA6NMCd5=dvRr!yEq5L?|u^;hJnhCErDROI|c^*bGa&jY*~rA zt*8fF;wS97eBPbznrJzLQ77!vv#`GO+ADsyzVzS{a<7?M(%DM;jatCY-fuH=KMbvh1kP|rSGs=fshPBd&7;X3Qdb08q{^h`S&6u3ky~II;C^4Rj z*}zFVTLuwb?(KlB4he@VF*HnsV1k=fndC{3dLI+|oiG#3R=zU=4>kFQj&d)NECJ%_ znr0pkwG7ZBWtVJ{k*wV=g6zfU8VZ(}Qd^F>r+{kqy37+Xd1`z5apU+Vr18Z4cgHUh zvk_vCCz~TkP$SF21jx|RyzFTQn9?JJ^OJ<_wfTWLJnje&KHgj?$Whg0{$I7>1}Fcq z%p@1>#r-E(^qHed?@f5O?)jT->>TWwbL{B;DNVz-dnPc_t8o@Ga{j0fC~{n*N7isQ zLmFGWlHm%rWX5>#DcC=gh9rKD|Kh4lXVaF>Q)5cEv}5Hnea&O;;5B?@`n4I<8gEue z<{cF+&Iy{kS7y*3!?NXlcPh0-iLSq%kRr`58ap$-U)i1F1lDII$K-yb78XYt{H>nG zwx8Mb1w-a>#9}5XPD~1d4C5l6FC}?$V62`1!klHmu&jmiyZ+WucZ!ip|3`|0&X=DS zq@&ReP19Fy*_#hKH8#>8=S~LGPcwmHmfVof4H1-aAJb)UM{Sq4U7q*PuC%VgE;6an zYdL1JRe_`AwJnfk%LS3teA*|{BQ@$YosX>Q`me1a7Ymy?lVbFMU_yC8rR=Vd!y+5c zlIPJO8=c^TMFDN;AdSvzV#$znU_Iv5TTQ5>xxacrXrZD~(V|BAE0yV)Qp3iI zkS8)i-L6c)KB4_yZ~?Ytm-^HzDtZKbOf_&rRLZ)U^F!C((%$84XQCG!`ca0?4<4U& zHC;sxTyPh=a^6akSq>%+bai1LC*8lgEjAWtD&0@S51L5 zi_fn2o&Mz^IxwUn@G`7cF8AT&NB+H7GYyM8?l{+0Aa$H+$9G}?pc($LdpR3W1C!Yh z5U_Xg7HiPtD9P5=H-P~}IFL3-sm6gO`KH+s`X{4`!a5G%YE-L7HAEbVPn z>)LO!{$vny>(7JlL&!`dDMqrz@-*gTRg)+$l)@(5h0;KtvC!wPA4El&$yWHqA8Clh z57OVl{L)YEE?QOEa82=W zyk}z^gd=U+Y*w(3J5!G+SQZvI+APU&=GX^$8dZ%k|snqA8gmt4{~DwI4H(o#cD8mRQ4M~?+i z1&q}DW`A=Q#o08a>rj5#WKtK9n!{N#mE?1%~7q#n2&SfR7nqiKu z+4IcrMck}gV)Eo&w~L6WB}b{*o2lx=3z?(#^O`|sziiC5^KEgaXI zidxtB{@Sam2KR5CFZGgdkZBu(TW-Q{=nUO&5!({+o-1s|H`-cjPb%pEY7|k<*CI*e z>`oH38%Q#Eo(9(M7k+gh!*-9W#%qQf+wNXY>Z?l_ipEmr%PW1~wk4s=V?@?& zyXEVvL}6GqM{A;(cBe<)AbufX4k8*J@k0Ie;Mk+U1Y3*#T35o1sVzwnV};KT6A`us zJr=NVni$K9;rhbac|SO|@2=S|$LEgvFtZveaPH4D3xW=Rm2D2b_<}(&JR+WDh{CIL z7H(GN$r5%T*kqTes92iZ&Y01)XFQXZ&eNE*K5<2jY_1z$jlrBWWavd+2$J|I*Kj~H%rL<`~Je@(|LEHX-p zIqjTJ!L7R;O>U?2oq*YiMcD*dlBO6?JxObcq=aR}NibtIM~>9Q=^UQHsaX47=6ec zF*yNE(sdmH`y9COxGDacMRx<9+eYsvi94-YhB-Nk`mBHV4*xCdJyH-^*()6N{-3S_ zNA_oOy#t0ll&r#`Mx7PwbIOs?6ArrRbfzDq-Er_^4X8@g>l2klMm!G`gCHR5 zpS7X+VPCF^m28~uS>JMkGEaa)@%aFrcg>lcnF@$WRY@_c3U6CCMpwCKdQBdy`qetO zKw|VG_K3YyB+0IIoWRu5qZE({@V?xL#8K`j!O4=(@ zR?1oBTEcR>NgO^IK>>3T1{sX}>M)l2{Kggn8rM^YLw9Or$$>ADC2$>nt36Y(z8cDR zA#PEhmNr^(2AywlxdZEkVxK#|Xa(Cb!@-fWip~L3(23cx^4_-_lf&u`RBjT~cl<1_ z`3!$(DgjP^oz^CpElk#|c}?r}uR*1JEg~0})=)Wvnd&159ji|uHiA^KVIrA*70j0H zTbx*%cP~8c6T+4vN~|UR4$e3qLco1D^UYB>#eh33*rY}8bKeNQB)q2cl<`g;AgPVhi2A2rD#A|TM@A{Z8z{l59z{kG1V7}`G zV#x84gQN8K839HUl(?V!!EUE=Rg3hJXk9|=eN3UkUJmh&VLtn6_#tLtB#O@*%-G6;OXaLy3(U|iVCzxcR^(U- zV)lER672kQcl1|;wBgUBmgoJd=P#fY+718jVYkzDpvW;Rl-H>Idd{}{J&HP^C#xeF zA=W453As5g9-$@dF3bt*LpX5ilk26NR1z54u~`$J&%k`d`BQr9Tm?++$pLk9Z=;MwS6+-FoLO-o;nbdU^mSP~l{?yboF z1?|7RW|kfZo4Jmb)VbpRBg9$$0KVvk-A2ToLRw%W`u^eB%4igmF@QQ6ELpRZB}N_* z2P4jhkmwpb4oXi9)hRf9j4uR3w-N470`Xpos1)eUEtyOySv%KCo^?#vHvkKW2lC~& z#l{u6dVOg?bYVt;mJF>qI|s65hpvWT7^Crk&i4Qa7qt4gH3$7lQO4?LM1rKv=0J1# z3%y|7*}#1@BBB7c4vosRmm~Xo-ZCGgBPd>4t*+4IDTk2aJ1>S71jL=xUk&{Wl6&?^ zxh569@AbdVOoyZ@;w?qi@I*_PrIU%exO&d!V<2fM>cRoaTsBcK4@MUINL`=lh`;)$uh~u|Ns^2>2&YR5VS^ZfKeFoGo(l%m8-Ff%gY1;nb3BjYB8VfE2xn(12uiL3(SF94{AP;cE5CMU(Js)gs6J|r z&tuGAVpXf{Ll#QF$02 zTIAq5d9OQnuQ_U#aH_pb6mFH6COmfS47bCT&(4fSEFJ#LuhU@|e7`^8f@WE?BWHz# z8`eIA3ARp5G1LErVGUSqn=^GB>1$PmPC<7t?KfV)T+gfzkLCc^8i1823ihi5!&U@W zjfP(Dx?^q`&`~mA(){1_?~gj$_@@;BOQ&GGXcR<-qwDUL^%Xv$|w7 zkm_sIY+gclF7>UbETi&+XWT0Cjon&h7UI~b6A~EBgW9)tD4Ut@{1i2KjUyFg(dwpn z2;i*AEjKhNGGipX$d78Cz}u5&X|GD4Xa>01%2b{gl{f4XOW<p1?n4L{4Jb|@RYZq~DCAmBT2@oU1zCUWp5Y&HR^7ctv&>th_GF`xKljg8A$H?f zQJs9dTNG5_sc4~sHv7C;XRmYNL;#BLKu|eSXXMFqD&jXgO${f)DnGnk2It-c3X-d> z46*33Jhv+&qzpDy>Svh*7oQX|`_rnpqUgMHQu5CYRH-tn=E~0NJTzs^9`5D3;fN_; zkU$HoI{ZUI;ZvW#mD;uG$lFYUk53cj&lpRW0HTG-9o9)&Uz!L!xdl$$MBz|Y3+NWjgwd;D`%%#-&`^+71J|@16xztI zwrE1eP*0GwB?RM}E5D7Z`Rr)WX@}Fz7>^B0&DdS6U+4bH2?`%Su_dSOISHjqfmzxW zTF$-{T>r5v8B$il{F4eyU&=Klb+MrDlNTV(YwG83Q6dIIFARBnUu{WI(tO1M#j1!4 z`@z6S!ITg(bDO+JN)A(S{a&);5eZ^)V+@l6(9MfOY+6#d4E1h!I1`U8lnGPFfahRJ zf!hp3Vc%yKC+6D0czQE)qE^`{Zdcg2&E7nPbLtakMfMlk+O%dwQPN`%0(C97X*9Sc zt~Uu0OiEkXa`PD*tRLME$k5)hK`|oOoDvcc6;5}-3u$am%ink`zln9Tl4vPxusKiB zh1St43%yf!X)%f2K2bFwLcWhsp~s3UnGoRy&!W!A`~1QYNnn~{U$K&QW|lM-LX9fA z@GDsX8;+cQ^3$Hu{NI2gu8*8_yQ{hbHlsQIzs9nUkhCwi^{^0aB`jMCs1-~4jlo#g z0byi*HI10l3a$W82S_BL5yO1AMq!l}Q@m6+zbG}(t^Ji42`2m}IcxZ;^DH0?);@y3 z2Pr|39y1n>)c7$aFYGLN{&H5T7wm(;l>x1xP-0&qPu;AS2%nk- zLC)N?>P%QUNp$U$c3P2-)>!C25v`6f)fs+;-`@d)7Wws{nsR)rLs!S`Gk35H)Pp}>kCd=joB-aEVp!=mY@v%qjfp;$N4ueQJ2zl)@RXRPu$CA}E zsPY2&RomRN=4wPntH63bCKtwv_bK?obrs0|B+Qb9`h87YdbJJ?z7+H|ui;h<)g~KT za<@!Xx2Y*5@Fg!;N<g`)?EvcRA6Ai%&EbT0d?%IMz#jf9f2jkpwjw4OI8V)SY~ze84IoSyISKSC!)(1Aie?i; zG)_EXVouzg_mb^)Zb0`KC6aXGq?O*dV?lq>KYV~aZp2)dFOX2}Yi_945A!=eze31Y zg%c0CWoV~t1a)i`)AmRUyG~SQ#!ak>b2&3{vIK;>?6Gl|dQ)Q@Pz>nS04oDe>|r1q z{h;8x(B1U=qA$J} z9F*@fNvLu(5Zk<&VR@k(LR*~p?#ecuo6^0z=ur=rD!^H^keDgnQdf&lj5c0O4IhT| zIq3-oVcSW8;JG!6j{z`yrhK4VzyCuBC?IH&5xX#XMg0GW-5)HuL@msW6fKFtGQa$= z9^bR0gQoe-ULcAxl8B?LSpJQ3UccC}El110BD>Bc-I*-&d5L4qxbXy=lv?JpFB-8c zOZv+g88$*tvLwhwK_edJvpPw&}5eM6j{Z*GEV?B+vpVV=L1&4-C=M&~6m%_G$ ztH_F2kM+=Ucyy_1=lw*ng|dnx!_hDB;nEH0D-hD28;M@08;;TOjPsbGT-U886 z+>(cq&uCjcFwrZ7!A8p3`Uf6E1ci^)$<)_T5Z<4(gcfybPVWb<;rHR?>W&_VykLi% zZtz|?Pi}*u7O%QEDJT0N9w0YBgiM*6wAUZ`j*EnlN%+V`0th6hNf`}zRC(zo zdgvD#dPfrJ<9inif}-g&-K`Uw$e9kROu`|y4WVJjROExa)<9LSd*(#>|)#(Re%OJy-L zWTC7XXu|lJ=f(}~hfF~Tbwc;!_*y%&QrK8C9SN_+0AGr+|Iw&#q4kCkcC#5;ZEGCG z-XTfFua!xLk2j<;&Xk+|w<#xQ>+iIExg}werr3x4N8Tr$H|DWsDEtCHeubF*?%2rH zGPb^@EuE<-nzb6(oWjnsdDzDi4@sA?Ez|~2z925%eJ6l2BobpZ5D6iHROO*okKsoh z4a&~27Pat1F_3_+$4FE;kJ1V47Glfh94nd@(VNTWICC(7Gy|gUsN3Md*PNa+Dh~)% zR7YXSwZj6|et&XHr^4X)op15?z|sFpszCmRB{W#41Gl9jvaOEw_9iY_zt-M&XF8ZUp2mVHbXLm^Ud@nz(&Y{7E?=D?>0Am=2+$DEe!G=(3L@ zaR8-PBLZF0BenEx*}$bZx|E2MQljsqGS=5jm9x!0B;=3pj z>2%_kHtjUTMATWW+$!2?HNrU64i7)5Zzs9{Z6r6{wH_6S?qW9%EA_PwvEfhk_CI`) zeV=(XKRRl-mF2kk8>A~8NhM{5);D#Tp4ZG6BIfeY!*70bhS4|NM^U8r{02rqdtxUK z$}0JNt~~0t+Cj4IpBZ;W51DqQ8>aWwpWjqEh^mg{4?3`4wrwqu2Hg4+d}y=l9=&(R z4gN0+AU`Lf7z*PsU_U`GaZu_)h>asQO}a06543N)2iPMcB~xLNcqXEZ5Te&ODO7zV z{6|j$CjBv;Bw0N%*y@Q5TtTII`;Th%T;dDdJP7xxDFs{UPEv!?ND__gc@m$YbUAux;|tq-76BB|YTLO+ zsvj8OaGqOg(wGGnZU;ZU*ne?EU8R=fevo7gv?T{$lA%UKLSME{Z)G46V{0a~!=5&g zA6=p9=lf?~js9{v0dME%ZscpI$^W#JP`*gYZsd4DzV3#|XXonapONTLjIyx9UeJ>k zoIkNlU3uv>#BDEuVsB3Zcb5vW42lFSBAuxeb3SFmgk)M@bJtKCC#AtK<|xKLo8hM& z-k4Bs<04C)2wGVv(q#-*9X>kp?(x{01Aj~h1{Wo5XF-TD)jABs+rp>#+&wqOz#%ez zRSKZm*3S3|n&2eS?6icm7A({|{vTDVIa=;5VY+ z8)K}sKOW@&nAjgjvOI1uyyW1xxfXEo$Qx=BPaPabH^ks~MSAY=;4Gej&`Cs)wWK>Z zm+5OJGgU!skweyp6K5iv=iEuExU@2n$5pBZC$Vl#=8!sNj>b!hhVbxbS^&!4>F(>3 z@-5<~R#74#)(zALFkJKkP6?!dhDH&%DHpLqO8PuQkM`{6^_t84EuSD>jEeTZzevWZHZVY|n|SiS&JY z(Ve31ZIW@hM33F;ZJmVBS3~S#wp?}=Sif^(?v7qAH9{voO6ekU$0P2t_!O;9Of8-Y z*8h49M>wofQ_Zb=KSS*hV~fjk?|qN7fK)QQdr$qzR{Si0tngDOe8PukAASg4dfbHY zTVlHb62J4*ZWy9K5@B!X-8=o^D-IGwSkPV2wFoq0YuufzKf!^ADBv3>o@WKZ3^)_y z)crY%zL{~Tn^N+lm`1HjM`zisnGYu!dQ$^9fk*c{f96>jM{+9ZhX)0c8m+^#H4eal zXTmdkwkoltc*9j|w9Z;t-K1e=d7b#!X>dkVaBL8>3Ro5*d(!7eJl&Kx*P>3~_lZR; zi?+=f0E1u@eX~2jt7NVXLZ6-t5PN9o^LkzLAf+VH;rR&$Xv#)RtER90fh^7GTcIjL z*~3O)obL^W--sG@`Vl3iV7iad?t}f71X?)p^4fmB10XVuS*w({7crH+~!H(P7u@Tbm{3aVc z?3CYh>nD<-hnF-8l4?ORBG+F1Quhk!KO6It=YOggJ*`hXfuR}tS+h9-)wcnif231@7< zx+RK|qp#t+wfdyH2RU#yBplX0rbJo>GJk$d=X-CDy8+Z7iwID!rc>{j#;_k&8`?@b z$RZAdvr3^wMC`Oh>x_SmQ*;X^**G~zkGpUzQO1CP%%=tbB>L`i0G>OX{^YDotuB(LGvP@ ziw4xOzKe0eOPBAz?3#2V)N(mtE^?sMB5NFlP>w$NLwtJc$KX=#9@6?$;64!SZB=!9 z-WFND1K6QR`r%EqYkMyuNNmv5a;XCQCE_Sx;VZQ(ImS?8$Y+f%Ky-dvpYCfP?TRHe z3aD)4)sQsY6ztFxkrdhsfJrHasZWYD`%8r~H-wZtcCR};n4X?^IJwa4hW^lo%zjgz z2F*D|UONg69$v`k=Fh{X5a#pNm2``wvH3PS=+I_19G8<v3wABgps7M%W008!kQTvzJ_SB&C2F^rY0O%8oO#yc3LMq*Qu) zTxdF2T!~^n7DUzD^&!y#Ddd7$cc{jk;XKe_>Gr~P>eMhDw+d_P<4Z_ZOQ*QM`4W1f z3H3i_JO!oJMSBt5<4-Xs*Q6@={VO1o;=_))*ybxQ^Uj!a=!UiaU1~CJM0GNn)Mq68 z@z1cHJQ@g1VQT$g$eKC1clt!Fo?KM$=amOS8`7_^Gt}>2bs%NF2d^9qp0(6+ef4Pg z7zI|F`fRXw+f>qpqJI?AKKdJc(Va9R)`Kywj}nd6H0-W*(hL_|POJi)2#)lm!GG_B zQbYU4*N9|eG?rJt+3PL?&D@6qiHy8K3kLch}9Lq}!v7_l~dr7zLGKQPD~$Y5EuPpCP*28fS_! z{{jgD_#mI(X6}cHANZm{(ha*jJxBBCkmzg>RIbh&kyh-_pJhQS5qg0)M^0}qzF+VX z{hn039vZj81{&9j=)TXbl^Ub$;kf27NK_By9hgr@9M~Plb>hM zO3C(pj%pu3tGVEZX<)I@^@p`>5T9d(epzB#NfRm_3L?uwpciq(E<3G!23HURCrc;M z)}QJ^woJ#_>HZxFQ=Xff>KNeaARnDV21Th_Wy(Sa{_)*AKZKBq5-o0lx^kjT0`B7y z6%fEE5+(;l*&CZCD-)bz_37**75Ie1HFcs^sIg5@ahYBkWDXpty7ac1k zeMloK?SUQ}8YfQcO{pZJiCMYcZU@ufp9+RX4eOX(+srvKCq+wwe2 zi1;Zw3(kgO{Rma7oo?Gkd(NSxVf@~};c}U;HhiLrgE9XNjPZ5%gUH#+g(%dkt^^(& zvhSB{nFqrx@u<<+NL#!mp&0%+fn8zh;d&NeL;aJ8g} zF~o*RMa5>;$*OE%=qk7@n%pV2=rL92aMQ^$AyBZ00PxG9x$6ysh5{&=#0HNietdsopz`)z6V#&-e5vEj|{&V&ZgUU3EKZA z{`I5)&>`o0)G_0GJaA=D*3kRvrqS>o3j5WqWEmmySGGW=(?Dz@RB+JyX+!7I+sile z30}oC%CXOOeRD9v&`(PmEb37EK~ejwd_0%8ElTn4ctura7)Vq{tuhK0QlqWC!ics} zkZTcCX95?!_}>LV((%u5kaRp7e53BikgUY-M}47D8UoM;S|*9`^Jq7_ zyh^onV%`-(ajFlVj*AJ3y0BP>Z5X4A{Fkle=rw%jhOn3fure2hQgyb4t<3SSn)XH( zdWVEfw=|O@wIXI31tRx6PrmyA>*lF@#tVAZxXdynM-L~tEuo&mXV@EW_=c8$h5B^0 zsyL9vA%7dAHmsrSy?QhneD_b<{n7Ez%k@WGCf(tG_3^3ow>lKgey};rotX_PYX|Sh z@@(QKGrwlg`_>LC>VcJm6{jk4nkxp|Ks(KPVDTeENrboO#OkPvaNT>S6X;5xv5gir z3>Yh)R~{rqXlBkYRX4wg6ANn8+0|;^8j--E34nw^RG~jf0M4yNw4}vr%+%lm7nfL;q3oas!9#>pZ z2Q7O<(8Y|x&A)(kBnsL*lcqCwg?s-9G(r9N>!_HsC#LbMLV#u)qSbcSM|~14&(250 ze`*P&7XzQkTpvDbOKc%tPm`+r=EJ=FVd(6MMrus(uLM9I*0)Ww0dlrh|K)lORP$Cj(7z~W@Zm)jd%8fxP~i0(zTdT4L4@U0H{bxFCD{Gim9LG9B-+cm z7fPR*#POW{kATqPv`NB2ty-YfO`SSbJK1S_pG41i##cjZLVNsu(|&&2s9R$t&*ph! zpVTsO(w*|6%h?_Veu7t;lBKEJM8vut!Y!}V;G-ie%z?u8L_C47)9+(=%CW+);nO?N z>+L<L)EJ7uChfOP_irACZqB*VYXQdfw9Z_m5H>CX z4A?K>JOP`J#C?%HCjkMHQ!H1DaU2U#HV#AGsYWVT3M!wzuetIfg=B`@enc>aAB5YEOvf6&Y2C0#trI4ZSUi-h5M@Tvkmwf@>YP5yR)^<)(wX6T zma!T-ywT0dMaC&4)BC2Tj3Z8~euYUKDK=L1hRr@-RSyH6L-d9FaZU&sf{?yhN`^(Kuhu6XvW@ zfaS>O4g5q2#VwqJ=n0Ug!v8U}kG0+>_MpSv&yq}PE4d^bVLAx+uSg&&5_HFB-sGM8 zQr#BPWFso1735O3;2Q%9$o`k67mtIbXxJ$xv#;wiX(z;ERTPB;zd~E9sm@+X_`pk>PoD2G z;WNWm8Iy;W=kf6=rV-o-N-wh3ETT zgn`7n$P?=taMTj(yFh)GvmMs7(Rzq*<^9t(wKa6C&cm~-H&kC|QjGYBpK>wA^hmJF z6T03PGFq`te-m0~za7DpgKPOoV} zFx7i)2g*zmL=l9(K8cR9Iagr1nrk-JmRJA($a>45INN1w7>2>!J!o(U?(PsQxHEWg zcXxLU5(pmL-JRg>PJrO<@=cz-&wKVh-><7`rfO>HzN+tD-D~ygBjk#aLfQXeY~s#b zSa{eat1Rrwu<W|_k=Zrs~l_#?7Q=sutIML05 zB>ETEaDt?!kOe!fL8)$Gk_MjNEyN^QaA_b*4(XyKPzeGI#S4$-Jcg=016RV!FV+;n z@$uIKVr@2!gzCJTm#zkHdOA}t;_QjG=t>{cOE5bo3^9L*>>PORdKn)~q8trS#1v77 zy8lRkhZL6+VP0serT7m;(<|x!!cYI3e9G4q-HrfDNvC@}00$;cV+>|48isNjS9$gY z+8<8Gjw$C~MG?ps9rUU3(MG57ZPi+Z0wgrP=a0_N*?fOZgAc+>}Ls z)o`Eoyh-+`#ievnjYOA^X3p%G&FZdsUM=<}+Ltkbr_njXHH(zme4s^3L8Uw%bZ(lh< zxOoeP=TWJ{pd09UyfZFsxWLD=vdA~*$&gkvslTdG$j3t};@2H#Z-<+#HP!uz0PTF(}y}9EeF@_)4IHi=-QB`dYjh{Ds z2y;ID_)!}-Dq8Mvy{IzxTn-cd(^0Nkq>{%U3vpoxWG@C5$3^B0-l}d>rP`ut(Mn*ts3e#c~tTuzb*gR;#-8xI>gDI#(lBwt!5Y`C$G2 zV!E24ZGnrGl|So|Iv~>BOPebpr+G)R%ovpXD}W|<5;^uGFGjh9OH6P*F(uZaez;*g zyNGBW&YFQR)oplqmAFw10n8%eMp#WT-P_3Dx~p4`La8jFO0TPn_%sYo0OD1SV(8bu zGaN7m?0x|qLzDK8(p?w=ZVVtI2Vv%j{ui}K!O?)DQ(;HPm<-wsHVWBi$lsl&emEuA znG@NlJfdIuXl|t1aT%vaJl`0-dOCWwK%+q^PjGpV2?JthxNQe9wlaH20S#q`}9>$_8 znyR9-n2-G$n70d$Ns>QAXede6<9N&_Zk;kxETXnP^nomO@Z=4?n$iP)#4pPVC!SKZ zLjRQaC%KH+kNA+t8LDyeFfzA}8Lcc64*BY6TPg8A>x60-?2X61kiFnMGv&F|$0T*X z%sZc3w8hJ(cSD}(Co|g6(>=2vxDmB&(BoW_BE%6L@+XTawWA?uweaAzgrmQA#}jK< zy~^_F=L?RHOTBr8+8bKJRFk@GQ9=QttV{!BaraC+xfn*|7zP9O6SLi4LA3F|>6UMmO+zMSX{}?KnpdFT6@pqv~Jz zm!^kop<5y@=>M@#+&qnS4-%wBX{QX-ir;$~O~J0@xI)D@`@eBXeMgIbkV(9M%j7K3 z@3?SUT3L2w4T&441q>CcPho!AhfkvHTG5b}{v=YjA6Nfoa!XxJ{Q;6Z@EdMK$Mxj3 z(J#5B8ZaZYp7`#vV1X~yQ-Og2BiG;7bLbQ-+Jve55fFa%wFvet-@QEo$is_4qb|at-LGMT z_*JKA8YM@4ZoSWX%2=uPvS?Qb=3%~O&1_-@3=C^k zs-1%9?m)S5Xy`T$?Lub`UFW-e@zLS46ja|2bQUE0^?uOe-Xa0^4|7hQZz8>AcJT##>|ga3jTT5GP0$lB1<|lDm^8! zstXI>F-($L#Pv?&;W-L-+%(&`0dY*A$)DgZ*O;x7imXZ}yxT%k1$XEY-5409l)cyy zifB@kjv&JWtKISZMNKXj6PalX@W#P{f(-7Zpg|geNOvM>;U$8wtNo~*pfy`gZQ~se z<=&3sz~*WqqULvkfO5_e7*w@RZ3bx!hEW=$b^6L%dg<7CKC>384Iz;~YHR^rS>$e_M}(BIYG{%A=;*}bP@+%mbyfu{-$YbPoJ7?rCOVlTwGND zTw19fD2uHAK}RVzNxV<$D%wd%;=I-Pn zy7qDRLbuOi@@Oz5L8D_!QdsGt$;eBd*fPLjkcWgKreRxFg@s)3Eu!(h3EUPdo)ml` z<949rV-EWleubL77`Z@4V+l5A_+Tf&xLGy9o-bjEE{LEDMN!QSci4OxX?poLUbj}- zEeE^FsivXRCfw#{gY&$%Io$Uz{rro+zib2$TuXb;b27QU7T#&RMUw+upsrRAKz7$X zG?us?+0i@5IzzC6j-Py=D6%5j9aNO7E&ibKy;HKEJ-j5dU#epKoCXJkcG{l_D+`MhIhWo)fkeYj)n>*ZnTGpW3 zFkc}-XX$rjp*T4@c#iRYukla!gnd#t7+}cuYB1sl7fTMWuH42si#Kcp^)}lF?|xN5 z+5Ye}A-9Tw{9B-EDWvpln=pI(N%f9dn5c3Szd6*PNn5<4$X3{6F}sAhsna&epdlvr zWszw!3lAO#+R+J1dl5+@>(xH+Cmlm}(DZ}>Ef~`RaBF~J!cYf~SaY87loE(RYd9iK z7j~b2$xIQ7JVhYS1Wz`gm+aI6YUXSM_Eoi1D^O)MN^U1cG>i<=rb=6piqY{ zvL%V{Kj1xl{pn@@Dx8KMAKzW2eTuRmKqZ&;*UtC9Ib|w;;rq%Rc-3LB0qMVE`JZF# z6QEusS9@6uqa10DkTvl$aVPM+L3?(UFlnmhlfJ(*0lY&zT3JNq0ila7_v}2AW7fut zZv>6!HJF#+w*5sS>p!2FEkDWM!@Wzjkhh`VNb}_0Rqe%7J0cN4*n2>P(t|(9;C{2 z)+gS`RJ8$VYXu{_Mr$-OjnOZKZ1TLuJKXM2bVs1DHj`GAj2$~DF>`?zp9D0xJAJiv z+Fb!1@Obh96;aL9?%tEB^Y@}>ak!n3vZ2#Eu4MNSMv9f~LVXPt?XB}0cUzr=z z{3n7`p&Yp2ZcKp=NBDbk@|4c>^w19#Qs)HPN0%z*pkNkljq12l(v5OK$E#j57S z_!rlJ+r`e4W?GuSbRd0t(dP8BO?Z5L5z%Yg|K+DudeMG6(cOL)`ld3vKUCg7ag1ir zhI(}Qcp7Hdpzh%|%H;VGTOBz{>#sD{9}WY=ayf5wH>6O;wG(zu${W|_JLGa$ z?X8~0R@JBVTf+U*t6>gLe#)9~VC%kDoYd!^(9>o%JcxW=^>6q#BL&JzDjaAE0>Gl= zsK(mz^?vlfLt5pOskutN#yc*sdfUZ9Q~nKWFfUslDaWT?5@%zcnQYfyjB}?uAtjG| zjJS^vD`~ddP|2&bwR8fpFt7+h;dK_>gb%%_Yd00Zj+&#zr#r!TFdsw=AWXhjU!Uu> zooUOzM}SVOxeWatdx#8uA3*kd%0*GaylpTI9ShIl4(u}IJyoU6nDhfX5B$6LIIOXv zS@#f-^7K%z9@w&8uNesBiOfwwXkO!dG0rMkv`hP;K2_gfit-m|BLVCTP#11@1H>yhtkz* z!aJpS;Vi_K4SmB%E!H1K=u5>S>ZCuFF^S6O+$oPRxT5urc|?S9;@43KD`vL#%_rHT z`?X3nsLj*qACT{@>}fQA%l6cx$_YwO5v|SaJKmsoY{r3w;(lz$>HC8RISGf>B0I|t z(rL1Gl=}6R58a(9024)&G)25ut}L)XRgep-8B4n?S0%?ADT4`0B8!v!A;RpViLNDp z`Brby$vH5*5g~*@6^nqHFkX&}ss4kcx+uq6k$h^T}29}}jg-CYFYCiq!sQm{%+)h|8--ebO4 zjfXzf20M0}hQk$BCLj?1T#Zg1`5vUKpva28rR~$xrcmN4OMv~N^5mF zt+iQqByWx}azaWopCxE^U~~9Khr7q4m<}&r0dxLxqK2fq?RUy5*U@}3LSZj@)d{)0 zU@HsM4CH=zO(k?3N=`G>5rhWMJL@D4lPqp{A{=qQ8-3#k{49vpH;@Sr;(Yuius}l{ zFSl7Qy!HTH@>|hkY+wWjIY94*x&&8T^Cv01dfyPr3mm{@k_D5~arC0<6MeN$9gYa{ zx@yKju?bgZkbuHD`Ca9@f5)rQeHuD3{mAdSyGw4E-UK$ST*aUlGkXCCt^{CD_*wJW zS0zo@gj|ZIT7*0rBW5MyIfO((&SDnHi(7PA%%)F?ogueMme*gtLcPjbE3^jje|w=a zLFA$A=H=ddgWkM{n3&8mp?OqefRUVCzhC@0Rt-2aVJ1b|Y-^Ib$47*J$zwO$M__!#AJ9j@%})PEf=rSNwJo z7uNt_=>3Re&=*WS(D~XmF792p{T66BZ(Y`(^Pg$(pQOkf^jC+1#7R*0pSFtK45U-t zCGZWF@VKrYrHgBohz&b3IhlX>p(7+1O_MNX81CT>FqOemVVM4&#?RNLC({Bez5Aqp zkKE8Xn$mK50DoH}{z;HCt#0Q|besmL0CB&q{F->BHr(vGK$EGH`ZDi8{m6WrMNgi* z-%xyX+bkg1Y$K{}DWNH3x#jXbR2&1h&B%c=rsr#BfBnA7o;$HuR!CGc(T_E1=PYj^ zkOA?T@J<5?o*+u-8Geqb9p2J`5Z3}slf&2K(MVSWE)EwAnI1UU;R)L8lxcs|q?XHQ zGTD(XF>N4vc)GplB=gTxqb+6o{zsL#^!N6}ZOSj437uHdGM_Ed#@Vl~m8d9+p zOHM+L7h1jHha&~RRSj2dnCF=xjU5Qc({t25gr<>>uWv-T?sZ_ppF0kmTwB*K*=o;W z3}0;k^q)dw&-^YDkRK*L6*^3uxeEPLgSNVsz>u4L*sl3e<*~B$k5zDk;`+kdp9flM zm1>8Z=3O2^Zek#%mhEkXPuPuQ_SyD71~GPU>E1SzI!Uo6s0p9}W56&5CeI^ubu4Bv z9SotN1sN!VN;+|JT!+Gck*f1)Ve^G2OX&T(Uhn@H2mi1?as4WLwN{Df-1~9Oz3`ga zFOC@yk-bRP=}I!U+djBc{O#>A=dDNKJGP`I<-N)@pr`@t9t`>g)Woq}@Oq9}%muTf z;QvBaO{Lxrg)Y@(qx(4{GFqhF#p@B@-Sm$W2w`J!tjH)|tgxZOW@>Y&Cdkwhjz~+s zXF-AeJfgmlo;)ZxVOSJASNYShAA1r8P}mQX{<-;sk|%VqC;M}~1|^phj`#0fnTNDR zO80vK$`gFLdO+WdC@F#FRHAYEQ-N}Yc{dQoZ-j&gQke>M{x~gOX$FYz^B5fuUrpnm znSWCC%>AA4cnj`WTH4oTZx23erNLRg5F>u12=shZSi`lwdIJ*@8>fmSuwXi2YlJvMyI=w`NGr z`5wYqF7fU=24AP`ZqjZrHMph_Mr>i3#1|?eT$jaG< zQtl0cX5D-NGgg_ThW%+P8z{PdxWowFf0b%eqleYuaa{nri3`YeYwC~YD7aEF)yT8) zgChaM;E$=?A>KvRoJ6RG#42BQ`$!di`Ac1%%>sm9{42qRpP z$lbZzSTOLH`KdY#ftn#!c94HAZb7eme6C1X6#4g5+c&dTRvXqwj01_sz=XBlJbB*% zLu>XplSl>_5mDIkWIc$AneQjIxQnEx{bdt}&%GFYvC6C=ro$B9k{R7?zb-SBSLt`( zNZj~wf6|ao*p~Xxy=}}-85{FI{ zJcom}^`Sq|p-2uX>)Dtz0K3g&m=+OpmOW{%#&$s!<;Ydj8k1gsn4HW6#`x>=HX6ht zr<^HYS_BMT;;hxJ{RY>{+$=enFdP~n7~+4AXmm)sd_rUP_zWr_9Hgi}8tK1|bQIvy zo`xht4`tE_AP#Cv&84~L7>BhKDos2Iu8hN8(3-E@_p?UXyhxYG5z-9)g6~3_AS@gNC7aseIA|rygc9055LVLRzLK_2|GG`D(||IGw5X~KI0mbRS_E8i`F-C zB?-S;sh27~95==}5V1mG3Q~bE#fXN5?^NRtsSqW02b+fs{*ylYxw=YTP7y zvAWReGs47jjo{E}AS}AShxj7hSbF<%MFCf$>Kw<#kDG{=Dv?AOkS(w!-uc5rG4@Iw z&jYupF(6&w(~!Rtd3HT~kQT@qFrr=H48wL{6t7SSTz+J?)>l6TX|?l8nPrbM_KH2f z#hH_`vc8YISFito1N77u)b5L>++}|8@2uBAooCAV~&$oAx8P^1!Xyzy5N{a0p&Bl+UyA;s(=wO1o3EqY&aqrRbDP6ZA^#W!{A?z zuWFh}D1DMf@BKHq?q?iR8v5Vyyo#5nUO(eEw;yrZ@_+w+z-m#lfL*QNjY06Tr=Phi zV%Mm{!5qK+@34_J7OLQ#{)2(OH&Mj*uL#Q%;B6SF2f4 zF0jSX{hI*PdYn;%Z;p3o%eA(E#wN=X7^{EJM7eh3mw$$ZKLgt;2w%|wmW4~rJmrk|em zBI_Z&Pii6OetWgNOYIp zRO#SRz27QPzP4&$;N5h!zk}}0wBz6biJ1TGB_}eZfg@+2mG2&DoX^CxqaJU-5t&=470M!7W;@Zdq0f#;45GxOl2rTDp%VZMkcaL#TlyZrL`p>$_R5{)H@5Az9j~VLp#Ku7ot7X4-Kyc3n6u&ye=%wtt1XQ z(U!xBpsjQTvvF(N4bH3qTS~1wb8o*dR%*hYY$eI|3@*TfchDa1q=uw!ioq1iA8m|1 z)$4Ymawy?FWXkTuc)3A;nMT}Duq_N#`z<3wjiu_2V_A4=L)U_XDS&||-VaKR8G6y;N6?9b?3hAWXqIUXvebuL2qG=a9vP4^wL z=09%+FmP6G^fN^nKhsXx z9m>L`e%}ZzGYX@olB}Nj#Op?Dt+ip1lwT6*$|*tp7$AmD+f0dNg@hhxcD*bVE7rZC z>s9q@o8hvrW_C95vneEeVA5w;;pY3d=uCRN}-PWD~xy7r# z6Fh0j{Q~}}k60y%F|7wq!}Rv2)MgNMD`k8=yN!&(Dz>F3ry5n(y`4}|c&e2v=K|4R zzusQ)-cX~$twt(f>MSuknn}*AY3Rxs@(Q}1SAZKlIm2!jQ(uq}sCL3T@!~wp0h=T9 zD`y?fWBW?i;0KOI4v0P(?v~M{3>M}ChzHKcO1}R_h&905Hmf__+yb7M3YIYkqZ@SG z^b7TBkh~ldyP&@Gko0U5DolXo1c+!(r*c*azSMA#7O(7ZpQ(GW0CKKbxxS%>M}^ns zHXPUKB_Wi&Kmt1f02(A@DjXI6eSeZte?Jv?>raw_#3JGhKQbIclptGD`0G&SPHe}X20yCq|;tw z@MT2`4oMuu;X{NI4=hsxzc&XFS$8~Q3~OvOye@`TidCrJZ#Bdg<=|i_FrIIs z8s+`T`COQAL*0U_&ZG;RxbQ#a&*(6RFSOsF=fAG2b~K9q1_L#aBO2W02cf-+JPFVFZa1scsZ>c# z>H`My&;K1IZ~@F{q=0f}B}(G|4lOaTo`92@A`;Jpl6v;=PToIH68)kd<}i#%i=?%w z0F;M@cTL+jv4FNN+xa7|^|^IGj4nljI^{Wd&phW1p6KZ)r|0<7%TnDde-(1N^SRc% zGd9sZJclehEXH(=aG5$z-d7|xH4+mk#@c8tUP-;`;v`-(3p&vTLH#riij!fgBPBLh zHhZUZnO|kp>oMG)F{a2i=MR`Q*gTM?T)R?ux#oG#TkmSEGjz)V!fi-M?JM4;;}@nl zcrAzYlCOj4KB%EK0mhSzu}x4k@6W6EeL4D~qGXb#eT_{~RhUZ}+jr`ry0Jr-Hw#{< zg}P@cVu4tqE;-!yv}X@1do`PMFt!G*)iB?55uW=+3YDS6;&ya4U`;;QoEJM7{($JZ zrKf(z4tN|8h@aShO8t?&E9D=0sbMO_N6obLey{Zh0 zX)Z?94`cCcrsKFFrD-e0+;>jQ+vRj54kG8*y?XjIqtPFJsw$fCujkb5t3@!64Jy?w z_h<0u()Ih-p2#1br%_KNYju+;dZ+J+P$4?A% zKC00~%8blWR8xB904G1X`Y0wLjb*uhNNsScrX!AU;Tq%WBD8uoo96z0@OQubPhBFN zdo5)$TCzX{){?Np4l`?5qhACY-9Vkl^q`Ib6->pz0hDopA>?K=U;NJ7BxEJ*_h3;K zSNGM{zAT$M3Z2YCDoFJTnBSxFSMJB2qJ4^1@o!R)i^dT>cSV?XldoP%)}MaB`hH9~Uy=N|y15<_dG`69g(4+EnYO(MHg2}2 z*|(2e^k$tx_;au@E}-rixy} zn5<*k6!~G*MP=27y{@m5Ny*ii|uIwPnkoD-V& z7NAz!WuhssxP#p+c#xLn8mNvM>fa{OYAEVZw}YA=zL})6R9!v}1$9gW;jy(Sc(h@- zmK0Ap#^h6Nhrfc43UsH$lpCI9X<`2mo`@YR?2R@xUW0Vg4+~LS@ab<#!TsQM&>9)s zMoA3E{H}^do9%`F;eE)iJ3o%!T0_WjkH&ikR|rwu`*(EF?ZoZ`-`8VtQqqbX7{fo5 z=>U08XFia62M@~2XQ6jm2Jn*)$W&iBi|o#HKleGu)pbK%A=@cvW&6|)_>}Ddg>!G> zkjO@8UTnTcy7twN8t^&L?LF?}uRA>L;?NOYK7C&zPTaeo4UR`arjDPTm%zi-`@QBR zaaVTqVRO?Z8W~c@6;0BSfGX8$34Gu+=|2a6$}?MtdM zh}~Uj&H>%Hy5~+0R|;dKMI5qjC7qXM)%EVKxK82x&B4~tXW4}`dN#4gW(a?%XJOJ2 z{sY_6)$rH8N=%R+lhGDgY5_Y2f3qU+Le_U6gZWlp0LSc{k_;TYZ*bM+9=fY_m41J! z@6JxS#yS7T3t(fntN}==^32R#fiQ2wI##U>Ur^iw$8!KsJFV>hk*{Cj1)4glJT%NU z{h&G)7?$`NB{!2P^8Q_JWnj>=; z$OdY18ZHi>&x<@Ay{~QZTs}WL zB5sxJ*qOa^y{>G#BY4uzji`zx=0nMOyxk0d;#z}L4;;*2uV!DE zXgci<{S%wp-X8Lf7;Xr6YZ;D?n*&_^-#isQyMXC{gAGz`0$qbQmiDZ!E`zk8TE)H^ zm)kL+*g_l2IYPj58mqmFk7_?@8>gu}AG*-w{x~W(th?=*chk>3`X#&%Q$;la##(sm|F5tKNf!%y|{*|TO)Rfin z&7(O$J}SmQddU*~Ro$Q%a}r3*G;GS<8IG~6Fq1ZUgGwQ*lA8x~kON}$$@rRP$a#*A zureFA%y_vO(#g`e)%Pl@&}r%fpn}L%gX?npmF4qMH`v#q0U4u>m||;AB~^)o&SHHx zf971L>e^?niJ(*%P7VlQd{?f%*6-DcBn2f(Q^u$sWji=vPW!MX{!csY-(59QAh`tT z7L9lTXM*GZ39MWwNVT67EDEzM`ZiC3l1Z+@;5A4;g=YUA&ELw+$~ z48iqkd45;P7(;K@ZKe2%$JBmHfK>}Hv3z-V~MG!{|ys8Pozp9Y1cO!usza5bsACaCOqCnYv#z~a4DG14t z`Cgrmr%o4F6N?aWGG8g>Y{v!-8wjWftb^0G(my&9HGIuLVWlFUW2U{@FB5{kTsu}0 zBWI9wHgg^*h+SzsyK_f3c4~tIcXKsbqmVl`wra93P>!eW;sM|o_$rnAEVJBc*KCTv zt9RK)kkcZ~WWhxNA`+zP|8PUMWSZz7Vf-?Hk8Hj489?(F2fS@|JR0N zClv;2&e~)B1TT2_-xl{68h{fY#~B8lRhi+tm1)u;bYDND6Ebz2TU?qst5%lk26zQw zsVY91P5KmfLJC?14UQ^hQJ~fYKzQFWfRH`*H=bim6 zWTEv2@|_vPN=wUh_p;x{l#^Z%ShgA+(sfo~>C-M(B*M~@@Rq_U3#X~ig|D_$drWmO zWSo+jYKh1apref`Ey&P*!w=ND-nNi5$>A-ZcOS>|sITXcP}C(69EtdU6fGxUu&?mP zCqRsstu+qeLKuDgFq04Rf{H6hgV}IX9lO8_1}XkD^e1YHo^Z?ggroq?Kf8} z(dANG>pok1h56#1E3cS0jE@NxX1P8J6$6N)Ajg}D?-im1k`YkE%~f6(U~UFl{>hJg zoxG1HTq-1l7Io{G@Hhm%?;TA&99}HpixL>zGL|0iB557afYTDR4GiW0pctv4e&PxeC!8hM0bs;@cG%fKO-7>9Bmx1Rs%c=&3@Me+YeNxqzk-Mtq#D9RL&D*vic^B z*4NnCb3>2HDOfVwPIwn`;XggmoDX6kt($NC5_mJkyOZq+$%6j|o)ct0z95NfSb}uD zd0|rH;e*h)tJ4EVHLRp@W{zR;RTt0SfK=LhEbua7biyw0u&?UHSHZ%hK=s)nLr9rw zgcLSuIJQTT&tV5H4;?w#L179O_S=D8fPRJQ!_O_4aodaOQgyU!v5dSN(3H$}MC~}X zOa&l;9*iH+f^TKIYyNUn&;(TX9O-c+yBS9fymO23kT=!lYe)iMR}#VTHB7{ zZv84m>~84~JHv{;6vc)gqvSCh3bgy~hw1Je29g<@;~mWYGu`hC9g<(^5TBfsF5Ws@ z>GK?Cly$}@GVeM!y2Vn7pWoHU8=Z?SN_qwteXmZ0!HbezE#BT$?ZJ|LkGGH;elLkW zLh~#Gl@noorT|3}cLFaX`d_&6AHvFC16VYfdDL*A8v9=v6=aD9D$o=O-hJ&tF^@lq zjG!5bmn(MAZ-thvi2Rmy#U|;G4RlZsSqzqOpx9Rna@$DqyS7eczueD53;ss%jub-P6@4`JX zw~2Ym*^)GUjd*V8{ZtsqE4BN>_IclZ*SmdOjFXd-{mX;b$!W2Ifbsj=MFI(czgFkQ z&G(>b`)<`Xv;#3@J*Hk9d}%ep!t?n#M1)bXiReGbgef(%m253498xDv>q8$2nSUTa z5E|Rc=IaMGDF`5-zNc07v^bqF5w?LDy{MTuSYUJm+XvY%2{OW@9>2B7yB)ce+E*w6 z+|Gy08!}+R3NlZcQ!5nVWmziMVf|As>`LH~&SdYhImsz$M7ytlCuhgA?X#8h z#^^P_G(7rI2IN!3a~9&Xx+p0*kaG_zH=Jilho1wRQnPl+e{z$ox9<6_H_q4dBl+CQ zJS&N^uptUL)tCk@A-+_3LE6L+EJbR`_?N~wV=+5lbFj!ml6T(yREs-XHb}n;KSa-7QJc^T3^Gg;QJ92%L)g#CwSZ7kT8wnY)^i z2Iiw|K2lqK`Dqi7I=&KY`Fot>d9nN2*4XAF4DlZU14gE(gYOFoShcF9!n{H7*kyg_ zH8oD!1Md3Z_n|8~+=aKZSL`hmi!j^kTu6hW#1)?_iM=fEsFCF|3H<-2%Kyh~eIecQ z8}!3ck5~9VFcpLZmyUeLyLOD_%qAfxEj>YzSC<;*%mnK+3Trd;xR4T+UNSChUhL0; zsZaFBw`i+X3v=);{1i@2;QFE&$Q=v`{Rb`@;;Pkun8HF$3+ir@o;#eid6&*~xB~y@o zl#|}_k?oUV{y0{Ds9~8RFD2EfA@DO82K#*+MfDTqo&R>Wj(Kk9GToGS72K`bM-+(0 zaM!^VmIJp&YjxOpG~rFMx+oZM5)`RtGt#LvAWcN9WW`XgLCR&wXBcH2b*{DxD*O#7 zZ{OV}w_(fZ7**x!P)tXdQREwLGZ4~CZv6H~nY?`*DlSAtWuo}I%E)$O3?Tf=O`#&; z$qi`z1TE+Fta9Ur)f~M|qs|gnWt>CTThzU^$&Mmlx-if&$zohG2u<6(_(D?f$0;BVL|&oy!gmrPCLdi?(Q) zzb3+dcjvB=zGsMC&|K@jBn9_+ZFMm??G&Vy{N{0!9#tYA!8=uoHAuTWGNh|pQ4#}; zN91hVZY5uY+?Anq;9n0AA#c}aFLtGJU}ZWWWaJwA`Xg>i^?vHNAUNK#mVA3X%>-lc zi;(WbDay`kRd^Xdk=lO!b#-}mklLSN%{EPm#K09Dp$}!qbIn4)nGs;JDJ9bvt2eqQ zn(Ur_*x#1O&Bub!$QwQ{i(#^KvTzTgxm0^w>mgp-5Q!jo$$np9gH-5GF9ChLx@=uY zr~-O{zfxiSzFrg=Dc8k0(Nf_Ijz-%L+J5uu)ZwOVnNcO)qr|udq3!I`PeM?`DXr=b znMWX`u3Wu1FP`X``}QdTWvUx1^<9-X+UN+9umcMd^Zqzu;+%V-&DTT~l@5 zJBE*nBYZbLmfqs%swYXLjSd?yA(HSOV)x0?$v*X_{0Xor`Z&{_&J*0&X z=skN+Thprm*S(w)Tn>qEcLmaoA?Q!chQHZDpfy`>Z9!Uv^-uXqWvcNHQle6xO_{uo;lzY)BcRW{>$gilL#4)mTmbXGvq& z7sS$l2JKK7nCl1`q;S=|5q7&Iaru5XN%w;}=7XrF-Lr~hJ3igBn$Fvs3V)#O!>3_l zzEX-k)Nyd}8Mr@?Dh8XjeIRu8K_eL&>AR5oL;A7r3OXuqqr)BlZEy3m4qc9aGjd%g1l#sJVJqlv^Zh~Sh5n&?oO)+k zt2PiV-2ph)$g+wb7T9`@33fmh&6CRR4Svezl)Plk^0@qRNY&YT`&}`x-Ce$`wB8N^ zuyAArB|CK{BlfRMdBpowB8zg=#Gvz!+u4eI89LYtB$d?8D3CZOu4PasPS|YHMQQU{ zpIjp1;z6$Lh$14gs!~fDrF-yaky>mTN!WPEYp&BS1sFCO)*#ganY|(}U1KZ9agVr8x{~E&Cy)lO3NdYR6|W{; zyfNFv8E#3Y_u^Dtp^&WW9)fa)r=(mzFwp@zBHuAr-4*^@pr$GGl{c)#$PW}Mk&Sjw z$WIL{8$(26j;jTSfC4rrJgG+F^dM*sn`UlooGu-%Uau-eDuQ(WrfAM1QbRdp;f)Hu z`fPA0@l#Ykn{Bno>WIi#`*$~;IZ+L^aHR1>yIJ{U{)}8u55fVHXr$J_ulnXo;faF( zn*!5ufZnYy#f7VLsQ>dJh!Y(IMY*i|0p62g%08Yo2`e|?TQog32|m0zChyU0GI{mx z9^uxp@gj;-D|~9KRvrc^HA4KpD!0QSgsK`;WHDxSjeIOep;C);6c1mhQ!YCcYv}y8 zk^WL&CTHmd)ox2 z8h)SKpL_@JlpLsIr|6Q6OpAXhWgD*7ucC0+Z;Kz<^H)6WJMOb!1x44`Hw!0P;BSWW z#9yq85pyF%yznPacEN|1`X{H7Q*_tHwFe2DnTzWf;?(zVs1(ZsvUvmOmJLM8%}Qom z!%uMESw4^tP2%Mo$R9o+L2<537#63?N0)p<=X4vb^4mWy>=eB!BhAaeDWS5%H2f$WX8!#V{^i*3n))K-lQ*RAqxpGI zu=If#n(j}Ozx2#Hvthn!56cR0>|iFh5$-sUuE3Kmrn@`|R6(D_Zp+oGqE=$ly^QMz z0BfEM8H#jB5@D5nC0+naOSNdBHVn8ZX30K}wC0|n;S!{Agw|e4J z59cuq_jHO48eX&4Yn9FC);7fI!Q&v5>G?qQ$JCLYwLx1(aVbDi&V`|q#UH%N1Aq5l zP{qfUM0IAMGa^@hddJhB*gP-O*9;@3;3p=Vy2S$XZ#e?y9;}ymM@#faMlTvfMx;`_x9V zr~^|uqtat&SjW(OPQ^<)Ljzgf5HY`a1Kp_&fG4`vNJ`1xtF+{9(DeFH@7Hn99jWQ6 zz!3YSo$x?5YW}~*GmY7P#)u4$wyc8O4FKzyKCdKeqj_1S8dK8bAveN_fkCf(*(ziX z&(^B#p1~I4ME?+5oTGt3%c|P36@Vr#8$(G0v+J3pG?532osc&GMCbk1=d5&*tS)iJ zcgc38Xzn);bVf3Ejt{ETJB^yXE;B1>0pjG@P~)twVEz#4TP7Q)FVt<{QV0pZG=KUT z^hZM))_+vWprd&g`HdI0DsH6aKFK(qHD#qE52@oyJG^)SwfY(v@<;GLg-sSGdNU&q zkyySfQEq`v<#E9L&Nz8|2O!4!ZxYZyU4%4k$=7TuNV%itc8BZz9cX>+o(x4}g z$;~B>yvJy}7`5B3iK)9OYE{(pGk2^+xB-TMjC@|sGq&*nE003k5VZ#dh6s3*dMRD$ z+5o~(vuqH|!`{+sY-lQ(u%`pcgdD{*QCx>#_uNF0{A-*4+h?#HpGlJMN5eVM&O2{j z`j6I6N7}18yPmS9(esw(2QFU_k^>iBQY^0?p1)o_@Ez`qQs)LVm~XkvzaeyA zeXafM@!@uwjZ$&QPW_SEpl3I>6%{0Ny*R2vQzwm7FG@39E{BgWsh2M7_<3!0Thx{J{Ggh{={1#!sVE`#X<^79-nalK-Us8F_ z`ROeW4b*s9Z*p#IeO&jgl>>Lk;^aq_s!CYO%o#9$O_b1**QL;ofdSoDiE zYxD=kXVinq<4WU`6g#m|_M)_<3+Q&yRGG-RV|}}G{9$n5W54i|xE5U>nw;u`cxK1g zv$?!q0_w2HhvZ98^kKT+N87i3g>E5W;W7$vCtEqTSNn|falc59@zT&Qdc(?$$pE_@ z9-52Lk$`;b0aPL>j(CfWeghih^DOx`mt2WipyP~Tt|8o_s?O}Ncdd`nLty$ubJ@tb)+B?A8EdxXabzKhlN09m?%1;=$Dq#7{n-s z5%JT|0rD}T=TwKwi%bh%!=|2F3z%t@zdx1QOw-0;RKUt|TG1Rf@74;-3Rba7!rTbY zp%6_36stCWf<@h*s36odRe&}S&#C>!2|$ThU5Br8^o9`sb4+EtGguYN8r21kwNkRh zAFAxk$H|ZL>dOhS_`GHEFhkXCbp`i${b-$c9jcksAsYp@Sv(pM>;#t6vS#;c-Q>@~ z55}qv3^=$H70+)r#zp>wOkk;BdJbc-wrg0vYLJpwkxIUJs6WvX4rE*}!8v8Zs*ZLM z1pByJ35oYkz@OtXGq&Wcb&ognRn5*^+gpx|yEJC&rcO{{&rewsq{>n6Gz)q*S3rYP z%MkHC zAQ!pT(`e#!4+_b1J_Rhb;wG|fw>NaeU_s~S+SZ4Sr}LG^G{879OmIAT=` zd5?50X9fO*d2w!79#mhO?2;5hDZf9LT?e4*VIwGUc~!aB4kN_UA` zl#iHbPuq)!bcVG2I_h?LDw&P|O7g@`OFE~6XV7ZM#zD60x_=^nCPs~v%|H~#$ViRs z+P+5RDTJ-RVSR7%w$c2x?roJ6sV+C{i+^GswFkyCU`c_a1j%2ZKvAFbrOsUBzeeFS zSWBnN6ES{%h`hz^yFVF5?27B8$4UmJ`x#6K%?wBa(MEML}~NkXB8+8ph1Gs`Zl z$Z9DW0tHh8e$7>o;{Gi=dizJY`OJpSfAfOQ@9I%o)8bnadd1wN2jiLb{aq)@DcDHow|@AA6sS-?wyQ8IDJgl!Je8@$3WDI z9~}fMm11%cX4l|$yHJefQ5$r58(*^=8zs$tLLT1O)Vdt!p@ih_Xiys1Mi|ZV=z`Iz z$p1iYg}u=7j($H86VyljXL*Gs^7qJ&hhPr}$BpEUo!C(uY#go8G-l=f91w>G;cg>p z^^;%!2)o$hC_-0={{sWt-HkLU%`zL5*PjGH-zov@tXh5`xUw}^D)ZCWgYw6|r3Wx_ z->VLrODa#1eHm9DzWBqG4e{{U>*<4iVmk5t+Xd1ptFu!`;a;Z>J>6{Q=%2Qvi2z@2V9-Vjlpr_dHKpXy;a8;NZN8 z6Z(@b7Egul{@_)d&wiMhcjF}F(M5PEgk?2F6;GJEZ2S- z^ImB-IuD;3E$uj#9ptN`k_OD%*UfmdCGhVEh5V-e$wzM;nN#k;un#`TsrF54c2Rt3 zcle?ct9m6;q=T`(v4aF|m&GF!m;%fHIahJjj>2!S=CY*w*qb7dhnHQ(Q8+6S(A3xn z*6sEwFv}sG0q2h=oG0OR&*l4=yS?7(dPY3`&+xpo6}2akHUUXJUTYZ(cWZSfkdkq`0 zLmZCJxQqG6F7&H4v9{y}8i;lIp?1j-RkANtGi-nN*ZXP)#HLnYy7K1~Za1k-6HC;< zL#7&suYd&B8r~yw4xm^s${KVQE%wNrcpl;bC*r7clWckCNfvXGa%1&*62@=1HS=mC zc_?ZX8u?ELk$K-c0ZmQg20v)gf%4q`fz!8)@Lqu@>;!~G$_Ppo)lkZ0GWB#KYVa7U zi{+EzaY!&x2?hQvtfop9Q;#1&y-?@u;#z24X4P=iBayt@)-uleIJvKG?;IE^kC-J$ zAUp__2ZFZ?GTaCqGg>$I%$+*GZ*;qXb?ACU3!kC1^o&TgFQ|?+ENwzW7J?yzIN`Rz_(cXV&T1t^ zn&~C`PsxJJBYZwYxT4^T>NVRDQ8ZcP8XT`9FIOLp5I-YU20!tEmshbea1Xy z4;$p-4%#8v`A@ID&zMt(&|R1%8(znW-@r(k%rc~IdLz(dHFzDv9~DE%ps_KZ%8N>3 zG<=s1XLq9h?E50g9X|{4=Wfc3vK|pvy{-Kjx2ip#iwc8+1E%Ku!qHc5<8ITc$j^mJ(i3K8hHu914j||AxtLF7FbV{@^fGAL()$2)+Fjl^xL~63)kJ&j>Ojl62=dkH6 zL~BiTL65BADK$AI`t;H_d-RxXRwAa0u%l_b6&R}iS6_rPa>;a1Us502DFfAs861uU zuYE11k?GRvu4CJQ_j3NSB%46hT?!$D7KlMQYIIvyQju4s9|F>Hg07j-RAaOB|LnF6 z;*_wOm1;ldcwb(-z94Gpd{}&^e-zu$itX;QKE2wKtBnZDy)5o9*sN;w+`udUT_s4@ zh-ItOc;A|F+EzFj)f2g)4p86Mv_H)1GsDI~xZ3(S@Fx8_C60P5hmB0gyIUH{8AIZ) zE$_eedH4wtF(}`1JLQ=_|M~?#Jf7F5<6@(Mgi)U#24vdfU%%O0GjPv;7hp&*llel% zoDBPYWjUbc?VW3z?(^E#z_Q}s4j&r(9Y)y)rIcGnY>)-$GRXty*>Ci!I>Z&RCo6?a z6xhG?9TJDB3jstKA=Gq#Kxc7Z69Z{tZn@)Crhlw)qt47Sne9F&Ik;2fhRT0ydNz}R zDBNqOD^J<|m5Qdnz}Nw?^)mJe{`sWe6%yoWz5|*Du1>q(r+2(bJ_*AdU#}dUQVDZS zb+E-VqOcafVKNFp9;~L<&d2BAlJ^)EBuehU;u=wfEJjZiEpX}krRwuTk$8MIDWSTs zwZ~2cto$rf|03EtpXpU#LoVYzGR=cA%!@JTYWJoLfTTtP`LGxO30ZKizowhjVLlv= zhN0#5+36BEx$+a15uAap;o3>N_^NsyG$&@#pJAxdu(*y8xPQVhqynXBzZmlu!M$}o z1}Jl5i$g7t0VE@YA-g5$ZiruX#pXCgEj=6hpeH2e2{L5$BjC%R*IoFb2t3d^xiYT} zyD$+|xK+6lZEs?V0M9r&M`^uTintuUf0DszkgkF)YFy z-MvlM51=fCjz)1RIdYp`vNWuhP*g0K(dqHF%9dL%RZQdpEZMV2hy&Dyc&H{d^)N8{ z>_r_3X~+yFP)M(nm0jcw(&bE<%dF>0I2Z?wy|cbs6;IYlkk0=pJJpW*{iib})9t*N zIi$+)q%N`~8XI9w0d@cqoKuR8jGU)**4?}Qt!(3#(|#FZ92}Ovs{)_mLoWj6y9v~P zKQ^ck-e@4Jj+@y%EHS028YC+Y%p!Wa{IA?F#=@?_0f>8>=L<*y! zUw0JV0(;i?z92NC^b~{C>B0tDGMPLmMAmR7auYl8~gvTRkn_eAW^j9ZjO&5#v z=9-56{i^%p%+u<{m=xpRO@gJ5dgDlQYy%&L@>k!xn++~g$X?KDErbZa|A6miqSb9R_S_TATFmbmweSz+N zM~(7#H_TvG4zt z))bPYpBi0Y%)Z7iBRC74k2+Y<0FIeWo7c4^NC>P-Z34SFD!h?OSXRXeY_aHEb3%ncdJK##??d_oJ)*!s5ld(+cM9mjWGmXVAiu~7{{c1>I5yi_UwB~joP@NxhF|KOf$S{COAr93 zEF9H8FdToKM*n&pg8J7?dWbI@5b7Pil1eeJMsW3-;<<%4Hu5=F?fhlsa<)s79 z_4AtUu90KHA~x>g#5mGsbEXNBPH=Q-@gA>7zx|`Xlas}w?fzs|_vVX1sV>9egObu^ z^n#u&ys}Fo6&fNcCwBK^SV3z-*UAVqmRX1HGl?~(UMAfakMRJiG^|SWkVNN%uUgUp zutztc+cn5?bW;F*>3vN7s4Su>RMiag);`OoCKT{^gpH2t+t?v)hmdQx}jb@(no z|GiiRg|8IxeKg6T^|5`xuO<$ifdc>evigeBW`dE`qq0Q@xOY?0O6ofmaE-MS= z(upiu%HyQJcE#$ws#@UWc=i_D`x&lFuJxsO7MHzHci_sQ3o#F|1`{<^#d0-!npVst z%*u$KRN4yBZWGB`a$AM#5q>{>;A5L*jsNQf_wMS;+>K8rV6zGA9G4EFru!NB?K#(X z^fy`d79@x9-5$ISw}Qvb{<+=BJloasAEut+i+mYpV}UQF*WseuFp60LLa(>JwrgI8 z*^j#%6Jk8TEwNjlxS;lnHk2H%8>y?m-ERm_>xaHb7p2Zl#2e%K39E037oZcFV0cG7 zA%DR$MU{i%c6@DR-S01u@EM$#v9I46^T2vw2-))_n&DX52%eA2c36<(3lSp~+~gaN zW-b~QSpn%sjg3Un(8*1(A4DI-a-mPpewKdkL|ll$-I{$(deOOXwe^bG7&@UGp;$a) z{L{0~LU4+^q{{Sqj+#sY0ZzQtiX~@}GxbB7wCy!|EJ1T@l%9s;(s5%SlvZGs9nEsL zxu;!G&4XjJMk~YW!$(o3?uakDmh)39YWki#JS>Jl;E^i{ETvUo{DmkDY_f5lrH>9F z(9v1G4vyGj;Cdz?#0Snlo?J=8;}VF6XFPnps)~vAxjNBnf9~Z&Y}{3ctgvemD~Zqz zC-YxKdY_1aj}5Y{+odV1K8;^UWuRJW5bsW-v^MB>Qdxi*bsvK)rp)66S={jG^9XDp z32+i-cLH3P2o#jyA1>tw<>i$4!0jB745=h+k%`mi6`^t(Y6s!}8x2Ab%|LF}bfRbo zn3)-vF~^iiNpMHl7iidwKIDtGhF0zof}_IS%L=7?6e>tjCrfphcfnT3H*I{t)WC*; zwdYpHCQKH-Kq>=d-g8)kqz%VoJ83FD6keJEpFVsoN4;)D2VL%wHqr9V&sfinIYT<% zAWO(`VGm%Wqt$bL8ivq(8sPuYw&m&anF$P~&{8K!=*)9b6cvyxr5vvym5#*in12Wm zgc}-O9XjB_nL3q?x}aci0FeiapB`s|mFbmme|PQBI0!5+MQttwl&bDLLoaOH-%c&c zpi|?ydDBy_ya9o@W6p@|`1aeCHO3q2EzZ?ZB$65kZ>S09Gx!BO0_p1$h`$jREQeT@V?+S@@r7$tfuWZgzUwJ148ctej% z;dk4P2MDkG&v!+op6%ktO%F#*`S__XVg?y9wTrJWw8eYEylDFGCx>0IQZ_GOn$O;U zW=G*pp}KG0g0$ogkOPH3#{Sg09AWgArY*Or|Kd5mP4)RuSq|M4XU15o!^OJ@ev>r_ zM4>?S-XlVdz#(h$B2rD=;tIen3+E<}J6tobb+1Kjh?y=REbRodyfLJKi;Q>L;=SFF zzDt<9rs$EDdtjLA{ky=S|AFlzw2?aOduO%=A!#=Vv}VWnJEHBVyZ#Z4o(*D3)cHcx z{U;*;w=3e7f24hDk|drk{#+~A93Y38GiA0%q_1L3aogh7+!3P3!aKl!tT=mapAMRC zOCYkZs!u#Y7bN5H+2T_rEi&%tHAo4t@Y>#)LIt!?*=UT+z16+Mwun>JpP=CojcHyc?tc5AOIoFoSm@ws+;zh1lQ(|=4+sYHo8yV1MP?BJ|x_W_-mst zC%K~zUfF>M3{JiI_r`ru9w|#qcjan(6SeQCkB|n_&i;9)QgxkcB5XAa4l7QIb0UFp zp2p#9-U*%kXsoVbv#05xPA4FVEuNSV~OoP0^$VEB)wBD&xCP3~7U z;~dBSkK)vmdd?2)3v|*q%iqn=LflCHZZX+lOp7ZaRE5GW@Q{ak)!Qnzs8MizQ-CjL@ zUXSx(v+PzFUv?5q+yz`VL)8f8We@%6#R5M)Ijw&EF?>fxiaG6Px7}|5-ynskvt}{% zpgSRlUG`d(6|6T>qp1%#NF!c&(iDTS{>vVwu?4+zq?>2I1f_c(P5pCa@s)4D z&6ln*__@Z2qCZizsf|NHU)pM$&>$?Ii@I4`daOw8_qJv1JLWvyVQ&x62Z>^}?g+eC z{^){R_bUc`zG8!Aas?5Gav5TXUU6Ra`6iq;6oAlYrtzR5%-R^J!9Tov%vwcmz{woK zmEH@iPvc(;3>VyIZ$jDg{BLBpP=lfCtG-=`gP*J;o{>( zwmTs{H9Pnt%c%b$vq3|OO!R-+;I6-LlXmb1Q<2-UxcWb}YzN4aq6s)H%=mZ727U8i zR*If^GNmfjGdb>bC-6~sR?-p&QuqnBB`_6@e1Ct8a}08E7XMc$r){$I=`?ENm;(dm zX6c&51^qR{qpKyO?Kxx4WU@)Qu=Y|(2oqqVGE3M%MUkC?cxwgsGzv0w3bSSA>H)nX zD8BYITR~8_hD=e;XE+HETFvhSP1`i(P$>*?7_h@{2GX;>!8V3b8u{+Oa&!YshYD>q;`TAsq2I65k++(^q}ZIt0}mJQpK|KXeEY@=Ww=Fhg(Ty`81rn0$?C}ZLFPJ{*+v!r z>u^|{K+igIGb5r%m0cb9N9Jj_M6pe~qp<@ep{x<431jgA5c}-sT2a_^zuT0i5x#R&tWV@;B|W+zpWD3}rYjO?y&cX-?&2{C#VRtO@h#6xQN2wB@Mqb3Pv z@;?3y68hK^3bAr|dYpijr&?eU$tybI9-0=>&WVZ3fKSlJQ%NfeK-16mzNWsqulYEi zO25rSc_X7I>W0F1AXdqUi^2dW9^Sv_ApeDX$bu`i_FrCedv<|E&VM{h&AF)~t(Xt~ zAbTa2OS|5^y&2Iz0SypTOFK24Fn8ipmTI(IJFxWOn^f_NZd_t4LZ&u7J1^sQg3e!Q zUbJN!*`_DiX;Nn+tdFfMq3rRd$o=Sdrno%*~Uu|(3;zn8*YDM6svpUX)u=Zi0(wCI zH{MPHegLG=;PmHt5hsJO?LMI6$Q`+GN@&Gke^YD-_Zr&%yIcpnKtLooNH*cV z;5C#q=djF-QB-vsmqsrs>)cmjZ+{I7fsbIX+Jg;Woz~(`t6h{X)B48Qb(1{ zD$FABV^zJLO~2`+@e{rySOjvP#dg@lB1LOkb&K?i3ln()@z!vr<1jrgocihW%ul%C zZ+amv;eZPX@ zJ6yl#!9Bw2aQW3c;qZfhnQC~6rsjRwrhWnHfsgU|SL_Dzb0ynoH7K|J<|A;AHG1_v ztmi9Jr&a1c6ymZ??A?Q=(3z1bAy@`zrU$G+4xrEnPNj!iyJ|I`zt47<@hRb=!rDSeeRDF*E3Yqz zqYa8eHjgf3`BO?Yg_joVqcy8&+fB}X8r@JSUZ~2ivHmF=Fi0peKC8|%Hzs7Hj*Q0b zi3`#3TAq0igFs~_byS5Lnd;Ef}X3Shx~-O?Q^U8aT_7C3=Q6*j4;3!en&h_DD_&T z<*8OEeMyc-1eTiB+#kK&MyQ^RHBCjQZHk?60L}I*;u>Xs0pgeirFyw_sDI){x!G~a zRNCD1p!1^OUz!B*7~EORHyYG=6zll|x?WGEm)SZ+m)@9%UDl6UbJM};5zxmm^YB8N z3mUk2ABaPj=ouZXoON(#lZlL$9yApwGX^w7!p^ikj#K}`C;zu5+W#8`>iN-qsi)Za zzmU%VNV!9!$SWPO2=-04LPk`9-he#{Uam`Q{T8xNS4iK5z&1DeMC>=KMYUUZz;c_U z+>E#F#W6v6{t6FQS{{%s60f#c)r)~1J#B2Z@xxve01b$e>mLUDFh8-Qv9f;3z$zYOP>waa`Luc9r?{}tGhqU+)m1dcg}B9w;{Q5 zaT_@1`N>d)0Gqm6fiNUqGgOh521ejl!Y;%vOqu~V{UBsF*7pr}-DmjR?(Ar%Hj~s_ zC8DP>&Y)_~?UWssqRZny(vOX73aOaBVc(qwC2lWcngI=lD14*`Vp&#th{c7aP&JWz zYBX?_z;%#Gj~s5X61FDAs$g0y6gd!a>VsT%!0ta;0A*UefCcG$;Vi95r6gUI_7{Rk)i+~vTY0?>k8vk$B9T*w& zPuRE;^SKz@m9PIt@4_QM}kr2mYTa}(u>Q~UYFZrS{O zg#GsSMQrUC^HI^SWb@AM@&4?cvyvE`~{~HV`A< z>y=hs(?r(DjkXtTN{uZoZ&T5%kjBgwv?$6sxB!I~v3KYYvlOJ%2nMRSTG0(pWW7fA zqXkWHAcYv-88fW>vN_#?6Lyx0-*+;k`xBQd3y20S>&Td1HlG^%n6JVTy>QFl;aQ)d z*_pu>ZR37acr$hLPmA%6!+N`cT13uW2voMw86)(i$4>#x^s7zO~ zC-1##5Kfo=Ul^(ON&AA+QPhvW{`#+_6$iimdgG$zx@;)&?fUn$r)DIY*>vns;bz40 z4=~!VVVr*4cRyq3oR$c^~3fQv6Ah%6K&OEXaCSm^Y(j_m-2ZgyQEk-RH)@>@9p5}Kw_Rpdi%(*t>JNyHEZ zoVppDa^!fP>En*0)za{+Ztmh2@MHq>0AFrXe#=GP+cLTS;?B5{2# z;grI%dvHIwy|2eRq*y1!Rc71HSg{OfpL!Cns)o=RklN0Gubi@6c|HibI_POI!vT()aX!HHuVt1Ni?NhWuqD46dYy ziXNiQr~u@mq#88K;9sm}I@N3Tf);S)lp;%Oic&!3Iuz(vt&`?n$iclbQARcb701lE z(HG?gj}HFNE6{TVI^F;eC&LCn(+_VI1gNJm44V}36t9St_m1$>{w+Aqv$T8OiO%?e zGy%TR=IZPc6z{N2NPx0i-7ofc78}l}e9!9Iz>JMM9nKyN4QZF9RKE=6lD$H`qV^Fi zH1M>&b8iDeuQn`fiA66bAFiE?CZq&|vyoEA4?G4LVy6q zyO@FqO6Q<2bb5AJ`je^5}jH9uxasweWIDc=4#=fB*9312o zM7y$AfCgWXSqU@@g93?ddv0##;yMdY8iIO&i3V6rf*-NCB;t}@YMoE`UXP!zd>uAh zbqw$6D886Bg6^(Gpq?yUNtVFh=rnP|1OiX#U40K;r;f2kY;!{9-X_`nC7PDy5bKzP z(jV7ah>8qHYQ%jyE;IFNlkf?^{vt7t+k){K(@Tqr=>>_~pgjdc=27Bwl;*Pb)33Ziu&!+j*l=*`ge z^_XJ{5!Fo8WPpbTESLOH$L&m+O1=9+AEsfCEhz};&*~-8+8YrXL3tQGJ8`n-4@+f8 zzH7K}DfPjZ8`irFE=^UU^f)D_gt3$Z#+>E)37SI1TDZ5HIeALMpqt+k`>IN!_$1a; zRU5T?_dH}U8FGJie zP{wQjAUU9nzY()rr7fy#lRCMOn9HGuzga!Dyivo7RN-Kj4#?D6vY-Ymh-xr!E`v85 zW$!h@&LX(Qe&llqDFm`g4j_Ra&K|aC$$%hQ7ExgpOd5=1wWt`_bWvD25{T%Kh{Oj8 z>1|TuagGster8{1`9!<9O2DtV#XILL4|XhA=3QJ#RWvD?U#vX{Uw=78~qtY-s0n<6}Fdah14ab@*^N$UAm1=X2SOBNHdEOz_pk~RKDhg zx}B$TGLcG8VK}tUHnfqe;z#eWUQiV|-EPiopjIiOKtPTjE%*DQk;ONn8fZP>+7FS& zCqgmPPL2xNn67vRnC$K&+vkS@DkOXs-Wl_mjk2x#=(swo&au&r7LXp!rbKuX`=#!& zk@Ylm+6CTO$?1{9%jeRox837kSKi1~WlwWd4;>Md z${P02XL(LVyZT{!TYGv74cEr>dZ2SNbHJia^GAn z(ZF~@s5{QEyZsRst?#AvkZmNJX|Qz-Y*w!9cude-{-@zf*;^j{3E8Vi0s**?tIC(} z8I}vn>Zsd?-5+Ng)lJC6yb<6&ACSJfSaUHWpt(Fl3s%dH${Zo+EB$-IqZ%yIRIZ?KLkLGBEXZjfLKO9TZ zu^kOaF}aG#qbGLudzMPj^;b9hdH6S?<=vf3)mK3Hz1iidL@Tx{Y9(7 zfCfp|rLo<=H0X7h_wJdXdm&$}9AcPwtdbLwT&o!f%2fgFhnu8;1WTrAMDWF5j+2ks zPR+4=q;NR?E~0d0 z`F>%(a@;_Q#3(aSnqE~uB8-G9)F15hG-|_vW!b`wZOC-oi!<^;_kV85JMJHnuXuT9 zGbC9YSZ2ZG^RKV3wdBcKW?jOcchZ@CAJZg614IfPoPW@{8SG`Wt4PQLvu?zyDPif| zO-+CBwPF3>9lAd`jgvDr8k201v2951D@PbzZ*!4683 zzr>DmYdUOL9^HxGju>>SpJi?6-RZ!48{_~*8U|b@2L9q99;BQjjpRQu!^fXtjw6kg zu7mEEqJ;HlA&r}!7Q>RMR%V@YHE!5A1HV1cofhpb3Ev<3>mWUvIXoj|@oxf^zYpyE zX%kT&T}q?gk}+!0;e+eScv%KE z>nk|sU^I@%OZRnDAomltzCl8w5{Co=}e>SZXNc%#$52t0#pnxex1w3i!RwI1#5 zX^3B_TwK`@!-;ri(*0sXAtL2o9_~CZ#LvlK zG;S8;VGKE#e3&o6itFGok7h&oe`R3(u|a&x*KMA-_-z+uldqAZ&BtIpZk^DUwt^`7&o`+qvMw0< z=V!RR5SjB|(GkI2==5_bP-=S|X>Ll8Qe1jNtM z-GmF9h&LhB_-pG$i!hA@$%qIm*Fd~lMuQQ|@uM3}2KG{m^moIf8^@F0Gofoxu1c3D znBloqJj>53m<`sV5Nw}SrfYPlYUPM&V z&FIyg3j+w*_L@3{tP1b+?wf%bo!7_uiAnwWsS`{1;RDYdkwyJtG|?xxEtv!8YzYQ^ zQpt~)u3WHmYW_Kti!~EY!Az9)aD5?tm+AS z1L=RG_M(WQ*^Fb!zsj0u;Sj3&^G0_DTW%YL%H7ow&sSX)~0qk1@M8XSg?1 zL(0%$R0OqB9L&fxudct+^Y03N`uhnBlcEws6u#Ynh_*W*Dk`j8pkM7#7PP=O4N_9j zM_2#=f=#@Ks+HByV8f~}-);K3Ygd$hAc&|;)gojrtQZPn6Rk9`g(`JYrHtQ8nJ->0 zF#^u6Y#~pUvPGIjj(Jv5xtD%w)G6XldTlf6D(w;38;sJNUMg?$wg8^1rDwDOJ_jKL zIpo;>+j^{lBnHB@@*3i7#0Ps3S|;M0Ab)wKuG#VyH#QV~OuHcz#ANJ+JCdsWtR^$; zvI)Mwpj04QRX3Iv)VGRISVaZ&%A|sCt&Iy?s?$E5&@ev7!iqUd+1ijr%B_$`gRqQrGOFhXsD}~uHHS$FIY3AF;G>uzd!ID&q|TxpPv))y4j6% zqRY7!BvVQlAgK2fv;xY)+=%W~xq#es5;_W8yA_XJmtsyQ3$BUrIV8O>zOG^WDE`ZX z!*6PsO)1F!cfT%`p4%)_6_`py9h!*TcB+>;py{>(xTnJ>folP87VO&ahLerRqlBRm1Cdo2nV#!pE*PRpYe2Jn^V}Hy5p_ z-pR6>N3&Cld*)%$PO`@M#_LKq%j1e9UpRi~azrrQf)PyZfXD0B(mtf4IXV}NQysU0 zv1}M|X{+~R7qiUv>G)8@x+zanr+egsud}*RTVrd5#sUL!qWHd6JNl&w6&v|AFBiAw z+kMwC^+HB?HM$IjOYMfcq1J)z(9ZeqQ8;7ZIK!M79=NR{-XC_m%UiZ0x;-TU^Y=JA zmnee{OPFdhXC|81#hIg%7ROeRXz0&l;;Ym?082=|~s$Q_|aj?VikxWxJ;h7Sqy1aw5a9p52h4N;0Qh2M9M(BJsQCZ=(m)%qEw5R2D^8|}Uk)^8 z6(}(x_{q116&NJ4R;V4-AdY0NDJpb?1E__Y1UiZH)?c3I?HiI;sJ2Pm9~^m3 zFt-mU%0^lU7OFGLM6YBFI+D|fi}U%DGe79v{V+f)RT`hg#gJvGQ~mXwumY9IY1k;W z^gDqq=I{{DN|wSxn~*3?bt)ZUp7J$(m@ylsNIYJ}9rXh6mobg%B_T#A&Pq#sAM2;K3WPdG;{fE|jN8B()n-k@kBhLa@AJM6Y z_rsK+js}x51hBm=^p*4Euo^1i6vvegnCi;x!)g$_A)0rFhMe%w8rfp>G3eA?T~Jt! z@(c!@m~B7#gK{MJ^KIlWB$Q(LYy6-}e~jp3=Q;A2aZV2d5uXpbWXIkxq>Zygj)vZB<6XkaD$*II>oKi#)cRaU_;1Z(6rZa=n}S&%veng& z)epvwi#CE4Qz6zb@jqZNR#wmen(;he5U9e!uQ$!g>QI525)5rrB69eS7sta#(;s&j z*>pWJUL3o0Why=?1iS|&5;vj3r(-G~v=Q20L;X}+h0E1}(ScO-KP}FnT)2JQi14R; zVyy5CG50k-rphe>ysEsCqi)y+*a#S8ztPo6%GzWbSxU)#or)Eo%ax2&qa!l->ag;lF!ie5jvb0vRH{naxj zV*ht$^(ykbVpKzD*f2|T=)90WMb=Y;L&#_{NXuhpbMED;p)epmv7E4fx%Uj6GB(rF z8ZDLsQ@IElf_CCTATek|uOeAIPWlz#HcOMm%K4m3iKq7+?&+eklB6(uvH=;qz_F7% z2tCt~tQNDx*Ml;xvU3sV|D)=wqT=eZZUYnq0)fIE3U_xWxVr^+cXx;2?gU71cXxMp zcXxNWeBJ%`==*x!s>V5c&o$Q+{&cHL#UdQbM^p(?;BO-_pcZYim@&W1o)s-i;`r8S z@$6<%3a>VeaHyi@SS*r7Z23aS8$5gT8z%D)Z`64$f@c^^KlRAB?PiKtF|}MZdv17D z#rvRGTl}c~|Nd5@MqO^-;>HCzc&*k&==y)4MO6$lH?~Nl?|_ql0tXt#;N8 z0+5m5yoc}Z>(a%_gy0Z!Up zP=J~wb*EODu|cNHoDchj?%Gk9?y1}M@Gh^HhGQcaxU6IHB)=NEM3F*q<_5}cqpbyS zaD%>JZ;D&zq{}DvR*@4-`o93;ja|i^h$12D6b^W}i^qv~-JI|Q#oqS&a?~$)REqTd z=)6$^QwQ-Y5%J#N8Q^?&U8MjjWp~;SbM|cCY$_aQE*PeWk!8jyua>g(ZfcNLJ`HCU z1Q=d!aH}5QAA#i4%1T0!rIGqhuyW72oMU_{tB%@X5;u`K=B*$-!97j7cC1pNL4!TxEB@{X^aYj68Ce;MrC zpdiSF>D+nJcXa9*WgmS}P9|4a0F)u4vCZhGo3LI5lUiXIn=cHCmjHgOPXDbN5=ZtYUN#4H z-!#FZuL!ogYk$OPZ)|6O3p5#Z~Nb*sBx^+mfoIqHRpsu`FWj&!7 z;b^a_Nv3NI@57R;^Z3iBDTQIV@jTIx^qM%|l&g|@S465JuKnp$V3;;A^E>#Hq>p6! zzy@!6Khfmz`5deKN!Ra3(n|+Uf6|Warm(lP#j6;sgHj!f8<_3bb~FeW755AU>|bId zc%)48PTuPk?2vyS!cKj7I78l(iz4IqL`^;JppW7jEEL_}Ek<(NCylxgVroGn8kaiaf#ndB!9)DepuvhZx47G?2jN&rythkaTIHjFF#i z^cxgfNvU-o9|Sajhi|3+E8bzhAkE5j%ypmvp` z1R;z9Zep7H%Zm+LX0Hbo=fx&a52m%mjn61p$BUO3`<@r}GfS8yMI{~Dctabaol)2zD)m=St}P|{jUE?i(9s02 z|2IV?p)Cav$>#7^}?Fg*KWouC2Ex%%lt1$)QcMCG?qPnT}D;S(t&vj zwCR8Hr$FT=QruT#fv9&-8^|FBlty}RQ?yf=^cS>B$tNML;MFv3^2fj{CH@en*GW5| z(Nz^7@hVn*l}W<+o~Zu7?+cybWi=AAkmH1bYn<&y4!UA@yb*&(b+!=3t6M0(%nm#D zT%)0X>s0RzSgsSu8zYGwOOo;2ntV^aU@w~6pQwG7=1EIqjW2auCFH)T9)<*Mll!VH zW!yKSx)zl@U&=Fe>`1BX;`J|NeM^~ zYCDLdBqVE$gblS7giC2!#J%Q=hd`!*;>%>YMf`RwidipXKp>C|OB@cTII9Ye>u$;kLoB8hpu8>LYu(Y43aKlE zkx)GJY9-(>0RL52h!{yfLZFjxYJNm39ap3_Z|BX&X~FAHty^6P$M}x|vkoB*oyTsS z#$hza{ahi937!vuNkYJMCdWv!EC?w~1P#(p7}T{ql_NN8X`PXmocZ()x|;jm5Q`~0 zVPvE`TbF;v!4^qL6!o1D*z&ljn?Ja;06oYx5#xD_$7tx1JtO?};K@WrgK{@viWN7! z{D68FA?-EHC}N4viPPkEetzgGwZsgEexy!cR=qU9O6nK;lel$ilMXmPXQ zce04ObR;pmboi_=Kg(x2;5~#p?VG{cD56H9!v?;c5)RV8fbmE)f7v=eu=+593!g6; z>S@lFkevmwVSadfh}dWzA?{oH)bX68A!~&kXIA$0Jm6jz*1^4?;j38%Yi0L~f#u4a z3oDr$9a^^~7DCzFUOO5)C`YUf8bjK%t%zf>eJ6d~#GLuk6ACk8!En<<_*)BE4o%%J)lnJe-FA z>oOFHJ!El>*TlS$1VN*|4{QhlWUx4QtDoA>hL%!s0`L%$dzl5l>%^`Nc_l-VY zwQqZ^iHyp$%&C9njL|PK|1M6ta?FY`F{lEea9tD*^%E;`ts9bp=>(c1?yAp3_uX#@ zQ!r~21DGKm(z+fdH{UpHYkEUE&v0demrY2(PnGj` zitxwiEQy75fcu#eZ0dy(s)NIt{cFJBPe3F`Q88^$8Q^c_$0D2y0h3FZn13}IF?Prm zJ5#-)4RKo)dz8p4Nf>a-3t$$*X237#_U0*40%{i8BGI`(m+H4Rvw}5ze~IbaaeF;ROGS$}PH3Q$bAAK-9{bUo zI6|l{jcSNi-^201rCH8fXIwer<&hQf+wY5q^tf6Se|pvf2ka)bt4fzc*O$QS^E8I+5GTfD?1#NYZuKc^LPI(Nh)^~XeodGy7IUc!aHKC#>BD( z=gVf^O=r`5w`z1M{9k~j(Qp0Sp3yFf0Y><-DTb2x1{IVPNO{{>?Fi0A>SlBj#y2OX zi7=Iq0eVnTWr7%1?34w)1D<(*j8G>OWed7^lNBQeo-0{Tt7^$$@@a|d7CSG1-lal- z8EDG}Hpv9;@;L2^*igT(KJk}og|&M!5mPxCUgz$N0~faVjfw;4rwJH;`3s~RS*hPN zvy&ndDld@E=}x|b+2lR1;I&-badWlc=S(c}wxQVGZY|cDGrm$g%U&1%%864X5xtKY z^QKr0Z@VAR5oyp|V99q#;&gr`9%5|q4y!eV#^G~cM0)y%M@U|KM~+3@aIV(Y&*xCwdwB%8qC9Mru^b8i!YPAaayv=nuC$7*Q zZaZ7g%IU773n#vsyVfq-GM#U}R$|8u)kgdFnMveb@6t@&!$xyT8R$nG|Za_INgwU*b4fSoZ8zSDw^Q;S#SZ*Ju>_7m^?CJA}Fx1vLmGm54 zG$7*#A<%!(eX_HmO$>D@ z_ujFD?r6Lhs6nA@(;b|QrjgAGoT+U~MBu`>7zT+BAkhG;O-_=u4jI+njGy2?AMy@KAy(D8GRgKB1l+ERm{ z3+{i;81CGMe&S05zFyD!Q}2Ik-7`;h26~#hGCx%J3&}gqUzb zNnc;WIf_iNtu?CHbG>qgj0ghLnwE;<@1g|1bQf$@#)we?ZR_W&JNI^1svsaS_^BvO z*Tmn5UtaKrIXEakiT?#O{^2Pb2|&=5t8$2L|Kck;$-q}uKvdmdG{FV!k>ayjT^GI} zCW(Rjc>|C_0TlKT=1wse?1OwMrzA$4KQe=dp)P4q_AQ&ZVB2aYH^^Xrt`TMBJG*edf?vJUN~2+ zUFDYm5YUehZY?pnyn7(m1A%J~&e9`=afkB~JV6qhx8!f$)`V`d^?uBrAg?chUMoY- zXCDsE^2H7L5Na)TsAC-OGnk7&eD^U{9s@dPTAwhczsYN5WnD(+{W_WaSICz_D!_sLFtEmN{KDSRF@#n2CWwU{}E5tvn$0kbd z>cB=Xya9QoTr`CXTO(@@^*%mIN9QM2QZHJm2{=NFVVbm^@kG*Z+${_nUtK!%C93DD2jS1HOeIE zF`b^1uAm9EUk7d??|E<-RD^?;FGX{OlY*y<73x5_hiZs{5ZkKFLDN09}2iD4au)onX!x|@A+y~s`B7;b12&zA}pOIXE!W* z*|f!9FL{g7fXf$1{fgFF(NH_3!2z%Ec{};+1~2L}__GDb)}sg}z~*_*5G_5A!b6Gb z(%YhaPDKF!HUF&~7h&X}TgsPYA}()1IeRJnD>q*Yuw2B?d_h;`KszIzj|_k3Orck z=?s7J{FthBUM<9auk0r2_rN>{duAo_wf!{UDG@zkUqgg|9e!S?+PjQO7C7D+e+{wtj46l2BGE=q(Wwq8 zzMmKT`3+({NP6HI=WFXGqx1HiB1Fee;>>Ub{j+vv*9eYg+$G$`67nebmP%DiGEyN7 zsqbSvK9z=CzgCo|tmBPhe*{8$e92@=x^_p0||1-{-!<82T_tk2U_Ae8HU7iH}@(L7fb zdVx8E)amdND$@SsbH(a#{L}|FENXtx{Z`=s?qug$zJEDg|3U6o6#<72tnU%iZH*r- zS7>X+{e!h;5*lo$L7Dh#EQL=8p=L;ivE zemMFpjvB=&e`K`&$q?2Y308Z#T5U>BTz`n?e^c7KE1+2L`K}0-x{1Y7dW6*AK=0Z= z4dWSp!cq*qT~fF@FAzlm)aAM%_T*e@7)Mw#YC6Shtlt=52GbufWQ5o*MFW>jPly;% zDsje@f8wIc7~jrRAt#*|E@02eK4u3vJCi-+U@YXb)Bb0bIuh=yCak{hK*fyw@0E)m zG?6X_X-GM}yovN8iCJDuJx2Y>9ag=fQZcqtwOXS`Xr;eG=*yN)427!NUx}fOUC9{x zka{!-u*}?&&PqSB(N>_|9Ckcb@Rg9O$2M2HiJVa{(yf8b3#7Wo+JwT}Fs#zrTE6*^ z*R~CVoF*&9nM1z}$C~i!W$o@spA{GhH%w9;8Ea?4DAHgBDO192*w^^$*>ogVH&PqE z*wHxS;0x&al60@Lhy5@fzt0py*3@1cyr1p{ziQi{Wy-6AQicLGmVQU|HU7{K2lins zD{D$4&o6ON{3XP)=raH)%}NxL_KPWF(4Q$_%3t@BaKIbn!GA?d&gya)YrlUE+&cV? zgnyH0Ok6_uGgvjP=ZsY|1r)V-U{Be%d{M4c4I|hN3QQ}Fl*kh*!FHlNe`K4j(ZiU# zp%0-JpvVfA(tgGziN7%DNwBk;lwU09 zPY=Kw?{yz+i3Q*KsM%K5D62D>%_bQzk!a`A^Umh7? zJ_MQw>vWl8f9tdJ`?RzxnZrW_R&t)5h{`kFnrxhMN<84=EzVs^MV3ILXjUjZjUtGz zEafgI-WYbT=V+&|_Lt23*rZe99!%n-Y4N_{b^~8=%f>g~U`VZgil{rUApMl(?dw75 zcE5X~cV#$$A?x0mtITXCND&vUfBAV87`nippah$%m|J|^X*Yueah{#!Q)qku86zLD zoumkj*5KBpuheAc6}t0+43-WpDZiZ{ZN$*T%7wFNDlxWuROYhwL+8yqGhyJPpM(>3 zBfduG6uX?{fyceu$8`;o6R9xmhSvma^ZX~|1SAA-*aJBySO2;ssY9^ zW`ffuk5py+#Ld~6PXyluleBb~{Cu%C4Ua3=9$j~M)th2@%2i+KCY5OVwO{Q<>Ok*t^ytpz?UB0==miTP{Pl&a!(5^(E?hj~N*)sv zbC2h%x_8v;d&f&WSkrmig9$~3_^0|)(*T#NvPve5n&_LI%bM|@xIrNFDZw9tFXQ{x z2A_GR8j-f=9Hi~bp7#vT@v^Vp2UxBLZ5R32Hf<$>o^u?PzSyh`-QZz(&4Zpahv^f+ z>lKH#cEA|=tn{*0{=Lz&-rLMq(F1}fvFQn&Shl`)9wF?TNguSJ*}qX| zTVk;jj~|jrwmQSg7jdimF|Gl5o?=KzQSATtBgr5^)?iH=Xh3t+2b#qS`ocGYwQR^L zpR;`9KpiVKqvM5d*K~W&G%tzWr;qAjDL$=7)fVpNxOZ%1p1|R&9~q(kMI@WZ%Bxij zql~fjbV24u>!vaf<9*?UWpV@RtJ?qWRC2u6AmQ4*DBN4`ciTXt3_v}jZzW2N`w7DP z3+`8NnDC5qzImt23vtz;qDju3)p0Nc?BZO-@6MJAC6b<7f72=mx#266D-<|C-Tf(F z_6yE#b|uq>s926khIgx7WtEE_r!kAsD-^uY!33|?%}sA=qSG{ys!+jcV<0&S zs40}@rCNL3H$J2|wW(3d@M@ZrAJ6Z`6U~-Sp_{-}6q(8XgB|`E-QtLVou%DzM8vcI z!4IF$K9kG3F2_^#J#yK;3q=j0D<~B`;2{J+hYyu148c{c$x2%w-8d9gN*Z+2Hq?R- zba66y=UC!|6BELG_TF^L$hG8INx}6~;L;JjPX>y+^jhMj5B6dJo{nvxUo0H^k6EV z)!UNS*kc3q`&?}UB4Kf&IrMbwQmXwEl5Wj-=+&%Qba>%XEFq>_Tvg0$cNQV`t@ZNx z85yUVhNfVGW+{HOlFZ;5*zfd^7lR`WAqBf~o&N#^%|jPEQQn!3>GhMl*9=RfI&_&^ zSt`9S$6VvLfV$Q2YnrZuHZo~fg2lsowwW2@i72g{47U@iiUKZex5fg%MK42>)9JDz z#1o-G6>xENIe&s^`uyUp#AgZd_4bJD@bRu98^%At`53B7-q&vNsK(^5H#FXHCzR+1 zGsQ9xnwlFNiu7H(xc7+KyE?7mw#o5{&}hCQG{*W2=5N+ZYF2JtsX$_|c%MW7-rIV- z<5o9h^T#_KeBxcE$GXrjc>HX^uL$ZF=s%)ZP>Q|0I$>dw)|n5Fty8s|ZTq^9yYohr z0&WhLkH3|nTqj5s)>f(f5qx|S=ZahsIduATgI>Jw3KeL3v0)yu@DYku!~0l-?0)}8 zqScCul6TJnek8f^_u6TJ782?ehudMFgVXy}eOThW9!2u6=@*GWac@-L#%!1@=)!$g zdAIaW$p*AWFO%p0hcxyu@gD;VwWPl;iE08*;Cn99);jV=u*t-dn*ru~_&fq86BlJQ z41TCM4|Vx~>K3T{EwUN}jQNVeEIx2b9@SGV?907X!=>CSDy33Y<1^u zjj(T*5xSOnxmmNNJ-y0PDgX9{%YNLx=X@Cnp9 zhtt`mOqn-Oh(E4lH1hx~jMyQ<(4e9EQLcZL@>QNOq}-h^gjW!{f5J&pA`wsftL~7y z1ZWl7;+`{A5}n7KPg?MV|CS|Va+R;ZFEF%08h}vNh!Sx6%4<>JZ9hs44n&iz!Jb%r z3;UeT{!5QS16o1!ItUzeNMVfseXOPc7!EN`5Hn<8Ad^>5H2Vrm;7pn9%r$Vz{ZbJR z9nPPvJg_@N?@!q>-q`V32sMr+9%GHEbZl_tY>`eTW}nJET>qIcCbiiXkE9C6LX*hDOof3^=aMJ@CEe@$-Sho%OlEM4Ud{^mFN#(LLw4{OH%!wQ}WXTt4w? zZVe>pg(zWT5Om{bqSn04hs*73yzDf3$0KAjCR9v|I!H@;7TQ(jXow8I;rMlV<7F@O zIIJ7o&q#Pv;d`&DQP8pRi$^bMm)q7UX7kymojJw~_g;Wtq&Nn9hGyhcFx)T1d%mv& zlh{$((UB)+1${pRh$+*H_vAE+&2QHRI!t0Uxi32x#3H^u2CI;# zk2R_Sn~6Up0t z6h#W=8X?4Ep2XqMgf8#QZR%3N1&ftK+iv#l)ZtG$9O2hQsb+o9YPqBA>>F1Va6b+T zs}llJUd?%?a6lbcdHM=dR}>rd!d2o`#bbcMnYaY$paT#*yH3+8vY+3Po# zL?!%nWv`oMdAXOqT`tbd{f}h(NrnPwVmM}MI`mC!X~ABdPcn%G?<)uUvVQtq+IaQS8wc~8 z8^r%*0g#y6FGyg|tm$lHQwFoMVA9(8d2hahcLTf)9BPWC8g9oI;Ci(51U7 zdV`Q?7w+Go(CO<&Yo9Me`$c8~Z!(44C4-oR!yMaK5fSGl z^dRGzOd;SgSjs}%p~$EeQpBlU4%kZ_62|uViBWQ@=QD5^QbxOD8_zgNU5Ld6XMuW` zN4_GK?m{4pPqV%c@CLD0)d{GTSGg&-zAiw_fGcw?&3>9}=HhZ4!j7j5?DHg;+wj7-{J5PV9Qm7dvAV{)<6<6C-+WKLr!GD(o4q9d3cRW<|zpj zh`3g`tFk=3b+jvFpJlY3Ts4_QVW_+BvD(jdnHWXojz$r$|7syZu|>6PPsM!`KqI%NdO>;(2%O;S zuX9=rSlqI-r3(_(sj9DeOn`*qllEZTjd_URS~0f7q(aq(zG z%|!9CN8iGB+{!=K@Vx=@bQ68^Vwws7^GbLg*T0f*sH$I<`@#U#MupXSB@i7;3$1$q ziY5F4^K1IP>5^LIQnlC)I<0o8WLj-P(ta%AD5v9DC&z&dmpITs+6xJ=_zNpc(vsyQ z8{RX#*Rf*O@zKZq%0;dJOfP*1BVtTvXJaS~8j0s*I*48bxKmnULO^T%#Qdq=QZH%5-SrV-kDJm^w6cZ>dMy3v2k2*X21 z@_Wte$Q#?S(Ggq95KwhyEn6dkG_JP8S7aZ#7_j=`U57vMY?`5rd_tne#4tQ@X^TCR zAkMgLfkIarudw(>#F(MI>_)JiNW`MUr55wiKdHbPy(q^0hyhSNeK_j!9u}6Ir9(Uw zRN4+Sjn`pF?W(0HtMnuCZXAPq#e!O&lJK7vml7k_ZAS}Kn-QQsolwT+t2xd(I#WFGkBtZ#*EqSTz2^`Q$aPdJcrKJ8pR%u5>d*8 zNMj#4evBg|GgZ%j4|%w=yknB)_a#i0`wlL34|g%!V%ERo7lQ%Po04XM`CL{R*GrC+ zWaZX_RN9zUTp~E8H)-_QP2f0k7!-aoBlviFZhw_7(b%|1q0ylu>IOkrTK%lGxpK#G zxI4I?HURBd{zQ85kENm_XpiALU{%D{BNhODBLYel>*-*OyzG$tmQW$ z{_Tau91rxMd{epAP7Aqysm>HN= zAkICPBDbX&=0f~}?5KF*^*dq&)X}`mF}nM6NGMEdbw<$tETbVm{0X#MG)rKJjT_r50>7q2okFbn2~_bz^wiYvza&*bQBoEmzS)BH8t)|5 zBum!#YmbWv^TKUh;z3OI382DJDJXv$$w{PdY`?I>^q^bcIkx9FPvlzCPJ)hBRoD>y zVT=)Gcn1_gBhHYTD-)I%teFA!tt$VgT9VKWXs|fqz!X({9z`5_W1vj*|p$L{ENSXPftj#!%aA z`^4T&-vnQl0prlEo#N=1+p;l-ghAsU!v_}}Rz36*wR*rH$wp?0ZeWxf*sw5M*4(5* z$ir1id2q&uwo_Z;aoLXE1eNc<@zcrw;wLh3ixWuqi4`3dIg;{X$4fCTfs@W3v4}qb z{fIhC{u`b>;?Dygk6Dv^Zv`KLncmlS&F}ddMPa^Rdb!-e0tkG!f9B>|)}NB-n^C-= z0feFaxUnr0Ny^Pi_}2EemydTzrw8L5VySl)`{kkn)*VLc9v3Sxe}8a~^vEE%UxD{s z?KoltS4cPqST{ljs#P>4dcPlR7(nW6Iwe!3Ye4L(nT&IbzG5e>KfEIVvD5I_ZG9P! znDb^Rs^>KfeRfv$-a=k&5$WOL+uz#oC&}K|@SQl@Z^m21EHI=vMx|ukaU7>_Rkz~pM&#%l9Atfqn8QpZM%p=Or?Lm`E<~Oc{Rj66umK9 zOSPS5FT=u;&z_!3S%L9c#Lm#Pe!W%e7mrMCitXl`brjS7pg(dMC~w?T`)-U~6kn0a z&BaPUziH&IJ6Q~KfrI3DJPJ3Oqc1K(A4R4|k-`n;hpIyh?|oJQ&JtKhY73UWvm|+1 z{#M|~o%Lrfl>KZ)nyHS#lgZ@S(>RFygYcX&mI}aKRcmu%Lx8-+k>TlD^;i=4N(_4+ zf0*!N{)H2qlf{o+7(ljPC-+cA*d2i9mU-pd*VOD=&*(VnANthG+rD<;SxGO?mXIdw zIKxHtFy)K+_5Pqyjg9wj;7lhF-Iv$w!d%es@B8}S+qo`QfiA{0%BsH zrC@--g_5oKZ8#(yng^bvo7)iczo5!Oy1J_eDG3&_g%c%;@VX#5T9TwifjWkX4L}pc+dM@*zy9z?5_lJ^Hkh#k2E23pI3y^fn}z553^f@B zl`7{e#Mvh6aVa7!KE(_F_U8TT>;icLf;Do2>B0}?|9iN-fcr6v6%>0|63W<@Kt;G+ zLjtinyQb*Vl)yM-ErkM^aBm2U(|o}uqxLXj<)#5Ipcvh~{y5z$Ktw!wIGKPt$hoj* zb3GMku)J&}8jcYmx3a4`j&yd0LMnx#hNM35=`MG{LZ&2HmQh@uJg;u7~6Sq2E zA)(qvQ`n^_%pWVQ9#tSBQ*0pl2kR+nb6^CzO z^j--5@MqaQPMZ_%Tf6dyL6a0p!|^kuv{2p_u3#3Ei^u3WvL&S0$w-nos47H-2SbDH zB37dmt2~~o&zaa=1}NrqBcAUrA?eDGWXYT4)FVg4(UuwhkkTlw<{GT*-MQ2~XJQFW z{%w~?*PS><_iVnfs< z(Uj@>*I3+v%g54(P)QSJw6GQndMdcz6QQoI{zaa|@9}Lm z+P-;NHA5b$RfmOGDmw$=dFr#fg+_J|F01jQNe-4rYK99eA0Mo?>Gz1sTCwH^-MwHkXVtyDS7UqArKT`P5qk0ym_rk3ROFy0) z-oZXItnW)45ug{hB`)q-4KR&8&br!gkac+O%jjkxbUwnAeZ?EruQGLVN4HJ}18W*x zzOSyJH;n}GpIpa}3)MsHfyf;mFPao?+Mx_usA?kkpdp0%# zs@5aRdLm9m&n8RzNQ?fRt?B|mDzowz<-kllC<8~r$&)6L9Udl7_=Y_@h+|jLNZ#ZM zl}1`xqtAU)*LrlC2Q{~-Ek&i+l&|>Nuo^#9zNxuTh_H-!%O}ocA73s_aSM)N;Pyy8 zjYQ}xz6%k$6syxjkS`{EsmC%jY1gOsT{Vn?*bh!JtYCAYd9nAm^>bM3-Va^v-cind zdOTOGAI^3gLZnL-vf2(vLlEFoU7--gP5D7Q$x~hPsH(A;+~A-_${u4%)j@?k*F^OR zYjG<{|?E9y!lm;sq?lc!?=808m*wIHI zgwifmYww$1>$#|T_e9_=d4xvQ7D@~1l>-MSd|-s7#OL_;_zoTTl$%KkbEuCizN@%* z7L`ZIh?P}*BuYcq2xUnwh1&R@7Z1r78+5y>n-xphmi}+NC$%jaf*uTmE#OQ1{Tzm) zpBqc%Dz#cqnI=#0`wdHjCDKdt2YqC{C9h@g-23)Ns{ilwvjhYx8!m=~zyD`rrn^C; zoA!NJPar4vPDb4{Ur60VL5P4uzOxq`yR1bNYU|is3UVt^KlW$UUtqkBvX@XZdGZe& z-`+b^cJo8}b`wTwTx7O+AsB2@y((ihg~bq{hV(&YBrY}?#PYEX@+~@I@VwaY=)fb z_msE2&s2JBQn#-05uXZIIZ2pXH})r=Ay?Fd8iLP)M;K!6Cfd9LjV}_i!k|%{!_OID z10ez61cZN1F*hh}9mnvwC7yQJsRiKh%FbO(C-SQQb#DzCN3s5ViTXuChqBQRtaiStY%No5tPi^7|1$93ZcV! z+JqIx4wD>uLQLC}Qouv)EJc2xkU%An;IFsea8w|$#%_3cm1 z3&Znm?Z(oT@=)yWyo!c3kR=Yokl!KzvDF;Xt&;KxDUXK^vf!^n9 z4^v}ozi~=BeQqp#5Oxw7z0MszrU<*5xArxP7>Ojex%Wdqvzj-a$2R_8%ThP)oT)hq ze=bNs;3gxK86}kT*SpEl4ZXP>K93#m4$Zb(rNY}gWh$3>)%28WOG|%OY&=-32D`ik z8{jf-w;@kN(PcHd2l$bQiCjbA6iS7P`G-cajH2s9HDohd=P7R#`R-VS*sRr~HoXU{ z{%8FM(W8!f!oe}(svKhg>GLKvy}dV*etQ-D5v9Cm)X@5yF$kj8qAk5O%68Rb=K&j8 zZ_VqLo#$~A;@0MUb7MN3t}UGRcHQOvv-ZymNw;s5)J%1J5*dMyUd+?!6pe8U#QOvn z+Cm$iP(nl~&yDx~uurHryXt8i+lyK)^2P6wwLBG)v@@>c3?%8&w$Bm*abZ1z2$mv< zPVjA4^)D3-=Wh;hXe*J~UW8tA(xmLi$kiAXiX`p7yM6|Sxhmq(bn~yW5koFW;gb1n z%ClR6Ist8P?FN)B2`Y}1)(si&C3}=CkzEJbS#yB`t>R=Psou4X@8?V%d}wtL@JLm7 zj8BQ!Dm0!Swd{ih{pgshT~+Y-;Y85D_Pt*mkA z^O-ZbbLNK348i=^EP$p$6?dy*QcGvkDBPufS$9$rgD4Ccz#=#EF!3zCv z?ccugagdsFv}QAck1P~xfQ0l!1Al|Mzac#PWu9vIY<3d&+dJh2_Iw z#t(7Dgq`s1UO;$n0Rie3$X8tW!W_Aa{BPS-FxAY*sH?EsJZs@mi{V({iPy>_6>-2q z&VF?6;P2ng-`HKZ93Q2cNyZnj8Dfme5LX5CHrCq5<11z5^g*sBjM6|8nfT+&DWxlG zilk+4&QQZJ6cUcO*RU6h?Y5!zBD6Y&-f7NVjezFfzho~Hb0^-$H~CXCv#9@T*`5sd z1$7?x37*3I*Rj11twd?bF8^1GGyp~jsOLlqglZ{|3Jtctx=3LdK7iG|q?O^JnC2_W z&Q}1j>SmYySW2<{yjs~&tyKPW=@W{A=#c^W1l?FDAtu``$gZR16R{uWDUBsfLdk+93 z-($xiRYCcq_7zS=5Tya&APjKYoU3n=rHp_aaRRuL`XD-%E;owIJ`1!t#@m;uK_yw+d=51 zuQ7d9%_S_`4rE=$L=tr3UybwILqk^MNd+&k;HA`El-w$IRdbdxTr4rJ61AegM-aP> zt)IQ_6=qBiz7#6X8WA0OSh7ycE=3?|Zicuf`9FBiDwNs7FYLjXKZRfoCDU|3iR6i8 zdeHf|kQ>E1KUIm?n^A@R+=`2Pa-H97y=wVwAwnbVnGr3Qby4J}>K|<}A1-zAUc?3U z$B-y1Ks4(6Zg_+#0X@xCVwp5&My}7}#z%hL2(j9R_v4AsSS6SVtFDN z8GCAoE(vqn!lLf3R)w4W{TY>|my3_=oV|5vHhXH}B#Kll-hqV`|HYdC z-}u+#@)m8`Ib&*DeUbKG-mfe+wITQ&mq8tsy|v<%$B(3Gx4cH%CBsc*M|>YoKAm3A zt#j-Ds3h0!m)T<7H)q>P+N&pgEV|vSTh_gwN;F?-&BhMLkWbNH(UoPz=@h+RzSg!p zhXpD91uIaM89=Dm**N;GQW~7JiT}yN0m$t9l*DT5_3Z1UMfM^{>V(7@6S*mZeSkZbJ zpe^Os+rW_zFsm4zDwQR>-sdBk&9OWe;Z@}om0W;_Qq$UStbK6_mBqw6qu~rODG!n#&#hF&rZcj+=lX3hwc;_veB~l&nEF!ElRK5c^ zUuzVRoCg^mYcTWu-Ml?Ijqt5L5`Um*s{I^zCJd>m)UK}anj`Ezr`c;yR?;wJwNL@N zKOhl)nk}RO&u^43c~W_+LuaWb>G6b^^J(v23T$60D}1ow6)5Y&cQ~e+_vDs0G(XEp z%A@g1Y(We;L4PLp2nQ>kSCC)+hgO3Ibc=qfnu4O6{%1l(184ngxfNwi&q+HUa|_JD zp_F)FIY;83uy!u)I8`Hv;|C2xFAAx(iY1AgATA1%unwP)W_CJc#atx$A?G0VOmqS~ z`Vw!4X;(-)ur@Nav|n)pz6dUH4RGdn7xt`=-xZ=6JB<={6ua3L-<0|v_#>AXVw}VF zdfMbFe4C3nZyB)WCJCU2f4^<3g6x?Y{p;{2L1YiCSmIrxUdm-+Y1$?0$vgrCpPt>Qzi59 zTvaN}&nAm{Ano6`<7X)&N{szrvRJz)b$pm2QEl)gejO^El&m8yM(NvSo-(^~kDmof zC;@)JL~SCtSK?P#)y^`=r}K=bnK zYm%*5Z{&6W0y##P=pgf=Urwd0pO;DiIf3?pL9_iIdT4pF0gWOVy9#V=FvousQ4i%m z#)Cc@k8_7qUGO-oR&YsYEPP(~90#Zn5NaJym*ZVkVFq%+bP3}SQLYjdank`O%_kK( z8!xIKad@7WVD3vabOlmdowK<_kU~(d*FytlCMLh4aJfV-J~rv5PCmcnrM5*hXlfR4 zVd?yWuoQ>8AD%`K2HkeIZTL@4&pPi%HtG*#$PY^C+_dm?EE4JSUY-}S?WwGW2se&Q zC}ls_PwTy}98FrJ!xBk3l)p5Un8z9n(Q{5T#~8fzVrz@`3|6(j4H7x-k2)}i;hg-B zN(gm|!uv!MH-|K2&4_x)<4>X_+iu6%%nj}P~n$MH?N;S*eW?Y{8|YJeyo z()2-QC7Pb)pJBV1Z0(8G9&an;_1@j)q^n$WCA(WmOm29JxqqQ+Y56#AQ`kX3j39pd zm!lw(&gHgmUsZGGn0-RRi3clsS?Fy5i{4==wZ=D$sTk%rriHX+F~7C*{ts6j?9&(* zd?ZD6DrB_TvemP#Y!L3PA%%GJ`>RtL{6DVVIXLpR>lTjFv2B|(v2EL#*w)0hZQGdG z$;30UZQIV*_jAs3zwi0}`c-vxS9MkQwfDZ(+G{Pjo{RXUas@(oO865F)u7B8Y`y9! zxMt>G>qI`HY429ZUzn1CIuE3TlwuQyV#7+hchV<;9DI|5l#mnO#* zO&)cK#XsoSz#*TMhVSnno4h(9eR|%{#slVc(dzsdO|(_pi@@0}sEWw`1Sh5wH*IWi zbNpan8iKxJY3Y1OnxBVa!_$yh_4#S3p@vqx%@g^d4IlNVNG|tVHRIYfT_f1tjvGiU zCZJ0*%nWW{%S$&F3NVuaPn*Cz8gF=Y_5ESXI$f%8SZ1J)=(55S+jGXdTUQH6gi zmL>><2Pt#bM9{gh1L&aKyQ=O01UV%no>6K)0#QP%0E!`LsB(LE-*A*JP5o*sIZo0w zD&;gZixj1aY%QKi%k|(XzC<^UyF`eL?@$zGKYb>Gm4MXb`925{>f{W0BfX#&zo`#5 z1xAvUNFj$WkrF9egLJ0x4i^nxo1fux*l%FylfIe+ zI`)QVi7BAkWn({KJ@Sl>weWtnmI<}mn99IbY{v#o&aIQExny{OFGC__HEblXt^AS1 zrb)FuLTpE!PAark#rBT$!`|=HwKCf;H#4?ew&~nYbxk%fWukW5=iDxswbBlG91PtwsG2O2cwCF^P&N zW^afcG4CNaUe~kgeIqLlp%`C0b*cI{IqJ?cp`0!g21%Y z`086ISuZq;p`d_MWg(iv&E{}>#Ch^~q%d2?sub}VDW&K*D~p}7UPOozr3?J}X2 z;a1D{9(xof5q+R?{~-HiQ@IVRKPPmyge2^GQuND*PR`2erZ+fhlVF8ifqd0OBnX;8 z4#SA$NKwK*C%*Q};J*ZCu-LNm?Xbq+=+>SbSM3eU$elyF2liAj&}x4=N8-g4=dVd% zbhsZuAU!l!Dg@OUI}7HQUITi(Gc#a6j-dF=?$^^zNN{DZn=5OpC zQL*>tu?9kqZEJO$R=?M=26b4-$iaHPtRdYzNf8vo>aXXxuVrq2>svaVa9`BwEW5T? zb@>fDBEr|Sh&uK>pXkqhwB9WmU>^0B9LJ`oM%Z(uv!Km3|13=e8&$$OiiI8jp0D6O zEW|J|u^OXdrEiASSdg)__|^3tFc6G>X}i9CO9g$bE?JY)_|J#$Wl^nPV~A_!I3iBU zBS$xIwA$13W5ge@55mnLyHf#;-Inu)qe=GyaHj}vZa_4o$T_G%2+@^o7_DV69Dfd2 zT{(cUV};6!?Qq~>?gusnGYY~J%dlAqe8YP`9+7J?ZT#st$28jY;kW@Ap_y(g#X@Ke zzk1DWYWRg_?l00}FJnlkB2_IX7MLP^WC)%;&{f{V@nlQ+Cjny_FNk`AcC(@gmCH^- z4eDl&@Wc+>gr_p{OkwgN-f*afbr3m zF+_cCM<^{Py*p$RGE>v-(k zZ|zl>{r@nPKr@`5zbRhu;c#(*mR|qmFb7146C{ZXAq(~Uc$lFEa%Ztw=`niLVAKNl z2CgGMuZywxU?5V70(@_)AQlgeFtZ>ORDeV?VAS^6e~>B+U@>vK3*7B{!w= z{c0(e4F*blr)n7NkNtw$%0poo#HO{@e+qPr^BH7tNw4;kjZnun81M9D? zVol8qrA;bzdoQS+YMDvVr5SRq00fnXFn^BwD@aZ&~qO$d+dBV9acU^g11PLq#o|Y%k)}&YEG*s4JW39@@cLULTR_EpF-W{_XZIy_K0%+`NS_QqrJ8pcAn6AMDs${`aPW$|(%7P_<@DvGdKhmM-KOJ_ z^-1d5Wnt#3HGNBB?A*pu&5X9)7dExKKRTXFjNtTd4f%Q_vm|-H3+MZ^C%;^Mw}}a< zv1%{MQshx;<&Ww~zFKOBr z$9v=>vpcdsPi{>+fV@!*>G1A&nY>=u(Qb|^2#q>p8ktb+LO^oQ&EMXFf9|2buQG7~ zm;UPDz?GB{sZf4xwn?GOgYeX#_uUJGsMX>e6TjHn_4OlcYNoLfIodVxS zf$8;GIAE@pA^Z2V6iE1FKtnaYOIw0Nj>WYttT}+08B%=qy~Oq;xyFMwfi(|B<={$< z(p)u2WXrdg?@nUvc4*FA0+qi7gE35LLTu~+%qwdhm4l(<7ssSWKT`0mpI9gdP)#(W zyh+Iz-b&~+q$HRJm=o>B?}sEXtXjwjJ6u*c3NDq6To%zEE{?*^0_TqPH{#?;WE6s0 z^o$h_MR{7Rf~pMB*yc1isXwy+zAiN%Xri5;Mzw(RooN((QH<) zq_GD$kOZcH=LDv@?w+HC%$ocn3@ zJqaC}M6SuvmDG#bu8*?!)DoSC;ljx;6~m$xw2+>OreGc_@U}6h8^=1yaO^ocE~5nT zMcyw*V!1Y}3Vu+j_0F=UZL( zg%Ybd%LtEceK!i%B)d2|9`AQ*J^?IkkELdKg8fwhNDGJhuMhR~Uuoc@O-OKSF;2uk z5rir(k_8p*Ye+`zYaOtS&_Cp;adhy*Yef1!E*u# z{*~4cBWp53Jkyyymz%Y_V66V*cKV+o(C`QHwiH0^uc8{BZF>?pTB@CuYDIMHZ3A;8 zoDk4_Q`8@8GQB=LNzQ>SBHi}3+7V7|V<^OKO$nz|fi5h|&Xyqz&G5#tldw*6b?w4) z@asX_&I4|PjQ_zcJYE^TQXM)1wn*N82)mqto{~qhu%j)$*}--oqAKq_a^m`fbVP%X zi-~)zKRsC5+BADZbFBz7;0>;>j)2(p07`kza<;`+5{psy82!gCBUuZzymV|-c~L(; zhxaCIE;%NIX0G8W(=WGYZO#kh>U3!((v;!u<$SAl2(ap-{xMF^^W`mdu{Z@O(nGi1>>o{GQ&igqe?%4W12Jt}e;9WQxP&(-fddoDtA zj9hhanhqpt?UFw9I#!Xr7K+wvrWRLUVLym^@A`9janu`@HtwAwt1hmda)XS_83BKQ ziSq_ZlmoAeTfSjEuM2f^NBkT(T!WpPZ=mBfM1;gWPLC*I;9J%TH8ai7P`&0k2fu-U z8VWKs8TXSjMT(ot*A}7vy~%9&*Ztd9k(hjIW25lWmJ6L)R@059L!!aQYuKig#4ZIB zDWeZg7IhSc+O~&11?6AqI?XIK2p48!TD_HZ;o`%wu?COH-M#?uedsQgJeT2~=RF;Gy`C&w_P#br{t+N+TAJPgVtl2h` zyf?%?mrZ%+`#?1{BDyh$YBbZ*($i&1L&=i{=u3n`g73}Sn~Y_F?KZ%s=Urno9xF^W zHLv39mB=T0^D~uWPNxKo zzWj6QbRHVD#P?^^kqBQM++%fZL$Q+qIWlG0g0rW6y$4^-d_tr=2u&v&}vS%KS+}OJhV%p6ls;j7yxfk95 z^{Z};7lzn0V$RJ5gp_Gbc77SEx`VF2)=1_X!45phdySmvRGg{y8l~!u0LeUm^fOE? z(Y*c+BKCdx2#i0j$mH*QI@g!KeWJjN8^0|Q+59asnKUB19O-|2a>{-P!^CwnRP-Ek z=uHc4-u}}Hb1%ya%~rF+OWpzr1{MG*>K`OZIZv*J`+=1C>2vKiXdn_`pwhlBlilub z1(yJP&wsbhmZ<>LZ=wnXrT>m~q#=Tob8eBi;<^hU2?4cd4v3>FazxqwhNg`)D@GSY zi{i!Tm;(R^Ol;7(?^KjMMyUC!v?BOYMKELumY7jk*xdGocdyZJ#*;c9xytL)+kpxS z3CQm7MOzkqB1gGu4oukS*-pGN#hnsFl}oh59hI(_O*z^(ABo{?C|YLkWoELIiNdDX z!Y143hnKoq68kv%nyp3ioNrEcI=^*JivBnWW+Y3S6YOi~GA8|TB`l>E22EBl~^&%1JJ3DlJ`Wl-s)vkOFyC%|OR#M;@Dfs*8$*Np{Bz8>Nclt?+`C zQ*ku>rKk6}&R(V?rlnnJMcNxa%!^;H2lNN(c7@U_KHe-GClXyME5oyKImsnaQ{xQt zSoYr!FEQq=#~5lcc04HS*e>-{31rCW1YoWr zg-xa@j0+=E2M{D7I4Z|Sz7IsRC-(2X|Cz9S@9+0qCKy_kmGJiVS%i*Y;^&57zyD>NefvNI3Ie`6D67EZ~~lGg6QrqJ3kp&xG*I&w+6ryk9rJv z{UUI+lYnOOQU9Q4i&M=)COualMD>8~v;_P!YlF9r61VB4TW0!=+p23NQ?S~9?36k# z9_)*jUtyfcdS0(31jO+;)}frjzHhn!HDskCeak<8bU=yP27n-s+Ve}VgOQb)yzcq&k@LB|L+S5tQ6DdEkrihm6$>keo&oWz;VTN5CL z8I2=`3V@gB`}mt7d1yEhWX^dhLK$P6 z)t9g>?uNVq@wRFPQ&9@pibZKtp5^tif2W86=tTDKbVF z`~^x&>YXhQ5sx=nchOg#)VEoJX`snPbg`0`2|%o8=ZeW(Lg_&nTAD*7jq z-@>K=g5>}Q^i0k|{~)})Oa>fzfi^!j9f+q0(YNF4-Y$=w*2`;kDgjgsF3L1-Mz-hV ziyEF2P2JmMUA_Ung>0yiBhM&@=@|sDrfP1v+H325$fT`yOB3^w(^Tg=Sc?;7Y zk|80F@kL@ch5D3Ph1z7;WC@x!e?%$`Zg4Jjprn|kX^CGwD!4QHU07}V`hSK=^K3?E zhF0{G>pq+kR!k$`qQ>shys!%%*yDE*k!Gzjy&8&32%Vf_d;h_1{m(V;@Tn_9luxBs zFwr|&`#BYn&J|EHaH@F!4Ku)DDk9Fyan#wR*hv43lSq|c)Y>mf-r-g9k=^t5xBN3eG~#(&?k(m)ZFlSJs$=8AL1FXjE-g-p^vZ|# zCFqW#LwWW%rWK!9E#g+QR6?$yX$l39^*j#4fp*n(E_W4zCLa2amFlbrl1~mWH(5T) zrosrvj9W&br8_bH7^qgX_y?=U=Muj1ny_^tC*Qo4Cu!sZCLsL3dyD>?5G)YcP?)bBv!fezVSn?hzl231D^rRB6Org}EZ1+Q&7 zbwU}f^H>4$ae|5favdH~3`G--NliKF>qlw)7x?QYeqb22sbLGzv4L=z_dC?H%ENc52dzF*e@ z$oQI4N{;k##e9dVzL7E@g1tR?I~umFlrq;N)W)5|E>@+#M_#xi|4Ex04sh-8=mDJ_ zR(g8(KnH?93_yozcI(DM|Gdd!T@sN6tIR**qGZXdOJVjpr8jL5TEfHi{S)S3dEiU) zyZPZ4?XFEJ11%gnEH!Man12loFd@c>t083*GgmDJVw74&*QcnBYNhtWm9-Xukgy0i zw1m{6r3uVs1$zv-ohzU8VMDqOQqy?V*`rV78}d}7=m5EvmG)vMlwWX z34ms%z|cVUzgMmd9|59UMh=hI;e`KQrI5M7V#I@<(?Hf*WG!hI-eQWhiv!W=(vr8! z8{{%%ha=G`CF_I*)CxuZu@U)W$27v#Xb+F(!+Ii@l-XrwLD7?Ufic%z-QeeuVlvBZ zj29yru+t&Mx&Qas&;t)e$w?5N%}m)iaFiAtL6lfTz5e+k<@W>$Q<7T6HCpbhLBpI8 zJ-cuJI`b3egF^-H+x=cn$787Fwa*F%P=vu8JNAKHD4P+llLi*KYVCf0cD1W_)iWP$ zMe!JoZF$c6t_`b3fjzl6;bmfv@^EO;f4v@F*WdOeTt4k!4&3S(-$(49aq|>0nu`)s z8pTbO)}YSdmUaF6(SC?d1tZ~~+Af!(XFn`E+3~T)!XBCAD6f|d>w!L~z?1+S)3Q{} ze~;N@%o#}hAW^MIwy-SafNHI5szK-2?%of-G;^SqY}XCb6}7 znA_tY#_p1rRw)qTMU6?jX-y_xJmM8{{Ltd#8Pi7U;>sbLQg9A+qJu zVSLS5bXj;`k0_mbVy@|dP@5B&IA+Im-23Tz&}Ug2u>>ua$pGdtweMtUt;CN=1c_k+ zpgjMByFhDGp^M+qBmZ6u>thq$2U|Ww+ECv zMg1~Ev8JGj*CZbWNf;uJ0H1tqF4-WSL+mI^T(1k@9IIbm)Ja2Cg%VPyO&Rzu3QMkWDSDu#7I;+&)%i9PoH7xT zIxYS`tXe=hS$+05P$dby(f>{uZ@8e8O_5}$FigrCv=~uA$LCKf=C3K3^<;QFq^tBQXiw?Ec|p zKJ59Z;~y$zsclgUgSeBGQvqdBg@-~;+9OKhRMzA~?DdX2Wr&|4QBKYjn~(g;>*hd6 zrQn$yY<$$e^4;RTGlLYYhJZc;0S6-oMI#4p`pG4si$E~Y2$!A{wczX!wfH@!4gOd` ziLDpG6mbd`4MYFchKrP0Wn_2jtt`X4l2#Mr+z?RkoJT*`|JFXH`{I zM^)!t*Ri`bm&~ENe2zBjRNCt{v_h%L5lp9eUA@NTpJqTu4eEIs5 z#dfRakbRUnIh~Arb>xe5mi<|KeS3m@v?YrAbITEpUo%WVPnRXhyT-Fzf8s0uE77eg zhzv}Bj{KFr<9!$ zyVGBeaxR{)5fcqDfa!42zG>Z}N5RT4nXqMd5Mu440Ep6)B$Ne2t`x%_so5LH2^R%b z7}2vXq@k=QaKVn%<5m1XwZ=h#w}hv@hY6Az@v_)6Bz}0*kp6@3&Jd|F&$JNN3SYNb z`PAK4aXamfezv+lUox;Bcm6I_UO$GhkC-0aMFaWTQMenm-r3uOrGBQbM?a)60S`pq zD}zs>BT-G!-MfyZZj`_)ev~Ml;=Y;nkhxV9-lu`PqXqt($JTxo`yND%l$j{5Nx17_ zS!BRy0|XrV@eICST&@qhH&LQ7S6g3EgpzsZScB|ZK-t%>bAXKkPzoes`rfBP$1>Hn9MLO9 z^gi9x!I>woB^Fg$+?EjpDb$fmtiRXu>a{hEA0o03jBGh%=I_2AmVgC}7 zixSD5V1j*7%VjZHNreu;dddWc(B$Ta+vFp8^RQ=SiC@+K+viV7h@aQ;L&CYBTK2lT zrj>h>M+Af`en)&POhY@`bQ5X_3e^B30VHaU7_8^W-+mtSnrajh8N=INOqgCix{n!x z{{1lCv=R^3`(en@Hon#kG(}u zSYa7~+a+2ITFKxNC=+$ZvsCizy#{!Sr82{*B3nw*72QOnnEagbFZ}mZRyk#6#fNtz z4Kol)4s1|R%m)N2abi6PS@P%}Vhxpe^eXrv|KjDLq)~7*B5Bqjr#> z5JL!TP~fM5kAM(S;tc2~;mUF0Z(z|NWPQN6-4{VY;lkKZA#peya$5rF%3vZ?Z}Nry zIKXI|fi?4r8oy^`i6KM>GV(OGe+xZn?`|?E*#1F$W=%Y8X3W}eYH~`%M^x;1Do7IT zr8bAkz%aO>F^7x5Fae?KevzW~FepaWT&lRvU~^IVqJrw-u1{Mq&Eo& z#cBT-lkOFlUIZzx2ekM)Zq2FwHek));0-9{|D$BZ8WRps6~>n%Gb%90f{|H&n|fZ9 zx(sg_#?sxvpP7O{14n%{7d5Y~Arrcr`K|zsCX*x`Ft;kF_)DUneJ`#8IaCQuRPa0P zo6Y193a@aYKe1Ke(GlYXT5Cicmg?W%G$jp$Wg9GVt_946EgtRVfzMnL-_!alA`VUm zYOKG-)8D3;2eOEYV)i~Kv_4w2JD`-BDq zsfe}$rGL1IMi(Hyr=c8+=i5m+G*t-xon+F=FH1H&i@6H=diC?C zH`*0g4xz78{HSGya_0(Qw9bimRyo{oZ&whbH_qXdm^g0}Y+{=thL>{ z{p$9dWml*8;!dQm*%R)5-OXS~ZH$6=f9@>d&X?x;$uiD0-ebI7=uG~1E&(1cqF$7A zK)4r6K3Xu`|A>S|DAb0ig{mLR;J089PLfT?EB(^ei4XJW6FI(@xd9RdbS5Vce!SW1pe{o7+%A8!}5Srw?bSH}ZP;(Wu;8Se1$NsQ&6PZE7? zPq4of5QVJv?{$T~98R?w%c`o2EN>N~7jh(Aa<|T5j4Jw{!iuQ(xT>d&d0&?(Q9^ zhB3naSQOqt%mdv*vTFwohZm%igmgnn0o%cxP&G+PGtwv@A;{?{rzNN1xPh7g5tVAi z+5fQO8p(kJDsCu-Y*Bc@DZB6>N8VeweS=&6%vWgnf*nl=^0(kQ4@orCG#kYt#Ppfz zKS%%nR)8i^f0%l+2=>+?U^)2DYs6rTxX9ye*HXoGi~S>yh%Xocdz?Xw;E|h3^lpWv z!63BHH~jDNe)>qhgLMlE1N6ZEts#W6FmZVC+;3`c^NM_oY0l~$40=JYz>xbNFJqsH zC}c>XOI@QZIG)ZEF?x%(!MR!Z#<-Z%Tn6??;)Mh%^oy3PU05uU$vb9W<1~o{g!Yk* z=7atHO2yuUo*nd1f~cSSh;NRw33kyK`$6NXI=N-v;TIp5hvpw%=7Hdc!DwJyX@eSsB|Fw zEo*7;Nvza_Im{v_AZnF$-=ajWx#Q2gX+~2?GkAL`GpunEB3Gr=*q&WDt9T^TV8;zG zrRsrgc1H&t#FWi@#G`y)X}ubZ+gSEr()&@^a)NSzODSfE5?=S}N=jONYJBBSb^SD% z_ld!L)eE4i<0C>Qd^jrku+|aNRN-BYcj>a5^TCR=ii`UT4N5u!wr{^ig2=JECSjLc zR?8QP7blizys;(_XrA}R?tM^YKtOvPgtX}o+yh!Ow6?~pJRr5v>wt_NFnLmDKK;z^O2*ryMO+v1J~2Y#t!&}a&7NNc0t?DFAlQ!*aH=Ygxa9$J9pBb zBiL4Tc5l~#J4FbLec8GhO$2_Gk;VjwS=sfrs9;JaqO9o_H4m2{LI*CnpuU(wxG5gg zL=agOxU?KhP?U&`@OSC{?YwMCF_1yo74FqlS7cF`vHD2jats%-?Ux_Qkv5VQ#lKFa#L^)v$nO>N`P@;4M7OdSZc9?fSzw@X~#1ERFeXt!rea{!xuQ1``s?9F0`H zxsRD8|CFBaD-`DU2=LSrvq3B_vV$6Lf+zI3q4mE?7Rvg*Z;bu6&Re{{ry{z;dB!gw z&L|EQs-vp};jh(sm{PCM9yZMQr>pu(K4C;rAE*a2K*g5n}LWLF9OG@61jM9-=- zfYJKV?Pb<7HpIDRURwfZC`*gGL033|K12pjUn38KBQ4fdMT+lWIb3I4*pO2hC_jb8 zPqQ`7gm4}jNd;{3%rlJ!??$(?Kj_Sti5ic$g_|tka?a8%`iSJ#QA9&CH)91LjdYVy z(!m1aIRov;awG<6Xz}z^#f;OAIfRyUn9=e^XLh6ctc}odyF#ca`$_qlWO2pENy@$@ zke(((?i{f#Do zZF%#zf~=BUncH~;)h6T=|C{Ueg9->`pERU~ws$otC|4OGnEnM@XdsFt0ceFI8u=20 z#`smUo0EgUbQXY9gMeMtDsYOb5uu?9`bCk~O^yn>*8rZT2&Y8N=fk8`3fFbcB@ygt@ceS0LE7NP9lplj2 z8Oa#v3rL$J`h9aZy9YK1XWJ4v%e>o(tgG^Ef@HrX#|~1i4^DOWQlMLDbw^c-+6w-S ztq}G{qM#_dzku3;;XJ|MlcoL%gdtY&3`Ev<{!(e|Wj^v=QUP7HgzXff9&WW1N4PX; zynLSSt;@Ysf?TGzpDB{#!Qb5bcbs&y3(W0L{={vFW&PHokB)-xS_l%XtfQ711#cn} z=6ju$7wTsT;a3Aa$-mk$Kv~KyfG({TmSWspw}s^I1&4h3Xa1%~2g?mRGp%lV)1P`5 z{gxMKqK@?>iga~F@O7(?ktIjEQ2bBF z;DZ?g^mQBgVMa(q!dmNcecW<}7u5}%AZnba*oyxT@Y86-z+)~)4;^L77`elSec~mU z8m0P|3QMkbUOk-5C!FBN^Jv1bkW&_XU3-oS2%wVB+I#IZyI%HGKY_chGCn7#rZr8pU2)D2u!uEvj#i!eCi=hfkI>COp>NI@$pylN+* z4#v5$FS!#9l@fxH!!=2ns#V7mrz0)Vh&-~}-=-X|Jj+a@Tta{In z6R2)NUpIfAfLmmZ7ws^-%9R00pko?wb0dPO=t$%q=?a0y>#Q3-S%Tj^sf49P-UV_* zHv|ixidj0mcgwa`l0H_0kb(;3w-HuVGTnDcr|s~r?Z2*7u6y6-zFxXU?R{@sx6=e} z?yf^ei1-CsWbq6>51&Sf=pS44TwW!bCW&4ugaQh;FyA!V-hDYPeVD)xVg#~b5FR)1wMd2?^S zAl;bs0)d8MO)eJKE0mnvyV zcpuK^)2mw^%36>&Klv~rX&AJ`kvqLcnY}L1ha@-GI!ESKn6uBSnEz|^yCHt`pOnEM z%a}Z+%96EETlZS$CGoAIBp=S_-8^7W75A%GbKiVf7PxFvOr#A&z=yVkm&1LEfCwpl zH5Ng%c8m=;e5|m;ak~R2K>FZ!p(tC=BE$AV*J`w%C=<77e=Hhc`t5_P7A7uPG__p6|5w79H@T{qwt|o0~q^$ znkc`HYTM%v0Jhr~&*0F9*l_>8k)XOf@G#ad0~GsAv3iv-;UpcxraXVlx_XMA6~7*j z1To`%nf}|ifdjx2fc`4WxAuqm&cDt41m&1=cvW)?mXr$}4i?Q&4vAr@4*)MFn8Hh5 z38*O)X}XCZ2Ow8twWN}>xug_CDxa72giDK_2iw&u($)mol|4&iw4-*()QtYM(AyiR z*z;I~#efH-AXJ6Wb8olJ{n&q#FFtgMmoyn&NQdvv@x{q>-G_0)cIZ0U$6o=-)8&O2 z){omiZ}u$Kt8H$JiW5Plm)d|JJA5rR>JM5BiE%h}ly#PC=tAfy*o~_^>%M{E%)mIH zoIh)>Sj#L010C@LC0Io8TEWy6-TGG6Put!2lB*IOJ<2*a$fPe97FIW~cv+;#6LAE= z9vVkw;j;W~$!09|^*)Zw!vJL!!6f$>$20vAB?XBqSy43+({KJ0em1>yw*Z+5%MwlC z2;L>HG=g!xgB@+*dDFcM254GCcVx=Z>R!;%D+KA6-6-A%y|w75R29q1#R{Cg(Rf#_W zDdd#z>J7-ftMMo9w_wW;aI3FCO|-`8h!9Z^UK~SNj4F=7PEQ_fUKJ@k-`TLKq||7x zkL2$b@4RC$!i85wiI`r$2`CAdmBCK2h3Cqvb_tvr!yfgym}NtbV?I_KmQrJ}=*mhW z_P{x=%wL&umhX=Se4f4Dyyvna)2XL;FN_3QN|xGO=0+OsXn*T5M+D75`UVCUR6goLJ_fK(Gc_x5!IPs?6k^ltLlj6uNQ6LZ$WzOkZ-i<^`){AzDFAPv*- z!_jjxUL|zn?(Zh6tgIJMYHwykvy!+YN>ehTw|TkGs=C1Z;}K=hnj|9&@T? zps>bNyW4@qC0lLp+eD1L){S6qQ}(miWn3P7ff1}q)>}++bEC>!+;?F^rPZ3-`*elpdQ+lhd)Ti14c-15 zSObc~jmWC4xBS*zNeOumYyfg}kwelKE7&&?e@VITx`2A2x`Ah}d+o9lYNu+yn>Ro9 zZ|!XbFQnTYgF)Z_Xf&?0UT(g1u5gSq)WU-WZUjr8VSb-@@w#fV@)8nQZ<8(tRbj-Q zbc|ztQH$jX6U*WPi@oq)h%ih1xrQ(oV88CV)4+h?7WuOUnA9m&2vwPg1R%gKySj{* z%r#{cC1*Ip7A>PL+t+RQV^~t1b;Y%f=Ni4B0SyX6DM~&F#x@APPS9ou(b62{*Ex?bbuUlT#?>N(vB*yn3|Z5mh-q(0yBu4(P|`z**d!S z1F98UER|d)_e1Uo;pXOsMYrP@oM#hgi)EqSB6#-#6x@einH(E=k8*Pr=m|!Q4rz=n zNki&JX3wRiX_m%IVqkEJFK9$$N8P>BY;=aob;g8Ho<1z%ne2BW_!i3y2AA&0qr2Kj z!q;g^FQNoRbx(EG1Q2WIC)D?Yxn3S>*+>ZhoT-q|cwxAlq`Q~Y zgM1ZSs6hnFRR&8_3B?ut>5XFz4i)e!sp$=o`B%j|jyfRv>9O4F_pbFQ?*9df{_~g? zGVDkhjVApcOlco1U~X=K4ga7JTr)gHD1X5!P<oXy4QZq>@|qUokVk3zRHplGwK+ zz7xG7n=`n95u>2E;V5!1W08}K6Sj9R*4z4dp`yVH6@C{w$==cEZu@w2x^abvEb#D2 z6w)kx#!V3WzdRH`R7VF zBdCWQ0lU_}SOa$5a^kthRQ#!*>xYJ2H+xxXyOy{iC)mfn=AiQ}j<_KgO8jb=A;(ji z3fCen2LL^`H%|tvdTuWWq^RchmcNq;?Ik7h5gsishl>SF3Z)(%4gc56Bx^hN{_&6q z+G7+fZwpP(;+ZeAj1p#J4ILyBOns_*?4(E;azQ^kl&o^r9_kAG&*`VWGmw6wG`W9LQr)=_3pd)1^3;2Y!B`+X5s*Vsb} znIa4d7S<$bXQ}}NbVl}Nf!73WC_;Wp>Mwtt7ujn zPeq8hAVQOh(}!trF*y39`V%_xpO2S+1RWU7mnc3o1ddE{{-VUIqPDO;K3Bxcq&k7o zazW0r(dXlHQBR zRdemA+2&OO0gt%A_A{ZH<&KZTVSrxsDCbJo2zO6FqACL^s8B&>R zNm2VbP^BaQf>3lX6{44Yh52(`!Efq(s2xb)&KYYvOM7ywk0YYeBBJ^~8r6Gv?QdhH zK}6Ys?|EmGo_?W(?ET7tc_lN!UDfB9JMz?QylvaI ztc`cr;}YFIU8r)n+T-Z$-yPd+DwFk@lf zxM(m%nMg+hotTC!HWegM2r?^a@2jsZmam61>Mh-856W)Zfq_=)3>1UEHnrfxI6^t^ zHFb8+E7)>dyxs!(bd!y@xGPep>9b_4^TDbqIb0#W@U{EXIOck_9$)zx=5^VBk5F96osPJrZlIca4c~jE@g1kQ(?armZ)no^V z#{P#W{r6$mj;u+*v~qCDu^9Tl4k!>>l?Qn6i-|-r-~N@#EwM_a->FzxsVMwW`Y@){ zqzj{}20pYrMuuI_F&io|0gGxr{^S1x(|xK4?fyS@y(v5 zx{M;V+i-4mC2;{-h)hB!Ey!OpP+k{Kt@L1HzoT0=muw6$2_~_VbE3#n5H;Zi9IGo4^Pd(bdS0RkpV$f7qZ_ z*Pia$$Nr?3i40Vq&hOeJ>9$RoN3n+h1pn6fdIuVucioOp^fzq1@7wn?`RyLH={FXE+Mm`ech$u{u084V+hE}o3T!4RMEcM}M z226cpX!@A~XaLpbE7|pTRKu}0LnZ|XO+v=N!`}dt0Dt#uBg_S-oajCfu!E$d{*L$k zzMG!}$Txe>WqF^f)81m5#91=3ed+JCl#1E5Cn&^kwKMG3c*fdpoBQ$Yl8=5>X8l4k zflKyuit5Kjgk_EZ-34CG{wIsWQi8B~lcT6cXzR$4eT}4k_Ph0-n0=pTw0KSNf0}Kl z2v~1P2HYe9BC%kA!K}1FuUhchlbP+6+$om7c35jC=%A9aXlZ;&+1N=Qg7AVTKG_X! z$~;&ykvG2YI~h^P)Tb2Osk?n(@IK{@iZ=JKy`!f5EnGxW#srg0Y}>YN z+qNdQF>xlI*!ug~FaCG$@2C&@r0?tMb=O+8s%mA&yNv?08O2Zy=dURjs98{T+wD_S z(3LgpjfeeuR}o2t2k=+f&T2y?w9#U&#qLuTNWtjtSA~bHc^)2C_qCEF{LYu=m_w;J zu`3HB01&5%ArI%6W_|fC;UHr)<((Y}mN4VqI%RWQ5|Xeju$K^|{goQ7JcpW6)&D%9~fw#wobEU zqefT~4G?&KL!Us9y-9`}HNIHoUZb2AUFGIOZ<39S{f#g(X<}AfXp*~q5&TI8(=ZCz=c5(!?`GD2c5TWGC^TFuIsn;?JaI5mpmovtB`ky$!z)Ob%&XRQvT0vtmz z!S=O?#?2w9Yc=zIP~-9)T8B+OoMs@}LmXjT>#TFFv})1!cK@Pa^DvfPI$872vRVIt zTnm#oFh?fDxod+9tes8>`Tq4BbY0*kh<;d6T{HApGD&uKH|`G2bhB)q{kb2tGh#OQ z(j9%pEuOz4x=qu4pF_6R{fVr%`5T*&K2ICwAKEmc&V;Gkn-6aW+_}QVk8s*CE4p6{ zx;kxE>hu(pMsi#Lj#_EG7n0imE{SaESJXZaBP3D!?A@UIY2z%(hK;>to#_s8TR${0 z*u=Oj2sddzYV=~hfxvB&ASg?*nc$?T8IWxu^b9Z^0|#@?YrD?E_u-sUU9iFGb=e8Y zX#|V2l>)u7%srgUqDK`-yRsD6;&goU&*jXgj5pJN$PWf+Wn)5t62T<+z;{Fa4}Q8q z-09-0YiOu6j+Q0#-soVA*HKc~O|SYeA>iMB5A%N%Lb=R|v$4G9Ca=%xBNF8~sDpay zJ+3;#g@8mAnuk@|ScAV`Rh)-{xO+JRiV>gDK?f_1&IOJbCu1kel&4Mb}vXOIzmb4=Fgt=-F!$2vwhi7|^aL>IR^1-`~ za)LF7G%H5mD1TEct9={vP3+LE81|$rkx8gN&M56hRx3Y|vV*`N0R`6c`^syaxwo)F zNZMC^`^{@>*;cVHFMr5!$6{60rKUaOLVk?zQTG4vmH!Kvz;O`(Y+kKUJR?j^{tw6L zkCM&{)ms-D6Uy&*s)KMfOEUh1+qje-g!*lN z_S{zwFdn_oRDo8D@De#xoXX?e zCVm%wa3SpCgOwAKIF0c8A!IYL5i%f8#vSC#5;#n@B03;WjN&g)=v>I_+XbkJfmOq( z<(uaXj#*i#-FfuQ@XS);D8v=@<2c&B9#g3H@fQC*;=xZeRIfr3ElQX!yKOL$C4)rL z=YTs`WZzSYD54VwtF3j(#X7-}5{HtUed@R5ym4pd09^?#)Hfk=vOu_+7zh;GZE^D8 zFV`hz`F3HBOUJ9px%aoqYv6;O%XR+sxrU2ah2eJ~VkAc|fj4K#F&k~BM5O1|>*da~ zl2S|PZ2PJmU!nvnojw$rLCn=>oiAKY!=e{F{*IwoY?dp8?f%{Jxm^$B-+6*|;H)Z~ zqM7zi4OUnpcu30newhm9)!Do-tZ5_}1?h{lI}Ck@9}uHrmg}nj8kjNtCWZ=~>+^Un z%-rX{L%~%N>K|3Lq>%}7{^?X*Xxc7Tj*?L8~_0m`;QNR;M6d7LGgb7j(XE=I^a zAUU5QmDZhLO4+9}(%h>TeBW~eIroc zJ=(k@M$!4jO$IJPjh~krrd6On+aPDY zzikG41Z%zJj(=zjq43?8kbVdRX1sr&j8O2HN&DHo6`Ht2yA^?6>he;9;hLM#@;qO6 zJnv{z0W?w^>p0wGCf@<<^_9`*j{1=_>J!^R_3e;rAAvD2k8U0C4dZqjj`PAl-A2;bWN z@51oE)P7X~LcZPC8sK&-iT~ctf})hGaptE`%aCicNMzh&AxC$FUxG;rWaFR zMola>Y#t653ze(!SKg&+X2xVPE{%_A@+Uj;p*kbcSir&o5=3HVH z%`tafYe~DN^+YZ`F(#~^Jl_y!J&H!D&NjdndatgjAIP++X>(=<#6^K??Cv)*qOiKp zbt2)*zw&&YTz7Hh=t5#pRG?(IsVgf+ZwW-8@OMz3NWExW+~bxg1bz36$sSJBU?eZ% zi7Zx$Crq z%tlt`RpLV{POcSx7!rpZASs&g0iZJffS;1oH`w;yDEDH$7nd>IE|HMve;iV*ZTO&D zQq3b;=!<%pFLvPHIRN73PO_V$2$_GB0HuMgIAu86mt3DHM#&o5K@-bi3F%9rzkX{n z8&?F)qDW1MAs#Rmgb2Iy+n+`Mbs%_LF65fJFbaQxow)0HE4oHYw()4!mZzr zq?^X**U{-`C7`|!L;1qj8q@;T^!jd?c)FhCkQT$sqpj)V(QD?D3` z`p*eh?*x4Irf@5DeCbdPTA}bLOnRWU9O`SVKi?QgL{my@b#CM3sEN@tJ85fyVp8+~ z`3}**+XdO3psKiD_QlqHjqmEbJEXpUe&m55VR1Vd0~SR31)qI&)E)Svh3EmWqdT(* zpc)_Mg7Mts0?{QxGpr0i1f3}`ySWVp@hxtQf1VhZo-1;gYk&TIr!gJaQwkktQ&C?q zpC+pC0WAeRS^H<`L+q3PqowALz)P1k=}SstLftRRLLP$}pIOkfcR%}vE+JnW2>6+R zUhM2tw1BJ@miNmj>5FcYo{S%`c2*{4aug-%v-g9+l`c?%Hk>Zhny}_rOMCY-Rfa2Z z16=$tQrw%VK0r8*o2J zFRYJjH+;)kow$xJCN2=^{NaZ#V3A$)nNOZCX=CJr)|&fF>|ZVNw#%5E%fKjIL{Lkn z517-$lw0$6tU#!FwCGHkt>7T-K@}&6Jksy?--u9U3fphSDpi^H|8uI`-lgPs`nuE{ zMeSLswR`mR3!x*2BBw@rss@p0O4V)wNRg;?lz>eH$B?=5}8o;nO@kAw&V|d?S)j%7=`(nu0KBMxL*$q~;$+_!Zc3odT*w|NT4lcgCNh5Qyn6@t_ z7W^!GK``R(r#bPOEP%FZxQA8)5ahbQZSJlg_afLSQE;`OGW{)!P85pXPOs&^*P38= za-l?Bsobz+WI?^;SPK)}74C_E$t(sB}MuOODKJ4}<_sgFjn2O;|dWOG~ zwz5HiYcf=YR@J5<_0|MM2@0zS4}e88 zxmJP3_JsE8V*-V<1LjK(J0f|BkkGELtuyNu92=^t{r(ckU__ko{$$n{{a$so17%0R zuqdp}Qx+>seBbc&qjc$>nrrUR=vh{&(x6@d_Qk}YUD$yNRex~+#|^tZ9|9zh8G7fZ z@vkPu#cpnau%X**P~?GzkuS|O-s4?Ck98&MPg<6*Zvw`cpU;NuTi$wyLBRT$jonB z+#N9ef2bkiJZRu?PJy?O661gCbH_lza*vIM6~WmsVkB|!keu>ufu@eJ#F!MxeoHJ8 zk+et!!&ue0;V9@L5z@RdcpoV7zL?PQ??ZJ`3IyCt8lB%k$9w6QS~PnFFpRHIImC6Q z;v~M>$L|`QrV7tDg$4;*>iHLh2*os6_LGuPPGh)54Jk%Y&cD(FFz9zwc;R-{^0BsQYYN*&q?eQ$}9_Md#nr#EZ`yy}=LR~>q zE_RZw{K4KKg}$&61XJdECBm>6G|WU7BKa!S0~QQ9UVfS_a7`ZG?ocbMn{#Z8K|5G3 zPGfU_=WW&)7Dfl1y7ER)x+SA#W;&)Ch(5ZS71w?SV}pm4r}Wd{78MEHypHZ=eDH+N z`U;@*9`hhJJ39DpYm>NG zZZwO~@qWi4y`j_sTu)`ZJ7wk8gNqtFq;`k_{-oNLts0K#p=5cv;VZvqX zc1XMm1`jSQXw+23CJC}FOrSp5hLn|%*r;xDl>w_G6Ll1ae!KaN?d zbE^~so`AxBO7n;22Kvsb+Jsv5fmE-)wB@v2aufySD5dje3MS>{scrbry|e9?=R z#JgRX?bz3%LWPjRG=cd>_UX_IG0Q?fxSOkiwwO~d>AF3(zY(fSDBFW7U7U&}va|N> z{i@R% zGxkZ|j@IB2oZr0>KYw1a4>!m5O4!m1wuxUe_c(< z_wxJ~Eks=RPwjs93O)MwFM$pl;U$7af5(nMI0;x*(m_&iu|As6M@c+NN6yUk{GQ3U+_vaXxh33*Pe%hFB|K&{PGGE z!vulWkYDa71jj&of3h^To}S{o{5Y{qtf^;*QYiF~a4zfAafxHlJ{?fm)dJsR^?F=( z^VQh-3L(kS$kT9~pA}(Fm;>?nnNzN4nLD3&=Elu}Xhnpcj66`ovA1afOD0oA49t(is3)P}!JgvIv@*Xmk zDg@wTe!&ao#kCs_TKHr*Ai3aGoUh-3Feo_PXdm14z44i!;BSa6C?a9mZk%A}y6S9d zU&R|3eL)wZ(?@R({CI2cpJFN6#M@5kxkKbP1`OxvrtO`6z0*9efBk`o?%d}5BLT)D zw%Kml32}*GBQ+8f)>Vbghv!gSl~X%Sd=P}B7aHet@}NXt_Yb#(67n*~1Skxz6L{Z? z>#zITs2hCSxf`xG_I`&CAlm*7RpBk{m?mlXeOcZ80mJ{P<#Bhq3q;}t^m+zb^N#x4 zBwM(Dz;GsK7A<}TDo@Yi#kd7JSYgVvNQAP@Ew=efE!n3Xk-frA5lH$+bY}Nh`JneaS`>M%Ajj1z|cpmgn2J9 zZ*d^cq=5uV^ug+l);F{p7hW%hG5%y~^WZ-g@rz@-ERh_zq?vMKTG_|%lO|8_Ql6;3 zv=w!^BxMpWDjz%@xaV*I{V4w1=Lt18UkV5u=Pw#O#RU7f@@T% zzu%zOzc|@U#DX=mln-OkX51&so2iR%qxWK!# z2rIZwvg%Js!>&w#52dF*P{pT7Bs=Ra^cAQ-w?r}?@vBFdpH9@#8WW~`8Tcur87oi2}aI3c=f zJcn^1P+48p+`pEpRsqu|dW%&n7dqJ*$pv4w9c|e;T=|L{*C%OX8J(VdFOY`LbQG24 z+7bed{#)))Hdl~r80k8CBxL$u2!|BP&49apt^-HTg(bJf&WMjyAGVsylirdIgah=P zHCOvF>^ZJ2@Q-^y#4kB>PMwqfoU0Q9{*(M4B?s+N^dyix_`Xk811>@)-_eieoIGhv$5sz*+d~Ev9TF+X&&G?9X#VcoV@d)JA#E9Y!6+^VVbwt{7p*^ z2}h5AMeQ9~)(3Ble)wam!wlj3H%V|alBne2AG3`5re7=w7-jj8-e2&T4Hpx7K4mK1chDsY#__%?dO~#X?6Sfo+F?|=f8mJu zV<@X1k_4ulIo-TmmVGYo1T0m9GH^H~yf+EDkZk%{c7FVgq{?EM*^pPGR{3M_74lT{ zqYmEA^ZjP*&f6Xtl(H9hn0y{ZUPjHDFy!;6LFjQ7?EC#gmlDHRz9wOM81~j505m>{ z@^wxsdrsE z&0Mhxu96u4uEDD4Y*BKO{bA@SP*6|G^4w1lT&p`TMe9{0@M$+%^zNSym*~KXWe+Qu zkY|JjYqbdCKYHrstC|qg>gg$h6-YD$#aBGsT+|(^NLMAQq}Caf#6JKx<` zL^efkfla*CL;j5ZHqE^t;&C^S3Wre}y3|IXVRzQ2{7!A#!q~u53V8zAo>CB=I0ZjeeQ(1_BxR)E# zbq)Yh!i=|OWW?$AoE+n*JrNiIgCFd4E!*gGZ?tF)4aTVGk9mY84(DS@XUK!~StTY0 z0bInQel5df5@f3Xs+h^$J#ZA}n46`~sQaZv(y1^OhzOhLgsWhN_?IVTy)?RaZ$sN3 zh5)?P-Sz&7Sh)BTm(MJJ)}%p7)}^dX*y@n(G#H$hHAS_8tIw@WZE3PS(fX}DpG(S{ zz5P4MkCJxJ{}^fiS=gYG^#imb3JwDQN2d2*Ox0wlP=gkvGVVwC#fyp54^hujAH~+} zrD`KJ<=0;%zf*-r#IG??5h$bs@dzHImYD{%#n{ToZRAuWF!;#3Z;@T0ati6|6Yfdq zR;d?-fc!A-B-1%h(~T5GQ4_r`@eei1g&lLnQlHjC%>%F7=M%<@@17tLL>p4WhK9pb zP?l6rzp$pXVgHLP3DqhQmw?{!BKWI`*yuxm z4!y-Lvcu_bO(D@^*N;1cLfYcSHXDCS2g;`Fr;%|}D(wm?X5c4ETq9BJAD|xM*a{uiMfC!UIbKi=> zFHiUVGB*V{fB(GPgKttg$DK}8l#yBdO2auU+34J?BuiQz%TC=#glk{Pw{z4ZeGE*e{e_Pdx*h7>(kMifky3!&iY7AvXTdlHpn& zs83TEuqL)ptWCLC4iwx`a^WDEu`t0c;5dLH*2W6+>8L_U_nmNBWOBY>jLRyQKK|{E zR34TYfHz8942%1Yp$ct&#c=Cc64Ssrwau>e=49ssyqh+AT!-xtq5ES)c~eZ(KtR^ zup<@dX+sT--1u@#-N^)EK$UeL&clk&<+R8RXDlK|SHS%aml|wVDeHB1RZ3e6fM zDtvTDcV|5G+3Dx3rQypZdvvL-@S8ajef6Snm_Qv3XWI+{Ehz@g))9=*hI``=v+nAs?>dAEfHwX}4W&DWWADq6G7@S61djD;~ z-Ksgg9w1tWNEu{y%H#!ekqvz7g!h8X+9^AYE*zLGS=!EU|BL352}W|CS%vw5@L59il&qDVtSSI-e0I!u2S!J90W8zHe+rb~}rTKBK| zm<&MMA5tWRthWIFGK|kcME%R7(yW_;>4d0ddP|4W=jJXgs4->Q>`;_J?EjOle-w5H2qz4$BF4*4Z89bUF18sfSSMwEYoWoIg@-L^0;S_OX^YLb)}H zi-V$E1z@E(euFY1zAdd?gz<<8TIl6R*NBi0w`Dz&j91`k#55)wUTqRn%=gmgob5I=Rj1a?E@~W7y>L4(s6t^Z(cJ{;$gS zl%$`q{nTij9jIIUFL?gf2R#=UfpHAaobi)!18fbb0`cpvAf3}2{br`iXi0%?BahlT zI84rqvtBZnM`3T7EAM#yQ2~ngAYalu1Ny3vBx(8>y6*2aoS>h8I?$hDfI=x86+Wre z%#++e`kEN>f!kkP!|-SoT4Kfoir`thTumcZ3;huM)$SJuY?{#JL)I%zF{ipFU@Xyy z7HZZIj_D1`T~XbRR#LwCM#YSH;pkC|KnE8G02xkG$b~1CP|Wj)^fV>HDJQ6#$cU7b z?l;ZeM;k#@cx-qhbzPw?6hKD}DZvm!Ru@!QL+jgDOc)5tOT;Z=Em%aFpldD3FdaIC zniR0Lp?q-0PcuGm0K-{@bt#v}z;S;Og58FqjoZy;;o1&`PuX>z_@69*OG0GNJX|k@ zm>nEtE``klJgsQ_A?Jtr`P*$eulm*|Os<@^O-k$sh2h!QpFeUlP|Lp&()_(ueqvUj2u?<_RHsugopt#gOT;d>{z;Af|Pdt=1RN%qfJ|0w#u zVN&icO*BCR3MUo2-*n#zh%tye5;Mr^$=LUWBr}l+k*>^Wv+h>{tvx1qlYwq!I!4j=S#pA zt|-CeBpk-pK5?iCfJx{||BKvpjy&~z?MNa7mlBg2dt-AVx^z|=4{cRc-rrIQz}v9Y z$I^r)L^VY4JvR7_0;(jImw~|k=9Z%V%N@t%$%X*j^F#_j5)^KNCuE|P{U@@2)h=bX znQ*7yK-g>P74ngQ5_UzE7GrlIXtUnWD%RwFkAbGe%SGquy@?yuXOKF=oQl5MW^g5I z8-q`i>lfAyPEkOxy}K_os7AR?Tb_~9`qEcP$-z>foPI!DfF;7aeCqQjJI?p0EUzDL zmO{SbcPakSIhCbg1XToEgtcn!dnFuY@OGA4IKNet{@C1m@nNU2-*^;P01Di3KzwvI z0{l!trH}aH#o=_MXwytdZ|O#P#v3EFT%dxru=}+btc$*Exj>9DVy4t+t09D=Bc3a@ zDgvVcx|k3WL&cWr_ZA}^ecuvxm{8Q^WnGswZR$e@WVzEDqmjo+U$MKQtnjWzEtUjO zGSy|W^3f+w>MVteB32LL-yX|7Q$O^C2Z((n;OaLq*9CE(+W#odkp)6d?G^;2E`(G{#$>TGf-@Is-sVxb}l8#E*!)vIiqGjj< zp&UE~=(6hM-xuoZ%7$bHsl(#I0+LHH;@>OdlA{X8icR9F?ri(u;A>+BM;`B-*2>Q1 zlESME+kb2ouaYLTmv7+WT6i_6iIYnR83#0@jhDe9P*Y<>le71r@Y}p#w)8qJ&;{fq zV6`B19X%#Q%mmczDsi5wyXD&J(k1r`J63T;)C!JvAf=oEwf-|7dYl;4ny%>pIz)ec zkBQ|;ce^Q9#Hdarmk6fzh?zx|hUi&K7Ku;mAb-T=^^&OL;EN3@9ajFUVrDGFRb_^D zDPNa#wf+)%H(;>r8(%_dWAkn#KKpUv$vTVh<}u5Ypc0~b;d!Ov+Ml_~8$g2LGSWf} zrDyFA&7s;=<+ag10fD=(ff`k6HU*|kCry*}y);cFRV-9}b~g@Ps+{n=kwVNldd@Q& z=X5)yLta694p(D0aE$0Ezqb4z&OB*lX5gdjpILGo)gYTbJ6(S8KzY?e?uL6=5bzv} zDKBcQWlacWAMAXCK9RuPpn$h~8;mBA2R>iK_@Rh(AKp?pX5m8>)O^_JWAe zxV^BH4vQoIKOsrmo!h~Aue(4q$v1Bt-)G}Ta;@KonqSv>?}*`>NC;>#ab>~&QDUu$ z+0$LdGNh$CG2WhV^rLbu3boNFQi1-CfnwH9#Qlz$IV0Iu9&cGn7xaCKl)|RY8R}Gh zxG{)%`VfGVT$@t~A(aN$*I)AurJF*1w5S0F;-u9%#<;CvTnw|EaX^W3NS;jW@i8W| z0m!RP9W9~S^=Jf&RHQ%9hjV70H-9b_tPTnK;gq+}LXnm~#$AuSua!OF!k@b9>Iu2-;00DY5Kq@;FI zzT%+vcZqtp>&*QdG7_Sou5IP7~GuWei> z(x4aG5QL;nG{9xy(@UkAp+0RYkcY3+dKP0kM7rMHi{+^SdNVZR_bj4}sWf!rphIX1u02@9bjOikHcMyP2X@f05irbq>EVbE$23X}HC-zjtT#G?9EGBXw0 zXSYg@w@4i)o^Ny@QZ2XS0VbDu;d=P7@~9LM3tl-D$!KD9o85 zXp>lfL(T%vS8(%c{#*~;-v~>OSAecf^;d-sE`XLC(6|@X-4hATg~`alncnZ9wZka~ zb>gOqx%ZkGD5eEACdF7kbt*F;3P$f6x1+>QJ@G<9tM!Mu4Y%`UH{&EMND%bnQtW;i zl&0fq+0u~XyX-1~UkvKY@?;xT*Q`Z~h|n6jp^|WoN{EOlf{i}UNf{NkyNRuVk zVtIY1p5R&gJ95WpL${$pib}sTWVenTPfvRUOrbt3z9Noanb5jNQU@mK|B4wkI+(r+ zD6;b<{NRpdE=PTJ<1AD<#lK^MuBY#+0PIluIS$E7lE{l>Twta@=i*bM#0?~_bH81Q zh79V2y~Dn#ijh*ms!$WZ9B*uxnlD|2Dv5nj5bdQ%NB8!I9bfjV3x| zCfXwOib!MIKn)$-V@33Qqs3qoQY@9cn2c`z7Zsb6 zC2|_hu^she>HL6GxF(7xAv%sn2!;K|KMKnjXl{l{m0tSEOSSygY;RmfEq# zAKzs=<4@2$4Dh6gG?W{}*{3uSPy7vXIydlFW+na{$jNKHW&IlejPQ!c$`@wl1rhG-GOov6}xL zk}3A_I@f}fdw3tYCw7oB%IOnl9PtGUw~XDK6bAN%F+GOIT}lHpmuUOZ;A@7J@$WyZ5BCun zg~)r^kqqswX?Ey;t12N;6+B5_om-iZx&N`z{<|LmXjBj~e9v;ntO0sP{?ADLPX`W< zl8N(X|BZm=D?k&)Hid|Ezrz1Kf8wQ91 zoFkWMDbZ^r>{`yXml>Jlx>ga!iwD%lQg}+n8p%dP6vI+SaR<6rLA9^Ni<=cIZ_;ru zgcX}OUnZ~)D4@fnvK0i?92cxwYGzWrsISrE)Q!)5qswZi=HScxvvblb-xQ*^EIvPM z{|WTF3=8|$_PPE*s!TzMe$)(ZB@ylLgt%Y%T#BV|*f413!{rI#9z=XTPEvm?R#AQ` z@ZIuuZm!Un3=mBSL_|BB`%_Rh^zlhbb6LjU=Xw@ZbmtDSaFzv4@cZCq zx=tw;@g)UQ_kb%~L^UShA1@z)ZbG)1T&>k`dR)Od_x!5%_CXMjUT-G?hs2=kyvNe$ zTg<#|(DI4PZKN{L-$%yNQ|J7i?E^7->8hCxJ&1TifkBWa@VR&uHcHsX%(y9&ZMI+a z;@lJfpx8%EwEUc-AIjlnd~g3`SQ`$JYt%?b>WAB|jH0sy3O=?hqz&EQzw=c6Mb}5` zx16cuwhcoWg9jxY@La7$-0XX7y8h<-HM@Im@C9paZQYNz^UOhBSSkeKkeli`LdF6n z@4S~`){CC)em#J99p(4cCcNca&PjG<8tET%1!$hL#Yp_8uRa)zZG`1%ihYszhaH2- z!_c#EUETf1Lj)ot&UA|~li>`+=}mc5alOn8`Mx%r?JRJxwcn)*J69^-hk2mXfBr5$ zf3ZJa8YJph&<>C_h2da(m1@_sP<@C8v3l6PO4xx9A4?doOSR%VR>#|E>9-*&ih@dn zEys9I;iX6Qz;GWp1QxgqW4l-|A@Az$0MQrrme*gpxo$r=beB0r#_w=Rew$o%oNaA5 zjgwEM8nR(B9RP_Y#1>5hXoWMWdLdBLn$EEq_Hj))`YcuCu%%XJ5FYVHDr)p?!~M?E+$a|MVV{ z!YF-9P(uf4{RZiie{iR?P)vI^x7!7w_mtnp>r-LAneaKzqA;6iPJFX$m}dYBzNz%qYW+(W@ z1@r35@zvve8N9-B=rAiDRMG3y`32jP6Z^QmQ;sx0EN4JgMk)`D8Laq-ME#_qw4X$S*16WEoM* zUNc?1&rf~liN;-H8gIn97TY6C zLtO^gt5$%$~&o=)=ol7d6ObdhHr%)I?{ahfih z!Osu0wT^B=E{?NyKkqB9lRiRF#_yb-h+(|?Qo&&}pRqJ+X}oLlfu@Np$~I;07e9zR zpd>=O-LGUC&O$08BkKOFs?UDyGNOtcUv%(`bHN(~_Hk_lyJdYF1YfNaayVCsZ29J< zE?EliWrKrQvz(jvXL(YbjBaq#!(#ZdmIo{jQ(>>~?ND;J!wZq`11m46&ig0|l>Ewb zHOZZ5;o6Hb@idNj2v(}@+V_ZL4=%ynrR=Hu3wXJH8DT8C^>p*9lKktDQ$t*R#VG)} zJl7k`l2>s`%=py0VL!}oKS*de)I$*%ulPi0{L(1aF9}Aa${A>gtKHfJ>q69Ooo}EF zeBrBy(j6VWxT>Uhm+uDNl!_WyYLcOxVk8)#z+h5I7^XraO9$KKBcQ^#h_?U&HN>%C zKUX;9iS82(MmQE8*l6Ny2>nn|t-S9OT%K3I8SVrlI`DIwwTre^{bSLGhgB8i5f_9& zpeNtB$2Vag6`Lg}lbm;bjH2PR$ylhhQ(7&SWOP>05zThg_KVAa=xs758+J^!39f=^p@S)o zx@c!Bepad0N4YHeic?{yD~2}n1a1wIcOQ?VCJ*_Doe!(Ex!cb)Hsn4e3HcQ%nN>zS_gWx>tV8@&XLd!yKM%>vGP22sx?sF52}lw}q{hCSyKE>%7*D@3 zf?J*>gGs$oG`8s>&dQ_$Vzqj1%%LUrODG!fCF6{oPwjW2fCD3mBJCcp445q-t4>oe zp@u6uiT zDVj}ns~en&>m|DXSnU^MQB|GgdBx?w5|3N7xW*}S>h3(nmHtsM9uf=DfrzD+e^adW zM~@*JubD-{fsJaY!^#~g#O%KZ=`h$9L#o7cPv$>V$}ia`=hg8c^Ep?&__GBLiLQlr zu_yPvU^h;=7}0PhZX*%I7h6viC-wIMR6B@QKF4@rIp1Fot!D zrV+S2AE03oAb_V535uE(T=TL5!aK|hBT(v}oFN{se-DsoXel^}3e6+^S>fQEf;I^e z5}(_vumZ7rIaC~SyIQ{{`rL2gH__lE^aQxJxEAnd z_ye@2M^?!c1espc@sqg}AEAjYB0_@k{@G+D8l`|9u0s}$e;>WjJ)!86S;>t8Y&q9C zC-je36ZH3e-eV24e~6ObF(uGbz*tP4b>qFY!aQ9O4wX#e?UKcE7`OX9A-65w*hsGw zStMr;Q`NQc!#ZkX1{w_Uk% z+k^Z)>vZi}5e*dgovw@&^9?uKLjP5tc(d6$ub_~N(bhx$vOv;zX44UKn1kU5E{(LQ z)aQq{(L%;FpEkxKpYOD%bk4xuZsvhI)))a$Px?(4=s#i0W?>FG?)}i}GOx9}xP8;G zNREZy1yPFeo3JJ$UY*=uM&QAqIcuoK=z|oxoD&j8ozMsFeJ#ah&F{~*pa(KC_4FHl z+hY2RTzDVIeg4G?u1^4HP*@utGXDe%Mk<}zf8Z>30LDLA#~SsE+NS@vBiFzQh=-11 z0uIvHN21~fONAsNlv(bfVb<)xs4URssN;SiE_hZWgw@=@MvDy|2~zHeDHFpbQWok; z+}H%h@^NZy`VPajo=}O=kuiQ;i7#PMuk2!DG5(>`nj&Jaau{6Nx7eqpG`Ziow1uv> z5`h$xn9wTTqnxYfh8a+|bc34l@q7%dK@Ji@#FmDKd)O#s1V&2fMQnZfsft>s3X{!2V0zodUJerVOouVKf2dl*&;LK$Tx#Fd+&;-Y3!$- zaLftw0EkP$*oy6SVdWi;3^)>X>5(woK zv>y8QZgv%*IVJ!6*$eJ>e{V2QlT`=kGYb5?9TkALYbPHf+ki>l`yPKu^p*C-@c#Gf zQE+fo@Tu(jZ{C~Yz)<*6_Rk=YgsEzg#DC@DXbP*ZI1C^oUr?gQ_{_njv7~kTE_Fb1 z$h`P!nA}$Fi3($$ZUV|oCHjG+0YcJv9m|Eu>fN625U{_NPzLtbD6Ww&xmc0|$|>Gj zqu3e`(bh>t8@Wdvq#MGVOGhm(GpMq*bo>BsT_`NSLs_y)is*%~9eVBkAv5uE7#bsrF$hB;xG(gsBySiygzG z1)0da*YRHR&QF8}qk#;vMgy>?krLvD0Zpalk=hP+R}{)*ukwW%&vq^|gOn-pfc4z0 zUd?Z8fT`Jl3BR=vBJ}Wd_ZK+C5>D>ITOK=d)Kvsih;yRPrq(MC{(wiOG;wAd8qbLVw^F^sRVKg(vJ`2Q?7b{+;(S2?FsNG!3F#o%pve>Op|& zPl6(3oRNtVSX9Pw=JEP5t@vJ02HZxVf|WtoRWj)eGnK4p&mJn-!7)pUO`Wz*v?~P8 zfDAQ3pBoXE#lhQ|YKP)DPuPr}hS)mt7@M4iA{us8pU&TgeZK#XadQrWeRu7RxUwmw zD=G~0nN5&o39B-VJSsgYQWjgFa+@5%#R1NAV5?FEP!od@g<hpc#<6 z+vwz}o}ihUy)fH11UnFUZx?2}E{XyOm!sQkDPeBd0oBmZZoS#+fHX4ztZ2T+Rh@9( zYwqA-97Lbz2Zdh~gQi;uagsrd7u|cCu|}pn#f!NmP?I*X;E~G9?oR_txEr_%&X%J; z#GN9GZGOa(Xf#eb4N|MoS?D3<-_lD4NHVBdd2q*UA?U4GSR5aTaSu{u*lx-_jm5@FDH=`zs}Xyf9uts}uoJa!V$Sz}y3xf_cs|J{|7k z{c+kwI00#>g>^P;HX_9iJe8tza+Iw(%Pl#LH?EHx94!hu!;eV9#?U7;{J~jkd+fgM zY|5hMP=?Nv8Z0IA3{QViZ?oc8-IydyJ7Ew-Q55jH#XqnmXP-D$<7VZkAM|1T@hk_> zb?Iqd2Ive-&pikw>Efu*hF-+!0?yC=HttIgP=2J|S7skW%u$*CinZC3kzH)g;XED#K&PTd0KVJ}9MSwzCe` z8&PQIjNc}-3&F|Na=E$*dV)$b>;3hm&#x{kCcR|I2&t{0uIu`KPJ4GVJa)Fzsj?*N zoAy*4?a)8fnT0<6Ft5b%N%h#hci_6aS($@~4P+vi!I2SPVQC``WQNcCx1yQ&h`_9qAr zqV|L@QwLW^l2(Q*BjLN7*ht~8jysi$t*-7<2^zhL`I$OjVRa(lkeP?|^`x^BU{+8V z-XM8)GO@h)BG)0V~2EZesU!QTM zNtf|SD`fD=l>VyLit*nrC;t*U^nHB6;pk{Ln~usC?qf-PS-jk?g;c4_yG!I>mU-;q zhq1!Rjo$XEGEaaRNkp)*Vxnc{wY2}Euww}Cgq`IA>inkyxx(?%noqMsK+h#)5655% zgPY&*MQ~K;rWc^k{3Gv%Qg@cq>&M_V`9Wb?fU^`XyS+%Us8DPGPFRs!ee;u`sCt<$bS*UJq2-~uWuK?gzo8%R7Vg3g;Vp6|C z#|>~BvZ!xMu-_l?k59@iNw1Ow^LEsHfb;l0ZyCWRDGBfJkgGy|i(`L|_G#holz$Z@ z7z(8{Zl2r^NCJu zj>Npk;#zLZh~ewiuTM{(#aF|8RijCRhuSwk0_OA$1ZZ=r)nIqcR;l|2!SHjcg8Px7 zpNoVwvG>&EBPJEm%#*(gSLZUV2vYRxF>lOMp&MDt1pSOg(-8zj?CQ$!!~}*Ek>P1! z6l;RyDOIdZn#}#c=O2iXkuQCrK4TLu=j#R)o-8yKVHBv5p)TX~RS+(sJ_>mO-ZKP; zjLgDdRQA)#N7k~E!W$F)?Qwh~W9hmp9n&EJ$u!PSkM4-Z5q}gj_3tV5T1z(mp?7G7 z0Al@$ClwYQ1X1;MBne8QLD5lVtS{+bc9T@di#YE$$|P)|L4nQ=)6lQbk%=DeJ5!IV9z+I*2w8T z6mW$Rz#W|DDn^7-&{S=T45DmMZ$+syOJ1nXvCa>Epis%GIeBuy8?nIPA12e#XHv`! zj7eaeGoS@7US}R8*MO*I0#`^PE9LQX5+9gIMm$W;K6b=#*vSsEE=ck7az8CsIFOt@8FM^NNpAlfx_B zkqGx7q>3jiZ*MrG_KyrA{&q<_T|%HE0?8`lkyRu_7Ooy=ue>pNnW^oMqTm7prfC~? z7iG4)xtLK=d2;>j8sql!#=#}EJ=9aIlYOAdf8BKk4gRHca*VKq74{KB=Dc#oHFUd2 zR6G#Cret2e>At$qNvHb7QEm2?keJV2C?`75eD)JP9ANP5==Z(*s>d;09;e+bU4KbI z!B6u&kDmn*)hQT-I>^=op>D5wKt0rQZ{7oATKG9DJ;Fl4r`0ybm^50jd`V2CEkoR) zSC6K#O;f7CYQNff0|g%?o_p`ZF#ty3eztt?Dc~vfdiOv%$m3x=)wO#7wnS27)t|{; zm1z_4mI)gf6z}$9!GpgoDb`r%QrLpIKCfVi6(@C@%EYs~-Z&7sR~TyVu6z!Rm|Fo)ukV@`-1eNC4s zCA0%wN1aKPn__$78)=J*O{qHUBerg}F+RQntBw*Am>47Fq-s0K+t+>v@5YBSw?cFy zqSjMf%zx6|*TFn7SGTG+Vy=CE=)sy96#VgRWX;N_vA@afKLxA*>3lRu!Q;QgtTkOE z|6P1GLp=6DNN5MAFFc`_iL_>r^Sma4O#-y*i1)Q(TjsHAFTn z(P%+Z@-3Dd3js0~sT#e=j;Uh$ERR2~9w*UL{1fugXtyTIVI*DFZGj^Nao$!%Dy_+Z zscl@4^#Z#Mf*uh8bkF#bjv{R$BH4z^;NnA> z5Uc~Sh97?$5=$@%vKjS%g`nNJVLV=5gzl1=QI;#fE}n_c`r=A{SEqo0=sCp9v}!?g zh2SSkmDBZ2oexSWQ_$IJOo(4^@pr)3 ze$1dYP1pGes+Cs!9*=`Z&>}^++YS| z+SiTz^z+7LTFFMvM3-_ky^Qx$#Ne z{W^D+clInkmXb6SodR@STyR@BjGQ<$Uw&rTlJ7rsk zK(R;LY=HY~Q^}`IK-HIpfReAT3W(^C+4;E}1c5FeWkZmge$C%*zMpF$`t&wM!+#lr zq7@F7g+sNr!%U^z+3ki8nbF?excR3qm8+PciPwd%85U8zheR&K%#Td#7C$GBv8*=a zirsDsrRod1O}Li0xoTOcxn?E>oOkhNu{wBQD0~tM)2?6pUf1d3oOCS|1T?D$!xnWs zA7~!OrnAc479K>0lEY@rWIg>_#LPjd%TW$NoH(hvyPKt#4V=8y2LPqma&Djm$MvPN zLmf)Z7*k5gOuh7uBwqO(ZQ2dDiiD9UdtlR5hw<3v@=1mm2RGQc>k+n zbQl3g_0xv6Z4GVzE*Uk{0$APw8ea2E^>ZYOC0KUDgP&^n`W~eKZHJLE>osVu@Keqv*Te+XSvdPtBu=d6pbh*V#k57+BA9n2OOVM(Znj2)_yWOhKi@)Mq3Bf zbe}s>ll*-#F8!#I; zTMObHPK#Am3Z51T76^(1i?e?B--$tseYt%q8Dp@RQ6k@mwGX}`w!n;LQ}^w6M()A{ zo=ESt2i&df{qB1e_qwj#@pVby#tklkjd}$8lY5+seef37uZC)M8HiOQzhfw~75H#$ zbp6|ben~e6bXySa#))764)D9J?oH^1x27W1E(o@*DRSt#-p@l=0bMSLsRz^BqiIBc zg{w}skumobB^tCZ=HsK3j2N#^0gk+ABLx>81JRbj`4owOXj&MdkZrRRgh!F>HjD@> zPb%LEeO1yZxf74Ah}i}=rls+Mod9FZMPnKxoCZ=vW^ofWw))hcBT^z_V$v1UgyMER z80Hiy%*w+aMas1yhw{4**st*PF+K_boK<6k#sj-19L9(MQSc9icKoZe!%4;7*~3qU zi4G=_#K&W707VTvV7Zlbm8F)tKx9-kdOETbxWS{HO{Hp((0u&Yq05jc)TcaI?VYXD zkceKYO)pjO_5@~OaiAqOz)i5+42S+5f2Q-jThcqw=EZK?SZ=!8ZXS0bK_kO75KiE9c| zbFNx%a5sGk=3NC{l3XnwMbwigawIskhAs~8&r$? zBH;KKpIwqS<|ZHjW1uN3{`frr`CMRk{^oH@=X{wO0@Xm)`{Ur0Z*`?tw4PD(7bheW zpQ!^xA#Z<4q-#P8^xNV8h zR37`lRlq<=GQ^A!CQyrvut=A`%>x1J+n*PApYvl6QtVTKM2A z;whDN;el3y8WtV(j04`a_>T(+oG6!j0-^GEx%3&JHN&5LaZ6KC{ip&M(Nx#UDjXC; zVlGICLLCmLuK|nvlkmuD&AIFj>-wKrYhrhgcY_pvpWZvH?^4nO%eLNPV*EMd(&;lv#TGDn@1;EcS5X|75{ zXf__gd>WvFd7bR*rxYkzGm$$l3qUZSjjrnA+MG;U>CKhss)NV_Nmp$&XSjqdP*l(? zM`@t0*^^MBBH#ajFM&;PEEG$=jq+Nz?}H->0Z%g-{l7NvaDy%WxjCP_1h4zg07Xy` z6BdZDHfehsP!nWv&J(-?CbqWUfoMn3*57oYke;UXp#9?a{q+&upmF>WdP zMqa9yQcu;?3YQt7m8^Pztrzi(4bSb*PJqC}(IJq$P)&P)H-XE1^-j1^zzqZhl9c@X zzKE6}Z>WuoXM|JA3WqI;k+Q_-^lOQ703Yu>``meh@vMX6`0hu;{Nj`aU1UEP(TL=4 zLJkec=+r93AL3US@0Uar7wgygM_Y&#nd#?IIhbd}+mN;HSTzvjCaDW0N$a91hTT<- z#z5*ZoG97tZK9#Dslswm%$bQgs%I`e_L7BuK zipi)Ku%TGl;Z2+JP zruM`Agp=e~YqXN%&bOyU0>jw8HEjH&LR?TLvAF6luBC6aE=;*_;8cAR03!NtMw<;weInzp{le$suK*)GKoo{rrDJ3b3M4u4OC!iAAv?p}hXaRsh zS)rnX#k|dEIP?%4L-dn_}()8VhTSz3Gd+qGeB`B#mu>R89L5lw-Fd-_RrTR*b0 zM^-wu2d7cz1+79Y@hW@Uo;Q!Ne62eB;P{UPy(!s4a-JNF%=R&2c-IdsEX0uRpiR13 zB?zBtYFReJoi@(fPZ>2P2IdzDd|cSHw_oXc1aWafst0@-UQdadJPUng;%#@JL)9W? zek!E#+(_IGNNY3jp*|p9Zur1%B*JL+4?P&wWsy-*4JKp*?AJ$}^kwHadU*Pb$^UZI z{xRQLF0=nxFZoXwt|0_=krOF*&&FwS%5iXugJvBrgp5N}dOv{%$dDCwaJq-^RrNcEfTL&e*7G6UMPD{)831xt+;C+4v>_1J|%GIo7y& zAelW{UY*-WmGd6KZb-Y z(crUayxr(Arhy}6E#9yb1uu4mclwx*$X6DTR(mDb_e3J_?|E^ z1**40CO#%nK6gV1mxKl7{T}K({c+w#gRVZPbn{zkaKcSw1|rOfaaXLX3v#5_49Ow9{9;@e)^dU-|2ga;B@SN- z6#g_gGyjDZigZqr?NuL(z9tbFE&MTzzEdQqNXl2`)hqDB0#);8f9 zUSUAv`qd6qQP*#DW6-Eh$;_`+1pqJ%0Y>#M-?hcqXWX!;Ue`7SnyyiH{nSN)3~*WS zib5IrOuJ%xzC0+ZN^iwQo;mHFx<t(i%6Np{q^k z&!db95wa?k-IwdTdtC7vBScKmr)EJkUf%>m!K8Og^TPBRsP5YY{kttmLcU^ZaUW(i zkC)3*8*}!FT>8_aYQov>Z39x#Hu%7#{}_vet0-TAl>n5@o8vIyM5p(+MJ&4ChR^9_ zti865GimYcdeOa>(~3cjWtaaf#NnN;j)D5Nx@ILX?IUX$psFVf(O>a+>-@h4jIjhT z3}cJYB+CD+6Hv-0I5=BIWfpwyqZS#3PR!;o)G+Z!F4bTWjQ}Ty8m$Y$OnGCN%J;W; zT=|oT+bW8Vc@h7b!Z;IWn-D1fxUZ?6O>x9htm_i!H81{hs%~F9tHyS}b0rIyDO99u z$watt9!6gOdCnD+(!hiLM1#w)BzcKgLZnO6Ye|seSs0JJ2MYi6W*A4AOiLM?v#l#8 z=C#m_Yq9->o8qjm7?NqBZjn8Ew#ssXWyzpiv_J>?PQc{KDshgiP{U!C><4(As-_IE zONB_N0p=*{@#d=7GjvV_UvLUGN|%*|jbL8MPJSeeUcIQI@n@q7l$96sl& zycZ=310U?pnk;*EIlG`%F2Mzs ze6cTucS34mh$j(cXRr$sT^%I6+@k^`v>UI=elePZ%c83Ia;KOdcgKm)!lK?Rm6?ao zO;4X>sJ&Opxm^USkA6h~tpf`0Vi>=7C4NG@E%v=qIT36$>v{>p0Ic$SiBkRk%H!Vu z)E_N#&R)g^uk=L%W#i)DsQgYh?0F1fw)tXk`8;!|{c>*=qnqPL_mvg|eY>q*oUOGR z$n8bCUm3w_eAyWsPjo3L;?@ znP5$9;48sX)ln>_-O&W@XNcUlCP8nP!+6#0+uKmH`LAiRkCOkSOeVpCBfQ7b(lnc0 zreA)h%go_^AOE(DXA`h$DtQu8NS&{Z2|%Hs$aSIb_m-Xn(?CqHJ=`@i{1$1MrxLTZc34e^p8_JZV8uVMSyZ zA|u5B{yjCugRUk!645#%)Of8_{iGM_AsAq1-7RrRoGpOa1*y6Xixz2yOx z#shQ9HW^SAXv%|llriU3M6Rld7L6#uIVTFi0Cg4WqavB$=ECw1iOw_W9i~b>u)<}4;mXSV5ixLW93^zhP3DlT z3${1Y*nwvPqN}Jw#a}))_?2&r)z$7tci?DYxm)JKOBd9ewQxKDt!5?JzAweUYVoMB zV@0JP{#b)Z;u5X)E!c(FH2mBZN8|VXe^>y+q9#;-D-B$XtvI;{Fvgrc*sy5ecs_h^ zIgv*Ve4gN_=oYN@{-!4+3`z=YlaFc9_*5jVt2Tv%xr(YlZoD9-yRQ2x`26NII3d0m zBE!gpnoZnJV_844vuV>mAy&9V@sURJE6@3paH6^*YLilG_M6>OBe%oN<|3A5S7C3RL4OuYMwR6tPQ)L{$_rCg1pI}<7N zEObIlEaGd%&Zdl|%yOfN^TiP2xWhv$!w=j#re&4Y5Ag%ngxaMPO@{bxcV zg#MMXsXC9mNL>Jl24sSwK@@5J${{+Kge?&*umMf_T)1bYH(w8#(G2}hNIo&&ZkazA z-hP$`666K!L;~+_qwitkaN zm*n?RGB}FGkJqESuWkN{iHcRi0kCAz2PtPnf=#pIK_Wt+&paFC8S1NB!@B+754-e) zkbiC&O?h2m2&~ktO?rCzfe-We#LYmez8E-6Oa39)0_D``JNako0_Jp`(Q$dS;@4Uk zpS=W(B5Pu)R{`^|3hbv@FI;K@jeqP|EMvWKs6=-xHMh@0ccQ7GzBs<4C8M`a6VZUd zMvfVOyJ$_@UkZ2iMsOsGY_B%p(7lwOcU9Ezv(+?oujRZf5*r0ke~Y3-gIKNVqpzmn zUoiPkZ(mdi_u-?&s4RmB1O^CWR$;@-Yd&t>>(Hddu|Ao{p_cg1Uy99tcW0MD+?ur3P72HF8=%Ud~BzpSa>TnA+RqM zhKl01^tSg(4)}lQ6;437?|=KLUa$&UJwGRBI{*EL3DRAkVUCi1F#jY?dklrRvkZ%y z;0RUgDDy!AxmlD(=7i{mmLqS}0Wj5mC||Od38<(zKa5a`PWNM7f>yHl0T=xQYy&BR z574QwrX&otGR)Ag9qX;eB-{aN?C3<=r z;gAXEASOMmQoZrq>V`Qfc8_>Pr0dNfL4iiOTA;Ic_`ys}ca)j1?=6u_f4WqUDTf#4Dtq8@VV75Y2h>M5aHyrDfX)p zgVvR(*e8F^NUXKZ;MTkjzw8!95=Vg2sM)VyxqG2ns+C9RM!(~NTOJc2LXbD4z*a;u zLmo;5Q6foQQ8@a%#&;~TX#uh}S=pflDO!ZX_E>t5SUpR1NXb<=Af9E%L4HkWH{Y$| zXeiE;LPx}*_BU3mt@Jh>c(i3Kd)OHd>-}aQ>*Ax}2nvILl1500A;dvjl%IgkgiC2$ zb2%kx5w!ZYKb;CW!tZCUU29NSKog(s_9Qwjjg!OZWNs<%N%EitVR4!uT`S-hbMWYc zuO;BEnY}W_aNnY(3hH(Vhi32Jy9Q}cishNE6o~v!6=5Lnp|OzdY-JkEaHYS$J%rZY z`GP+6f^G6XP^|!@5RFfKs zl`e~XI)S2JLh$Q`Jbpp{{H28mM4MU4p?8hI{q^Oir%AV?n?ApZ6ayGbE?F;~VpchEb$R|rE(8^cc-p-C>& z&tmIMIlmzp$QgK+P!b1IwBq30(J}iXb=aDM$pUn@;ef#2Mg@n!M+p_8%*)M-l2^;Z z4W}+iiHigbNQwJCzbC8SYd8a|Tz~niBmpL=d$RaqAC2&2Da8=i+1E0f__^8=;|DUh z?Q58fD%rW1W{XfLNNO~Ik@cO^2KV}vnbT&bad8JW>j6&eae>z7`VTH!L%y?Tn~^1; z=b$s?=F%5bAht*uN%Q#dFP>+OyOw@7>ljC@UT+i|3GvM*pfS}oI8 zIo=)NFQd^83*!Vom(A7J(IAk;=G39xKPl=RuWO_DaAd(kJwU1K)_9>R(VYs}BB~I; zTUuel!#O_RXn0^EM9payd-I@lZ;vTrOeOO_@MPxLz+x_;le%Y(NbuPTw; zot)`OX`}fTD;I3n)P!R>F#IQBTh{PtmJ(CFyVg!i8`#Ikx0x^a>u+4Y z9yyCdc4P3|^vO32a#RVB$K-T37P27--o}APyq+YIZZ*=JSwhzNuKHCipl6d{vfJ zBL0{`x_9|O3dY|fWZ>eqcE$-nddo~MZmfJuSzk$vuAu1mDB*G+C6i{ zEr4RGip&{HEiIBOrmpzMve-O7-c_Pi3J-Amb{Kk{fXY-rc=g>pzx`j`@gI1eP8eto zWE6`6{gnQv(R7#qCh4g%TOcMoJQh#PSAR;2C?!!u4*ez)1&|-8Kuf6!wLVezY5ziW zlFgA^AGACi?!8S@q{Ol?Tgo;`)eL7dykQ1#Vnjd0`Yqo+))2LlA2b&{YgjzNWEfeT zHP*iDMun5EReU1PbnAe0lXW%|uVZd**af)VO{*@>w1q@R~biONXK9T5UhP z?D*4{m0uxdu%I~*m$Y;YBo!l-p8tj1USuiKt427{nDX8Oo}RLG5vS8!Nd6?GL3H!Sh}IQV2DzY8gz z@%{;LgN{LOq-jfgeMQjXpuW~u{Fm^um39S#KyG_Z8B}@tz*1agZ%kQDQN_9qxjRPzR{W>N^MhI}uUsILOC{JWeK|dO;z`r+j z1}oLY!kt1Z+J35`lxT1bo6mRh?ud(MmPkLXF2Z9x3*+k9fjq0qWA2C4cwGt^RQ7Iy z15egvC$@rh8SOW|3 zAcf#|uqxtVr;%(!H@mL3!s%@4#}-{@!hwbO6I)IPYgvDz{b;dptxB}d^Tbm19AAe? zvJ7{s3PTkejkNU(-Ps&eOo3Q5qRd4b{Cnr!e#sLAc@Xmj!^bx)g29L9A2LWrE_kAY z)oV8HZcb?yaF}x=Mo?5};a^>WTd;=G2ezm8Yp3MyKP6pKPR$yh0E`~XvLjCVUw!SO zRP`%zoi|vM^BrPkO6~`Ut=6G&FKq(y(6!hI3vW7HO%;?Pp}&~|rlBD~pdG01tW27g z3z^nm_)ju@;mDVvcO(+(c?`6MEv);)`UU&b#8AS`2&}V|cu_3u? z1#;Y;$x-nU1WMtg#%GXTzt<6*_U7MJ7S_WT2gFuzz$N?Id*cr>G?BsaqU*UVAhS9$ z&C^o~4drSsha7!y1nxoRu53fVe)39)-|5XTTZae-gv2UYT(OOW<(Kd5m($!@QrcQ+ zXt3f1ZHX&R$N-&s!@zNzosoWC3o5EUI%NC2B_`yJniPXkD0%M8H#+(x%Mt;o#d9EB z#+Prqo$vcm4M|1_m-Q%nSUbyY`c9hq9n*)}lNXS6{_m)`KDckQe@xse^OVCVmy@md zaNS+u6onQoI-Jb{%Z>#8yvb)Y9=YD69{mn>ZTNeafs>YN?+a3C#M>m4;`-^xNok#k zFLW_GbVZ7|k#d)9&)%J$mTXT9^ZbQ^#_FL%ZD68e7W~ckM|t$ADu2I%z9-fVfhf5DTKf@(-dlTP(;s8h+% z?NeLfm~}vMLOLpnUC!OxhXFW>vyk^G&~ok9?7mIiM=n4Kb;WhHeKWpHr5%bj*-TQt5j4d z4l#ZS*6nJa4`v%QtgZDqM%~xM+ElnkAaO>($X+C)&k`D9`TsS+04Rr9cCMlcHWbi7 z-ghhQ;<~L+A>*JgN>Jn?SC5_!TOvihNUMCFaKdZAyn3kffqiWh@HIX?!BX9WbnybF z&e>#!+2N%uS3<}wM|~p4k&g$b#(}5zYvB;1=aogpTg}sajZDkdxwefjX;by^(@J>k035=S;u|b02M*B?-tuSTq=c z(#8cJ^#HAJU^zfk_fi0$N35U%NXFqke7N)-Kv0SVShmaK^ywvm)pp4fM(4c_P~E0v-p>J=6s5n!CJ04y#*MEHKC4+npeao%{IKK$zRfjzdlggGb`HOpJ5GQM zh~t{IW$oG?$@A;$ujVn1}?#slH`epaCAFtM*^&xrD3n?QR$w%QU zr=lNL?RRVXj_KW;`~l!&E9@T`bwnYIV@aM+wjF;>%6wIWQ{Z%o#v#OwTo-dlUUta zXhxc)rN$`aKvzlwzQu9o9p+9c?2@c7L}m#>b3DNz+YcmMDKH2CFW;DUob z{}0ES#rNidA7J?EPN@qAms{c;PTmN1{$R*_+{ibp(-*wcWs(PY8eFq=DE`;}y_cbe zIQX?CfCcrbY5U0NdY4d_-vIyL1S{G~$C_FlJA!}(-2TV#zs`BJjT4F{Tk>KeXO>@7 z)Kaqar(%G!Db9N-Q4;g}5aMD#H&#Y@(>P>%?|J;5o<1O-L6Rp$_v`POf#2o5?D4ov z%}20^j&HxS+LN+9wNS18_#@r_U5Nh{HrLR8ApUUa*_-?Lc2V>RDybqgXnh53KO%i` zHUOym;Th)e6N1kW#4ogWVQ-!zICYlxr+WlQ=xDc)32c-`&)i}-d)rqtLEF&xIn*Vi z@x;O+8X#;AZ&U860bR2{!7(Ef9CPcW18OQwMB|IUkVz<>dP)TjU zw3m2|(dO1lRYH_I$ViZ}*r)OW@J^f3=ta%aVd;-_nRGZ0HQ5s!&8horS;-AyTQ`TR ze!n#}?{=c?DKy#N3hvA_izi<|vb3FRfZ~o|x6nA+z8LKUW727FWjkmeCIr**-@EUY z*x-hg?q9p|2>!F2L^#n%4~j14!@P+CCl}^C1RCZBD0s;pEgR7PYTIMB{VpJsybpVcNkG$lq#I z)U}M3SZSpeMUooBkyEngNa})~D3@+NGSaZ698-c}TM)aAvM!)AU$<$DMqV=va-!g2 zG9bk5vh`LP)_j2J6#}I^s#~u;;=^^&KUk@x5J?U&Xj!<~y@}(9fJa|{T~P39!dDWl zOsqVW?12!emlKqJd8#F2s#SZBmx>f|*}wt(2i=T~nZYlyQAclo?ey_JN5q1h&hh4A zfmjp=OTKeY4MqFy;=in14+=fsl>^lXe;1!kEmqJJ-X&V9diEZk<#1mA z=zgk#shvWDGj$~CGr0e`!xY^`4w3*YL3Rq(mRSyYSr~ z`X!Y^MC-j(u1)_3d^@|`$m!*9_C*&58+?F-8Mh)UNUx9plI~Nu$Tt;|>yple-Qt%J zUFv9(d0Vv2hiGri)x*ZgA>IAK^WsYQ$JE7*vwbtyv8HSv1O{OV z4RUis+Wq(*3g-b6Ne)p1GrjQS!7V!Oru+Skj>th)zIL)pWZpxYv(F-PSBDU@yz0HV z%BNE%!X2cn3w0BW@-2hvmKihJFXUzIXUMCd%>i<|0WC{qKC+#0%BL+X#8K=(q z^z1QpeD4voq=d8}*6XtgHX7bfxC=kC;_C!vLKKmC&|hCvSY|L~tC8klnp(ytX*m?M z!p72PACSiDzmDUlj*qAKVk+SLwUZU^5X7AOtPk%!ls?U3%>gKQyuBQ{nPR6G^@4&P z&z?U_F>z&*rROCDRhM4~efOWqu1p)eaaR7ssU_TEi0mulz~!Ptu2QQcG_(DeHUjF} zBB%ePa-Al*hX3cJ#saY<6-0G~^ZoMl&4ucvxUsrOX>MIAKRPr}=d|TFRa4ZPoKqKW zPYJGg%P})h+J^h*&nSshp94Ep3i2&D9&Oe8@0&T{MVt*uVM?lPB5sLt{}<^cx+{ z8y+HNgo=J3(|YzjK2SoSc$wP|SQ8vfAwB5bjjS-sYN}6oTON{?s#~+X3V44;1JdV$ z@Rl42xLPnAaSV*IZpvoEx*K2%i{j2`VJ_tlQDIFnfY;HTN_!pLm(JAxW25W$l_~aDK&c5`V7#S zQ`^tQ+ZSXD_&P$*noI8#tC&yYHM8Qo=c%a@-4EM?HpC5tnc{-PVVr9@8Ee)X(_2)??1IVjV6Hxl+U|{Vg zwID77am(vU;ff!NX4mCb_tCfWipm&jI#6ju@9zJy4FLlkKg&vMb>LA!cl$ceg!%g8 z)j5ncRL+-Jyt7oI(ChQ^? zcw2;M>{Y_q0)|_&%&HD7m zda7)QK;M<}Vd3KW2ha+H$>qz=o+Tj-M%bp#(SiYIEj=KJk5qDmi4u`lP3C}?ZE#bU zRI8EqGP*$n715Ytw!*>XImn!>E{>c8Y^~DCv1N>sjZ2hQ%<)5w4+&c@Q2#`i z%$8#EBcAozj0_f%htR(N3oh9A^*nB?dp6G9kI5$wR*OuvASN*d1*uZm6qKK21qs&NkFB&<>$ZmXe9-C(Y zl0n;iFT(A=)6~khi<|;RE~fj{Dd6>9?%WPnlFB3+`cLkvGm9`z=jk}RZ@*!#{qwiK zfG+Vd0GPI~oou{AU*bgk05(N1MB`y)EhXa%&sAj;))n8>(h;!N|FPq)dJhc#8J(bs z1BcXS1O6xuEOh%vprKy+y&$&dW%nk)El2I6jfu zLPxd{HsG9cIdD&A(V@=&~Y2q^AG+|AG`9>vx5CWCg(XL;#6zj zTx7k+$0fhB)0%IV1{}Daudu^eOveiyJVlfkC;eoks8&m|t3p^Nv>|(OME1AQY>SI-S$RCx6~wT=1w9VX5&`fB9!#) zO|Edd$FJ4>Rc+O^Q0S2@ae%}5H^K`yxH%Fe=jZka9b^Bep0DB!0B|rN&cw~-AOZx& z^N)%&SUD0-%{d$5Y%)Y)h-AHDl&GZC%V8yD7Y4yZ8kvh%@sukoy66@$>C?c@G>&3O zSf;>bCa`(L2xP}2c1_K%Sxo7H6D|T+e&`JcTzjtpDwH@+cGt5qimD`v!x8ENfGDt7 zbhM$CHf9kdS+x5hf8m&{h>5%Pm>`4Dm7ccFz-Uc`1J%OiDsE%I=Tkb<4VEZ|d>n z(WXn%P7J0n96sZszDS-N9_T6hFRiYJb|o_cQVR9)v2R2yNP-zZkfq{d<;c|-2D4M3 zi<)@X8D0WodcX7C;&9cg4mBm3Yy%PmRn#%$k-4h!atUmJ(phLzmie6&~< z)_L0$+US-D7(IW;Kgu5^FpDsn7ou@+b?XUuQQsrM{$%F*(pBu~fd$O#M5PEXVH4LJFeXn6rc*}e1{FykZlfKy z5`(Et9_6$>#w%}OzYo_y*uJ+|VFclq#z4qCzO3R&hPOC)r>%#M%grxFyv2fJQ-<1r zlFL>NMT`sZ?)&*zCn%iWwlFW(PHQ^T+iH#q3+7^AVchBbCS3VET0bp=SwXR)v0z?y z>A@)0SFv4>l@MPU!-rK5q-opJkS@D1VmlgiLhNosgCQUMXAlkF7*G}6KRYB6Nd=8C zEDR2*7tM+I796JIoN^jGzLPU)l|~4HMJE--L8%PUu?Z&bfj(9tsUDo zDo&?k+fK)}ZFOv$9UC3nsHkIhoOEonW9+)$Z|^bQ`+2@UsgY5?YE)h4n&(<`9dl*T zJ9~0-6W~p*V=?z~=0Pqcm^ zf@<(|YZxroYdZ`E)aAb?*C&$ZXawYhZ2ajZRjYwXzGhx|Cv*z+r-3+)MMbF>fd6!2 zhu2HC*$@+DxYw2ZU9>9huhzo*Qj4Na86x`f<*oJadN9 z*h|QHt_)^4lmxKk3c@cO!+^&hSNf2tlC)VOZx;P?Oioc`llwhaU8;H+0B>z0cd443AL^bJW4N=lBD zuPo!7<*qhbD4DyN`&{4}!4HWLYdwpO6DKN<8zt9fBLz@c{TWs09}j0djWAPCjgm$i z?aUI3UN<$SROV4L?1VdoRUfh%l-83#fe5`|Ku<5T58Me4V9jQfa32yXBthC$_vZVi ziTBwlq~DrD!O?Pv`F(-#>x!sJ#-ShTz{gzxq&I0UbeK~&1qVeDrLkQ}+@$(t6w%d$ z3$~)>Iy23iR6M_*o4n0nLH=}14v|9hA@poq$#N)I)>?%B6*Dp1NNKnjyOpQ}xgk-DmeG40Ao6m&!7WJ>tv zX=*#ayRDnYnqmRUSHA10hBru_56i;*)FrF*2ga1*)6y85UA(4%<_!MY#m1duqh4s*B@1g_9<{Clupe{^JgEA8X45pM6p-@1XixABp8pcIK0 zmf&p?>fmF*j1L3?R@2y!=CAEeMwQRQ=j^lJsV!DgxMK;(dg37SH6(ZbAZ4EITm?QM zIld1*mD5dAcwl78ptx@fU1obEZNArBrRhr5kr>f2XX_3m=^M+_P@Nx9??c#D#IoO! zP__5`mzw;uZ}=4SHMXfPzl~teH;W`zluMtvDU_6<^bpsiX2ja=vcwU1r6>UR<(tg;5vL!rB%Q{KJ)qpjO+TQ#t8R!s>Q?}t zcCO7P7xP&iu?3&>1c6=aT2h2${-;USgcmAv9LY=aqGa!!HI@)#G1*BPt~xqBOyTVW>JM==&n!k%e5=BF`gqDnn&9Xst z=md|uRxSLsrnt(0s|wH2z+l{ed_0ofPH8~Pz)v^R7RBHLPwj-smC6rv^jYWINkDlN z?zq7ir4LRBV&kbnfe1#soXl*64)N!*R~8y4K&Nfd&1UYiauOG8p{+nj_V^Af?ccHj zZU1v#Q;!7zYzY?g?6*LqF`;>!VC|tTkSfJQ0d8ppDt@mb03$LL#5OT1rlW&iVt z!4>AO^S57?huu2y`%_3i8rbnIf1m2g2Xere_Fo+yM&2)oSc=H{>4z8cy*p6FO!#rd zcH)G8CrxZJTN7_n4&Sw|lE|Mo?Kx3V%wna@Ewobk`u+y8qUrDsCt@(Vv>Gj>xpul~ zO>_2!XTIEBpH>z7gi6=d{t3V)w!Pu5z2v z3I14ue=8IR13nb}i3}dIA{4(Q-@t(!YEaj)SX(rf?%&cx`#2TaL$(6eaj&FC&Q5t6 zG!d%V3Sy0JDEsh_5B0KWDOT0x{<%(m;jzuffr35idcBog+btj8_?)^5j39Yof7`tB z#~|?;Boyhrf2!d3-99HH`}2IeYR%AgFHc@T(wmwARuxdcXX^IZ8V=mKYtt46(ft^X zombPu!O9arT|O!w2m3U^S^KBE?BW}JRZ7YMf~lseMlkwmOIfRQn?-S?PU^w3Q}CpZ z1kAkf82Y{%h_Vc;-he8L!3N$v`sW{@>Z}0vJhmi5MA|qq12vioMuD|_|*{Bs!;JeavEZ)LdJr0pkWuP3Tr|EO7-!!*d zHoqryEqfnsJW2ZS3eHD7R&-+r_>Y$jsmQM5yckF4F1TZA*O?N(2xeA1ME6qxlmQsLzKR_i;>0LExMY;ieBIIZsAV6>O| z4A7vQjL0xkoxuN!4$$eYwSi6bid6yh3*fY=%aY zO^~+YhgfW{nNv$r$pSBka#I$BV`}D!CA^#2#iLoq&%-0(&RP${nUKJ}9Zo0Otto(G z-as0vD7uw&#ou`Mf(F{>4IM0a4Y0U|;1M9*J^wHpt!o!sAYYyT;18K0&Bu*LG$L(A zq6|tQe?Sq#i*23{*k&-R!$v1e{>Od!8!-PlGe79+Gw*Q-my?DD({KtrLQ#SI`p-mL z`GZ$EFWfBO)AR))UYZXguP*NOJ8`j_D{l%M-0)?l9Tyj`AOr`c-R1V9k7}0o4W{9c z>=FBdT*v8E6szwR>L>NJ9}nV;h+wsH zU~a%`7>d>~e)b4n_QEJkOStu)ZnJ52=RjJBy8A75tPBQr?1j30PZfRInkm=Wjw||=5Rw-^{kyTUS$zf#f_v10O}iH_pNROYPq**0(6&xk zRlZtfoxBK706GpsF6?*3SP~e-KU>fW_5()X;5cKHyH)ii+g-FLIUHl+r6wI7ruX-*!CB30{Ramai>3K7w;U!iSHUi|T$&2{=ri#JcN=AM#={PW^rN|5*s%U9rFhN4qk^q zOIfjofO2WYQrXhH`-{Ak@2*>~;46vpZkZB42YBp#gEpkJUvGtW6XcJ3iQR;;{$kyD zt+Bw|St=+U@AbQLi6a1uMMKR;KRah-UP?ALnNN_!{p%1wE1Eub;Dj^!R-a^9f9NV| z)0*)b3E^v155C&8mfN=@SSnITv10o!f5Nf4%O}gN+od*0XGoC3S`ugFoW?|7g1ojg zd^3GImJ&jE^zhgj`A9)6!I>J;tSIDbf(E|qR#~=QRQOxDeZ-rxbs%@muE{I;;lGDI1@!zw#Je~MK5<&V_NE){FGG!Q{`S}pz z^jvW@*%RMHme~8Q$rJUYa7J{^-97F%+BqZA*HYkh&rf9EWBje`M3tRdWi6H3qw$33 z$l)|D6OL(WUV<@LJfa(1pcmV{;>0$qf%3^T5vY--dE2N=FDGW(2l8lK)HM3vgPPuhmW#n@qf(rM-CB#!p zoUMEWli|TbL}K_1lx`}_rz!-uCH0-fwmAXeFLL7LsqNm!-l$OQS+8_7MZ}KB!C^y0 zG<5B8uu)bvw48HR3?d4vU^5rLmLA0|zzKu3q>f;^AK18W(eiX4k$1lfIMKre^*I@x zN*$j&lURX%ge{K30Y^AU%xjrprav4W5L5zxm5B%s;8Um%gq7vNw}#C1F<`z(M>p6+ z<;4gGKvT0M?d{*+O*J3G&{@7&TQMSedzvKSC1Xw$c%rIZ2;!Y^Ba@*kV~`)nhzd1H zBIgdo3LKM6d%@*nMXr&JlDYMTb&BA=2#r8qko z{`Uf`Wmp=cR!gsULm~l*|K2)y;`sq4@WJ`XGC>f0aQZ;>)VOd_Lb&@~-aXB93NMHV zO$pTyCQ{~~?TR3*&HH;ok%zHoS0ykB&@(2;-I%&45;#_;QC_Dte?Vr0!clLIjN*oh zB{QVN%q`|)=ec1MNjBpPDH9Bf+f?{ToAq;R~@xU!Qz?_ZmS&iw`M4>9|+ ztSZd~WfK-v<3Wuv0T)xi=d9iLu_+Y2?r!&B?q}M2&-s})72(F)`Owj_jLvz}bJ#}A z7k?*#+g$5b&RNSwWHDBM7ad**4BqC&dPTwOc&-5&L8g$m10jjJs?cTTWF!2ZcfEB{ zC@q8+JIv?Bt#_X-*!80_u<$pKl}GH6wpsAExwsULN`0T$oTumHM_gu22DP}Yp}gNs>9lX~Fw-c{ zzn{YYxtr30gOn^ixLIxRzeKJPHac0AlzSYihJKpZ?*#S>kI-P{z3<^<&5P?Nczrl-G+>nf-3@AlYjU2t}YP zAl-j~nT7{4RQjTij1|}b$bVoA!k5RJSqB#s1>sYO7_l ze+}PRw=JvMawl>vC9@Aa7D?*tcTv5|1e?UX2vk|Kx)Mx2oH zyVb|22Etj32ugz@L3LoleW3*{#)z(xc_2Gej=nSyv*)g>!Bn4tZZVFk>s;QolcRxN zw+6D^-ACO2?}{yu%Ja6WKvXInaqA`hD)1=({Y;!vYew*s^=;;J;uGN?&Fkx&z<*2Y zyH7zH{@8tYF>8f|ImPjl%dw6V0&*~T^Sk-B4cCFZmExV2&!Ypm<3%6M03g}v+gU=O z8CB$H?}t;)2@b}My43&NOj!vH4Lm`M_qZyVk9( z^E;4zagLt^4^LK)^vW-Df;X>dw{_H0G}>l?mY&f=;Si0{Cb&?4KkzZCyK9%Ztx~m@ z#q*8h4frrCPFneIQHR7S#ZcB#{O=~X`Zs%^NqQ&MWE8>ubheyCLWI(fGZQaN$_rYX zD&m9esG_9f5{G?givqSzJb|mM1TV6xPFgZ0Udg9uM$f(0?)SMKW=PRNSCdv0%(Jje z-!RZZ=y^CXMAU2iQR+sVZhvyyBOKm9;vg#2-!#@m9S?T&)uq>`(yg617d_&2lm(r{ z9@d>b_12m8>1cDZ7}6v|$zjaV@CU!iDH9y)3e_4*1SI5Vf2s77Z@K$!V3w9-e;%`{ zG(G$;A^txd>e#-0M9(g~BB3K!Ge7>#I`5>NOU{I|xxR zOR-~SMia++fok~eN~{@Hz{9_@y*$L)2_Rqb2#gA#8^Tx|%XsZ6X1&()kE5CVVt3fS zM!MKO2fdYafjPm3syCE7!aDUvnhwp)qKep&1lxEb-YaX?SbHFtZMBd@Ab{fMPdDa9 zZDRO_&{Byo6)f!8d;<8*$dXc?{8+?wDM{Z`rhCbouDsYzQ&ENy1=pE)<*|niLmOR>U~+)>U@I?RQRz@`P1{zVi@s;Z)(z-nTM=1S6rWn8 zxzad%oFh2C;jF)1M_4b(Pv&^=@F+%-4i6=c?V7(Sf&T1FS8;(hR>s?jJhI1$Dlwur#{D|Xr(p@J}WvQ@WA_f`)%GKy& zDYwq`9xvFnqqdt&x}8^CjI_&hhnR?sN^3M+O16_w=zQbEFW_Zc*l z&!xzUP>#2}I*QA-(xT3fsmEdnS6$FO;wqT89_UC94SJOX2L)7B9T!i-!WI_@uwNJs zN?n(_7C9~>VG{DUhV}B?e+6Z)g`iMI=%d=tlDxFZxB0?8e_{R@l94r&6yT&I`pg-P z>~g-FZZHH#kX8uHkT(8p*Lih>^GL{<8_;Us4I!GFa&n7Yria0ZlHK_W z%S&0g%}cE416~6MlX5r(OdoeZdCpV9U``aT5k#0YH{R}d#pT@D{5x1RApQSX0O~i` z8Thl~Ff2ua0N|;o)K+AZ_9&Bdh##}D>jTymZdl(FH9v{dSJ(TgO8~l(;}Pe%|A%Lv zs0%CNd-3ar9aJty<{Ot3^380({QbN95r^Fi0kumJIW*m{XX9oSQ~&3~r!T^bXYK1N zCk(toHk63S=O1dMxkq*JPm2vnA#;Lc>bj!iA0?AiQUuSMd#{8q4B9KLSt?cH*DFa^ z_c+Oh@Jdo|_DESK3}jxiF{Zy=_AQA}mru@w#Xl#=ljX(|^Ppm!DvZGp0iQWuf8p(6 z(9NS%1|Q?{5GJA?6A0VCg%8fTOE1%(;7SHdi0dkYC&@5vlsX2nWzgRcB&tO@8*P>x zOdEZ=r2LoIDoBRQnPZxjeSrS*>t81&a|oD(dbT@v=9tQ=zJw$N9^)pKzS6!7D`BV5O7kgAIf98E)W2AP$UK=@w+vz6mmRwACqIJV@Z zRgtqjh6dc+y2ZqM__zbrs1?isfvU2`gO)uhOc#$NveK{~!n%MlGKOIzuln<+_~)miFpkSW5cO_wD1iF-1R=Il42y6;S`|r6P_-Y;n!&~a}o&l67DF{ zzt^cI5xCygdwJFKw`L1G0d&Ln>;s{Q8JNajZOJ$ge|m2kKQI4ma%=jA=?(ryLwjvY*Wl9Z)`L1tM*OPx z25N@fz4j|HP0b_@u5tliVSOR04L^S6hvmO$0>K(PjA4ouDDZ1yj&s63=#zbYxtm*8B2}gR4u--EQWH1&l=|&=vZz>d;4K!$eNBwrzVF!I zFT*fpy3vEcp8w?VeUhD%s*v@OZ5Kmi>V=mfDAvBhsh6SDRVo^0Y*Hte{}~E24i5G= ztBv5ip(BXO^iaGgTjAM=7zzm7JuI=%)D{V5 zc>~b>#3Bd;(&oI`ROi(` z&XN9vgv{N9PF`k79|WGDkp+k$2-CoE-amSPGS~YC8+4>d@!z>=9SFvdu@C;1L3$)6 z)W$xh92C|$#Qva|AlOz~fx-+4BH8f8uf7yKj(EkBpA!a_-wX1C=y*B(kJIyC)olJs z=WCDaOOcvypx*Nl5K=*h@T|>W2z+&af!jg%tWG%ll=Jr};=cDQ|1096VtzlJuW`Fz z(CVX>dW5M>*8=mRw>$BjEQzW93%y{68UY5wEl;Yg?p%Koq`UGaW>GctGA;BmGKOv# zXs=;zBq^9eiVD~x_q|(^zffr^=&mgY5O|?Pkd7{YwWUz8!b7$}FxCtG z*A4Q29C|?}Xj=D+hVnHGY5(!279rFq0dqt0Pmb7DNSOOqf!HT@*%}u%c{M<#!B9*DtgXW-RJh#HRKccV+ROK>A`nT#@ZNQp$qHUt_aSTdLeGbB#rj8UpmtH?* zQ6d0_k+Rd)Y#1bU4-{43$+-ic&?UWpl~q-I%-2Iio(IJCm}P}6F9EjaxFF3;48uZG zT8a7B0R8~pX3L@7-A9np{5yg#KUxvL|e zhHWQYAcV(p@0an64mGvHa?|jxoofF%sp-8OU0;vL+62vssP5HrxjK(ccYS2Y z3eiSB@5lW$bu!^LINp9<@}fhluUjO2$7%lwFC10V|UvE!fZtd4we>Ry-Gof!u7?|X;u48IzxvB_qK zp!vkO+``^t;*<7>$Cnw*glQ5IR*Jiq>x`&!72n=&Gf)dp-5Z>A|Aay5E^vrF$5Rklp5z7764aVWhq+(K?g)ZS32dOjt;% z1u37yS9ul4jkn!2O)<->fD}S33|tRmNd_EfL-ldfCy3r?*d!&BO$)Lei=n?e6j{0$ zpt8`Ymo*;*#0*>3G+KgO9>vDg_gtjIJw(8>5a>m`| z?Bi#*cqXT=4y?FIEte+5;Ym5$Wubw&-9agWujNci4!StzWYVqUzA}> zPe2{@@a5r#HNSba?uK`n$uD^HNHiUycqcFtjOI0E7t-99u|WJc1wuhv%pE>I92MD2 zotdMje`llFe_5QhG@&dk*_PDhmSX<%%!G$vpGYV{<-`qz*53#)@t5`Gpptb_o1Vb8 zGde8b4r^3WABV8`Sm~C)_xFgOZNL-fFD2zWj8ro1MI)hy0Y{nL!BdM(3KiFJ$HVh0 zkmnTlI8c|L=<@HaQII!Qi0r}|3-x*|`e{@jJ&}Z;eQ)EkGL3q6gvtm(iwG# zo~lL(PdL*XP7ep91dwB0Cj6ApKtM!sA34!uKn-f7Y`+tK(sjA<(ywK%lcvpxawkk{f)HN2#aHnf+$%(K>3a`^W|8#5iG%M$&<> zup%@K7wgQo{>~;tz$($1TJUKKPd?aXQ)tnNu(-QPh84^nRIh?O_IMxDY7z~Lcj~O7 zp$E@Zb(JYaM=SWzmfOI`5Ghl9X@;7JawBV!+?Y7R9l(CbH{DvjYdc&#lCph4KFc9= zlZ1^L*|Bs`8n8tMDs@Fe#x@k$7{1SLo7%&(J2APrCeXhav8RzYQ;Z3Rz5e=f)N1u^F8A*N$90H%%^4la;m-TAv8N?z>SN zEe0q1@FP*+bi>6;6(Y}rLQruVe#e{sh~g*T>|AR~Q-Ttsy+-mV`?z6b6iD|pDdht# za}(o+!gKkCM2s#8*oNC@LZna&HMU?R@Wtxp2gUspcBS>KY^URP9GJ=bZGuB7MM9Fq z{P+EkNCkUgUym3Eh0g}T@>#;rhX+Y|!IzAZl{`f?R7Hb}?cTRdT{&^ul$1m?WHYRA z_bPJQtz;Qa=@EuE35HF68)&9v)`f;JWGgW&Fng@^8?Ti_u7_KdJIhb9Z6t5Cp;KWP zh!(bQ7ZOhhcr76l{%$-D>aZHY#HG{V4b&R{8WWESX}aAV%`z-Lfk1K>9K`)-Z_@M( zHErrU%#IeZ~Je+l-*n!@zpN?$*Z|XAhnKZH}{p zsszPlNFY(l5q?j`agmUOO?Ni4>?WsC?a%`$>+geeLv&hdRA>y8Sp5=S{-r7v!JLtu z+=5xf@?Xi4)S2)*L`pj$v(W8{gtCj4%l$UsmQucFt4-Dy+m6-KuD#CpI0la(HtC}C zdOVaDcpSJ8N6AvhTS^GCQn{gZ$u)EzoK3p5={{Y03`?;WN7`f@f>qyahb~x)I1FRE zk;q6ti4IX6??_pC3wcP=VdqvFLuu@Hr%}2+5w9Ooi)1I7sGDeOq$0UVGvys&sfpvK z9WE&_j8a3?&eeO0PPWW$w-<$qu)Yw>@?SBGxp4vDx#cyj^sv`YJH$^5<^FhU zBtaFfqAss8h_P3H-UJyL^BCwYcB}pr2sQ-+--i{R0($SK*la(oIl3EsP;lAL^EB?J zbM*O8KM+zQ>T-CxX0rO_ebams67~tY-xiptaM7B|XM0gUCjuT7FAP5KfuHKkX)f~c zmQ7wQI%1-MHF2y4y`Kn32JaVfzcbU!p$5?K$U7F-H(1~Df$z^LW%rwWjb_KBuP%z5 zp}r094a{Ow%fJs@ny&#TmY-tnl}{<2tj~+^YPRnO1_2%-*E(Oi4#$z>$cMj8zO*ju znQJ7V2Ts>RNO_}wB7hW_k+4@2MmjGe9wQEi71tG5l46Z+;nBR!g-rI__?$g3Ts*euKX@>m?~pD$h^+w$JqN>KZiU~Oe`~Vcp>VDj)+50vJbx3ta}5C| zo^&jvA87B;NykC4p46)W5B-?qjZw- zQAf$1Bi$oNm&JtTb!-!Rvv!r~dCCkR*Q3_`hjqj^OFJ;qvxn&?*XVtQ_6U%I%H zrQ%$L58W6#rJBQ2pj0k->#neVm}!d}Vb=>W7Z(PPp?zrtmx`FTEzl)FR|`@T3s$bP zE$lMCzoPOA^vW}jEyrfAsD{j|`XmBRuS617%n)u0+}CEMMsH2TL!eW%#8~WZ(j2 zLA`T}Av}{!;q30ZO(J#IkcIwm z6V@xT{6j_v8}dW~eHoT4hz#9A8QwrFdE6>BFKwf>viCD%5OT}DJLo^el@SytDLA~s zlOxv_QtQ9h%ZyUcXbVyt_sxF5EA!t3@1S)kbN!gx`gxYp2L_mBnT0pX${xnU zRTiZ#S044hULelhPY>jKE`f@5|2_OEr;L96{TlU!Dmk9qqOeRQQQnRID+c{ov<;tm zk0f0r^(eqXEtz49(?f`qEpY}JVHc0B`|Q~FlFWi2RthpT4KO|ravJjTCRoW6_=M*B z_nU(Qm_vR9uXgr?EJi)aCPf&Y|4L@Jdz$;>^ zp9e2Fe$9dP%Ic|Tq_Y}SNN=m~7@F%+=?X2$NGYgvfe#^?6yrCDXMWB8>|uz1GjA?E zV?L=m(|@xQtD)cN!MVEVbx!fhan+uXXLO7#;e;+t5V4==YGX1Ls@ub}afZzwIeC-m z1&-Fv>Pn2l6<*1apGx58-`{_QhYmgMVcyOmj~dZOBPure77;11x9-irz3Q~Gy5W4Q z4~p?1?XgDO1m0r_I!dYu4q7xPYH@Nr9m)kn?K|ruHDVST)D1da3pRo~9r4ce>3B@W_5QC@)e7OYkf4mE@nV{VL;(c^cjOuMQ9B@-A z2=nr-PR|R2QJ*_vXv%Zv*Ht(C--(&N=jgEB7VS(Byl%C2QeVk4Onke8ux$t&rZec{ z;5w{JPAw|J1d1Phc36V4v$B8c8)Pl%($0kiJjnz0@wTu3Z!cve)L`!$L4NNizvE_7 zCQ6<=H8be6RNtC)FEH#D)b$qL`#Fo3u69k4f!bnhtJJMT@iNyXKjZ!7%fBE3nr^>% z{M@eL+oNLJ{yFHP@|;a=~N^!J>JBKi+j`JMK`d zYN(r0bjghLQ+KI>MGvZ7#rF@6rcqW~mx8Hnt-_4yH{7!<9o42j?0oN~5%%yr>4%+F z(1@6`g3*2ostD3>Y$$vnE?2DAeR7OP0G0_yqkELGEYS=B zWre^8wkeah#9uq`L1~6ufOZ0uYu~=s(qK3Y|5Kd_gZXViO{)8YxSH-u)7AA$^SZDG zDZPJdHqd|D_W+Q`tK4&|(fofexL1FLaE7bbu!nlV@6VvfYK+23w4;lC8lTHu!(}ld zCqNYeosHT=5+qx5gU^(HW-N-Z;cO}z`QRC|)Nd)X75t)77Jo#)<+@Zviojp8{Mp)* z!Aio4BkJ-m)v7Kic4@5dD#&Ps^ysa@1y2|AH9xjrk2+YiketqeA4P>JS{xB3qwEod zXf8oH&t%bf3L$cbE=9Whi%4&xIPJAQjCRDE3wih6Gf93+Z~F&@GMi$62+bC8+985_ zVpcaV-l6X1=eOZWwN-SZq@j+GpvrHq+Lgt;U&!uOrJ#`@n!}}nMjSP8a&UM`T_EKv zz!wo<@P|jEJH{Tqd@uZhb?tA)KhQULSpkPd)A$<#0~bfF`zQ};s`C*8dce$Y)BJ0~ zJvN4|c7<_4*KjDrWl!G7qm4PDTL>#?RQqY|Xcz^bF8$hkT8@?|dBq-0qshag6=jc% z$7(eH$C+;1ghuaa!4HY4`x<`MFVgIeTT!|!`zaa+m5TuR>1jkL>dKg^-Svp`?K;61 zCa>LvrEW+25?_4#^L@PSnpj9d>kc2vUQC{P_s-xIZoy>C-*XeKMOy(C$_CX?T++vY z`wDz&SOfh=ow#Z83YVQ0{n`IIWPEt7gW*>K0cn`V&23|N)5xk|0Q6<=GrjKx6A&W* zt)CPM{7AYTih@iA!;S!a>3VUipG%8+5@oZg+g%ln?6&IjJpqVV=l|IGp7*?y;E&MR z?!Zsi5Vh`*%rYPme+7KN>XmETPP@{BZScp=TN#$99YH+Jd>fBjc?lrh6*ZdqHFj3_ zvS!6i4jf2{MWmY#{G@@vK69X>k3yw1YnTh4t8Bv z|L*H_r}hMv>*uwz+f;x&WBNz+PHpvI1^2OO`D)vjZx~$r@3B5HD?yjk*vHP^ac4VG85?Igw_?XhM79OHY~8VUZF{DGN^Z$`mLNo`C+G<X<-j%$3S{6&Yc?Hqd|@(ic0^l6KuZ7pPU3#?n(ev|;L$ z3$0~>P1w%35dVkm)XDoFU-*0z)9Sw{Zk#Yd3V=QWqas3h+>212f`L9J9G1~vDWS%_ z7Hls)Z&sFN~0_?0TfDBENP|1KF)#t%(+9d zqX-rUS#zopk-^{ZiSx^{nWoBEbsduTF9+5p?_G9^Vbv6XpZ z4hyUN3XV8lCfJM?J}oj6Wxnf)C^wmOCO%YN=uU$ss)<(>G6imeBvr*Ya^xz>QrH*+ zc}A90{i`Vs!&q-C63h)m4kvaoxkWGunQ^M&>|)uP1U_a&2xlZTXzRmEWa^{)4tZA^ z$pnEI+PAg8z?ktFpag(m*cglaVG>Z7rR-oRLJ^w$1=>BH+n+2;8R;4gt@2ScpGOQM zp^J=L@>dQDy3cUiUoEG`o%%aFDG+tQ$qTkt{}l{RyBa3msEzbSy}}>m<;kW|zpC$I z{i+`}-wVg!={SNydY?L0m>U9iip2L|-7%bNABQjoOrY(7H{%z{S0%abJ~K?u5^l}{ zm(R28pS)-1L4ny%m65J3O^ReB#O?GL5U8Gl(0=9}P-^KVeJMYt2f2U`*zEy#_D{1k z{#dvtcEML<7$qI-YwQpV&mUim1fRY!YSk-A8m+={?`u9@ZiF1=`H{5F2xU%mG4=@M zZvo+S>Y(d-Zr(95s=<@xo4F#P%vWD6iAUy#0hmUmD=Z*61;Kxrg$S{x6(+TY^XHUv z+b06~Nf5(8;FvBG-C*j=*Muz)kecm1e4pvejU=Bp-&v#w3Tr}L>Ndw;=(*_Q*{^2| z7!XA|N*u?TW}iFY%Pt)MW$S5aJTl_cTE_0zxWr3Urt# zqJ&p%} zUu<L*}EBqSfT(B|MwS+gF7EemHD%#9= zaz(o_C`KKwSFZzTP{hK|HW=cDQc`n zk^Z6JZwT6}d55c~-CW7d(flR%PP_kNCzIk6@`G3AjMmsC=lkii^Le}VP*GqnX=B>%Bb9Ni za~jTOxx|}T7b_W29_jLP?#b$Q=Mm5C-TS2M>zJRgM5ADI!c66;3o?9tWAb5olU19V z($3qj2_^a;1)(yx<1GYMo$*l>?{#qwQT|(?QwkNo7Q~kL|L`UM_vITb1iS5c*nizY zA<$@xG3z&EqyR>l;)44OiKuv!9%M|s;C}?hE3GYAJeH}RH?LX>mF)VA@c0cdR-62! z{aqsXd8T28(T@l9_!*6iIN7z;=f*PhMznq215O6VzG#6*H6l&E9I4Y@|J2vH9+1{Iq zd8>>ZvKureMarM#Q8pr7$vi-rg*WJH4~Kw(#1>8v&%>2?!M76Ao>;PX&O7^azX|D9 zZQfRpI9itsW9@b3>0vXqXB%w(3l4#w@7gY>wB0IdA{S!yx(Tv1-*UbZy^cuX#|xFxIUbEmFaQ;B8wG-;a|A-p!yuut;AUU z{%JV;jQKq6xf2p6GyC~>994w$4M({YKk5|&g6f?d(is7bY`5yGHJI*gpiG_1N`8Wz z;vpG_p4rK1#E#?VegH)N=bx+o4NV{tuHb{|PVTf*OutdnVM298UH(qbud;kXN&fu%%%yOHR*l%zcU~K2l2?1g z_?zfj1%t0N?T$M)q7ss@b)QdLP}{7qAtFA1v24XWH{SuUH8JY{Y$x0UP2WjKXl$MkKaT(RT6;3-Ppi65u})m450~56seo{Z#<1&C=2vy*bzDNEWq{5b^gW zN&b<1q=NYJLg5=@gX|XDCadBWC#~t@AzxRbCbs7#5wx3?;1?&F>JBN>e0x<4N4=>l z6Y+n@dI#^k7O2}hcw*arlE!Gz*tTukwi?@w)g+D4G`4M9jctF=dB1zdxaYk8!X9Jq zz1Cd6Ip>`j=y5uqHUAa!a=j$psmnEUVuXtRN}+#B!J(6qCl=fF5cv}U^E6kkz$P`Z zr;(|ggU9Fa%#%Z?KNan%l74&ajd78$-G{Cm)_&+;0NFpNtp#e3sl%lODmBNCe|=R9 z-C(DUFVvuCa4E(&gOQneill^bsWppK`vsxsF=!!sCfRI&niN5N7}hLnv1e%X&eheA zg`ME&DoTr$#O9ilMX1PPz%2Y60A<1>ozE9l@DPo#p*VJyZZb3D!F(2Ogb>(_VYGdX zs2kXv^bOUaioCNqRRyhPOkhS55WEiGQ2YltG=V4&+2Ke{RQ>ml4P?uZGv1Itdr!+& zvP&dTaCM?e1LHj8#1bE`0Zt?bF1$=}ee9=!pb)H|YY47grN-OB-i%owVe{K7wAs*Y zwB<;er+u(`=aLS1NOI=HifjuOBEA|X)+LG<4_Nh5mi#?DI#l|NaXW9k>F5nCGn{fR zq0Nebz~rd{#S_uOtsRbk=}9}O-Jf6x#dnCG7CMY?^^pa}d_HZ6QtbA|sW`TpZr>3S zxzwnZD0Pv;z}u7awY8hGG=6;PEOhce3g>SS^gW2#;xXTQ>Bac~RD8gcW`eGDs<7+L ztUfielrcOtd=Su#7cCyQ49jhfQ1gW@3i2fn2j$?Yz59$hEuXY^Ouk=#kX~R#1+I1w zt%ea)GC_cZ@z2f~X^k5apke5t!22Et_@cwdYE7@e>-LbL?k1e&L>31e_+HN=Yw`9L za7=4yF06a$BI@d3Q{2L5m<0uS)oXlqB|nj3KsBAYzv4DCE&^;kd?xYXDHm7@`t2VbSoG zcSlWN!ye`La5SuqEL;J3f?=Xzl+gtl8a7sxoZ3}3dIEqDfG5?+Y`nhrLo<;&k=VUf z+;BG_@Vchx8n=c<@+EY^Z`XF$m_qQ$T6=6zJ*A16V~qqiYkK6cl{@m7@Am;9qPxEn zU;j3m!^$URzbU2p+t}MglHBZ}gNeEhHNQf_)rbWWv5K#qH160w9n&GwPmm%I@jWt- zfxD(IqiBCh{q{s#vOZlw%eRm^h1Ror_{o+upQ#G~g|$ZziK;klTPWM{O-epBp8tPQ zRUi=?FX*_uOzuyx+kZz6XHiglVJOY1SWQ-T;K(EpV>)j*Q52MID-Gv8SV+-rmy4Ew zHoU<&>Vd>Mr&>XqBnpVf6I0K%`yFI^84_8<`I<-{oh{B~ao`LEh7|tMlc@CdGG>_T zLP>Q+P=djynlE3gtUjbf{5n#Iu#|x-8w;Kkm*QGYfCpwTxKL9F`Dw(7Wn@%T-n~V! zcRYuSq(OhwR7oQIlAEWap_b(jqOD&o^BL>l`k>C z=A;3NB7g_C8d5Op9^@mKz8|<8zY}Q1xGXa5%b`}Lh0EWggJ3|OEb;^$!B12K5W{GM z=3qOq1)R=lnx8k3JolZn96csZu9zA=oq(7Sy8Zepj^89M{V1bQ zsY(E%j+p$9^Ln~IQUk!5{C7NdU_OiTU{v;N3sWyr5TVo8zV-aR$?2OEl*8_U4JCJU z&`oU?S(MCDhSBE1#<&0X`{{5j_+8i?ZhnkPqtd|jW2 z>n-or`XaUK8L+(GZ(#7Lx6?CJ`ywoDc`tuOgWWEA#W=0K+sA%#TB!eM{_0rzvw1+` z7$2ZjC%O;BHBqD$Iqy|NO{^?_+)m56Q)Dzr>fdbTV`8+Bw@4DDcC4XX)vQ>U5x8*D zB}ojXZg<^=JstE^|oul}nhgw65<0`B=48$9Va3BK5@dq9>wQ1f)gdCOD z>9F8J(xo{Kx^C-8z!45FVRESMruo4^#nP2@dFb!U*a>DOOH!9I_%YNE$w~DGYK3bl zKcN@HVD6O8vT2ce2o;PiHPAi|#6qDYQB|pbvv5@ejMw@Itk(VI2gqKyv#kxW`rC{4 zb}1N#p(MnVM)ey@@*XKsqZMpSnq;Y9{mFStFXt2%t{?HEi%^X=9ZmXfBJTCoi4FFH zjU1g8S_W=Y+G)PNH8ymh=bXd&6rHh$(kyVPd<3tOV9sKYw?^kT^59hmmW6|>P)>Ud z4Q{&5+Df>z3C`~aG&YirAsb`3y$o{`;%_&aM*qo|0BsMXIDp=c?=6U9!v6uxgC>Ln z36=J1M=BCrlCyE$sdB+2>VxH<%HpQWT2EfgInl&3yh356Z>UA_DOK=uejhB89Z-sk z&XUtY!8Oo}IV$>$K$^T%hOmqVTtCGkRji}&MM_) z)HC8ph* zu677q6+guYmnlCNCtnG0@zsep`%b9ODEb#V&m9=tPLF_QU?hp(es?br zo^IejgDuyuLGs#fk-g2rN2wD=Q&5G5# z*X0OSmi#4fuk@5S<%`|@>f+vg`=tl! zsewmhJASJTmWh8kcnNu4b6?|+l1%ot-*no}=mJVliwn*Y{8U4wESA?;YynhxrUK#& zm5Go2r!xQ)tX>mbdd`wHH7w~>4ecJEuVLIZ9)tEF0FV+D{zGf)cV(g&up?2hybP(7 zmZ;em=?DLq`XuA=$CRuuG4*P$hubk+*7ULMJTxTK6{AT6AGmdv(G+9r52`~W)5^Ts zzrDIX%ms&o1J$$lV|o>^HWD<6FE{Cb{d)>f5)@APs{7I%o_~E8E~q@SNN8ezIE3=5 zr_9EKW~SLzdmdIDv^_9{y_neaO0i9t02e{-Y%AS=SP(IBGx$Z8|C~&l6?FfBKTS60$(h5h?$I=- zA$|VBw}*M9mG5+npZ(cG5;BWRPWgt$>?HmrTPEfIR44xFCjxUV_z;=>3{im z@^7{gszBcCvizAWX-KCb)*Ex#F!&k$zfaZ0pTsnNBEj9A|c1i1&=&o{!Js07=@ zVx0iiVQ?l%cNHN?iE3r)abv-Kjo=j>IJD%ohssX6@AxUBJX(=sy2xe{_((c7LLB0U z7oMJgVLnu4j{XV)V<-n?2}5S|9{@T+swwQEYarMH+uRlcFUHv%efcf1dlB zYS0Ww3DPA}rn^9}>JGd2>2xOhTH!IcpKr#+cfC*<{1%Ni3?1~%VRK3xRc1vK5GE;n zv;BaSVY(y_Qqo@xLQem}QK@&yBcrY3BWu#y+mOeW z(s*}w9ZRVDzVN@QJcI?@GktPJh|42r;DrCp%tk%hG9z!u&Nr)*5#26{3#ECy=mFts z!6kLA9?mMXE9wC|6gvgn~-bhST|b%xxYi4VBZ2i}3(PSiA# zS1$JTu=r0Ao* z7XwZ1SarU2!fbVZ;Kw9N(rj|2t(((H6f%46+%xH{NOw@|AH=$JW=mfv;k9 zjjH9rVNwH2o%^0!w}1TJbHRxCqMN6n>74y!q96`j(s#OEjz7Uhaq{|s+mii_cYb@M zJ$e6mXFzGiaIm)B1cy}J!`%OQYoGvw2>}n$%!N!Wr2`)C#N0RYcCHXLkGX^~fUK*+ zB|Ed~GBX~u4ZNpao+9XwtC&kj#2ZO%>WUTO{f09TWRt&3;n124q02U`@fN55{kRa?p_lmYgOG)#+?ufb(7!b`DE_v zD@h}__cLp3Iy6g`%8{6zx|E=M8dRz2mcLeqQzB9)Iex;DzyFea`9eC93M;aIUMxTx z?59uJk#Fj2^!p6+|T!uL)B48)#Q;kqIsF#-m6$2 zs?WMR&JBPP`rf?J;s*wix>*%i)o!JSN*zIUHq2dSya|V~II!z`e}w;4b-^p7lJp64#b(;CHJs=qYWQ{*r&x)xz_&wV;AX=H*3 zdH3Mf4|(lwNGIh`-y#0sxB@w>geu%%p_AM!^ijY_>`As zG9-bj33Vvxa1cTJ8mx!o=zc7$dxKjlK^qhqb%?!0$-jXDtRVTKov+ryQ~Zi}k4z4R*Zp8{@XG zbPVdGYVID;5EB8=VIzB#?}OR%5&{y^QP6q}BD1v7k`s$2j7+#iNXsXL2{ds7X8p`R zg_4F7IDScHq%5)J5H(0;4$Y-LL?hzzFxi3s9p+$XGeOK<1fu1;z4w5%=V?Bc5#g7 zRC7$17A6LQ@Up#M1L#Q#=e_DbQO@PPcbVYlaT3KO8B@^Yz#*eB*HI)@1M3VRqduL7 z0=-ZN71L(n;M7$Snu#b9zCqm49}}(b#n2-(tni5~k@H3!-*L|8R2SqW4yQ`;Ulm5`+wcN6v)vZvmJGQM5I|ztQFSP> zP$usz-wqaITp@LwPBm)c4(`zm4#t#UoMkc?GvAIW)_s{S-C1p9>b`titm$JCxED&8 z3LvEzDV0Ecwt?rYshb=C4Y1r5L#-?jiKw2u)xBd|FSKm#sXyIsP93-~qhF=|bd<%=XY&Lf&gjNeL{4j=1K~JS`&7V}35}r$34&)i+2l`JkN*d3P*@CyTA#F}|W^2kS{&u|4E(+^^bH zgSE=CNrfeUPDkHlPB5OGFI{IG3*Jt)9bsS_P7m#sM&6c~r&!cg+C41skEH2qgsfr@ zy6*NEZFs|oX>zP+oI2j$_CnP6-nB_cjo+M`#2vQ}@2sBkkULz72=WP#fPxEX|+V3nbQhD%__K*8Q;9Qqk3-R}&(kC&}J11XIUbGR-IX88XGU_1xW8TZPcndbN4TzxU8~R7F!X+H%8BPz#DN+?ewT z12+MtYd^{~T7t&$<0{9qg#OK(&rwN6OnxYyd;OPFWzo^`)XEh2o*-(I@h1zd5s2&v zLUC1E=FG8jQy$6WUu|g}*?!!A!A^%?C6p5|8I*tI3M6JS6(x2JdE*u3MY6o~p@Y00 z8Frk!AO<^d`d*IaVlALz)+MIrS+yAO2qu!3uncQVB$eHpN1^`RC2bG+TB}%-xu7Dw zpw*3~ZbQ_ZCN(#3=7|?w?_9V`BiJ4Va`pw3>Oq>*(BTV2KyNhF{jG@D`3SRu>ad2d z-?xY7Xbt)bzWEiEQ4tbuqVxl$75)Ak3gvUltXVRNYX%u9T|K~%eXt1D2ZL_i@u{{l z3VDGqtEWrJa92kQ_!)+z;OeV4lROTqlQyl?Do0wzeak*uj--{!a8 z!~Y~~eKvi0**QKwC>FSaJroApx{0`Ap z(L7cIP66VEjj-Ey$e^@ecO2W%BNJba`FTA{+QXe#do2IYRGupsrcOA6w?U5`5TGM* zQvvA5Mk~cBN-|JW&p^(+P}Tp7TjncAH{tewvj7mJ>WKefdCoKT75Jm=SK(}rrjGal zCqKU2R0Q1v6sf;&`eBxyt~PbJ9^)~ibq9SsJZxrSBYUML9$0)k-u*xD4-DS3ax4Hp*qFD{7}Z zM4nfxW7F*(2#CP$lSc~-i4vmd*Z-BH*nKQ)_?@w94hpE#_phT;f&fIyJ*}GKM0S+g ze*MWqTz7s%*xWFX%rx z|HiQl$b;uB7AgG!CxwKUMI|(5xS9XyvCGMAvdZDQ4@B^##%>ZMAR`;rRf={)3?1R% zSy@Mwd8aAr)9s$KZw?Op^%FnSnVB4(q7u~Ob5w*FKa=9^^au-^V8X|oA9TU9l0>bP z#uEsgLMPG=?IvIEBtE^^0LL{z!$}b>464wvX3i!YDr}E^)I{``af*+vAZc8>hx@w+ z5F*6{Q=!kwpp+4f@hDj1(gQ!#fBo^$RlU(Pvhb1#VSP+aMZxzw1fzZRbz#O|J(?;8 zQ+GS-t9)88`}b~_F@@;;dov)*$scKR6cc&Uo!qu|OfD1da{+R<0w zKr>D2cp8y-ph{*RkAGyz3M##W5?xyk2;rGz42#a^Pdf#<`nfq}#F~ zV6z=hmcF^Cr0#?UE#G44Z;yzt`gz~v2PLAiLAH(*7r-MvD6q_eCmzSd(*7hw5D!Nm zH1uXZ9q4D3$_O=_L^jGiM5`?n;4c^^Ci2wk^2 zUC16?kL=A?btF3V(7d|%fc*!#?4c|la5;*E*RK$C!rO~QBf->TxjY6S@o(@UH&)yw zzneqAxcX=~g5Q=5Jkrngm|z{91RUgn4S6((E7vJRq-cSMjLG7hm(ALy9om5q?F5cc*tLhepuI`O`XOe60o-bnZ@9qn6@u4 z6KtiwBOF%uzK1vc^|+k%pUeKd*u-#LrUwTcoc`c)81_Le^5h~YbkD>4W?gF4ma?HT zge^|AW%+1St5-)c#s=&}7X^=u4RgH8XJiH5&Uum?vdyTW25v@P4I^b}_Gv!XMG zl}=$^NoNU*t?PnV&a4_`i+a#sUbZ?}NqCE{))YIUe$oy$z7VK)_vxdD86vvkTKD}x zmDi?Y4JOxDd4Gkes;f;{u3EbgtkMtBuYmKeu}SWC*RjJr%s}MF#I*nCH2v@W-zL6$ zm*8c!VjTY8yFW9;F&eeWn`&EwB%$aJ%AGOm&Q74)uMxoy39`ZnCuHpP$rg*qNBMhh%ls~dZ?6z~CG~fR%{VPD z>S8MDcJioZHoNQu;!$R~05F&gqt>t?bm+G`&TbZ@KcyWGr$-mTk-CIo7 z_g>pai3f*pG^&*tz6+8G^^nG(fyF37|t;$mj8#IdSYh2vB2Zvv9`)Q_fs zI5d#7aF?8LGbtY)7zW;m0{zYK^36;U{_btm3=1~G`|Yt^?Z^vzFeUNITA}BWB|CgC z2?atAxVBj>OVSzfHrfq<5e+-g$owAdpQWz-xj*#D4Tf&`{%~|wG>`vvR7cZ9b~St{2}`aU8OiZz>zz8 zq{f)cy__H(OLv|zjoB$1@!N$!m`>B>zJo*Pv%$CLg|{<0Gy^*gB+sWSxn{oc0U?T z(Il<#0xg7KNAtC3gel?Mqd_U>uphDf0ug5?WjrlAJW>QGJV<2=tJBB8M}#~PJ=vJg zY41xhsw?u|TI+KN!bWLH|AQh&@rAf5yvQ;6@i!>4uzgHDKM60-TbB8$B_W}D5*J&c zTPGNtI}0I9^h@piitR9mX$efoUA4u-jc%E?Zf+Yy?OWJSs;V1K#>1h~P~%)m%AJIC zS@NC}et%eOvu@pFWm@F?rIB#VF!WV(iNJwFzf}=&0>w)Cm5(CAW=dIGi8|a8E>mTC zoM!nOdX3aW4YB^>u)R5wPtkpiK~Le~6R6N2T+A`a-~|UCJLIZpX;SezLaUO_!9M#k zP<>X4bVixi#z+mv8M^dG;Q=OG#J)9i(_3-qr9lck2ep1$QWiG+d|i^}f;`A2sJqsC z&na0_de6qmy}umSALuOcA2;ZB3~68u%YO|8pjx89YA7C`h~*x#+I)I!D)e8dQjk>5 z!;N=H9^K$xrX^jmp#W(oEbN3q$iDGi_vq!^vysWUVu}J8C5B*oAO*v<@@jt!j}#$? zB+VWrqua(X`7Xt$@V;j0cR=)T4q%+B;aF_I#F>{k+}!@A-X-j8R2YIk28LWT?89cS zz5i)`LSMxfpP`9+O{Uk`ZEJdldM}6QECg?L)Qq>gk__E=X3O)hwl;N{ZGU}`Josj=tOm`GAU6_%$=J;rNBTr zdcwckyQ5z$C8?kxpcHq46P=*oa-bhr`;5otG(<$r7VynHD~uey@!;xIk32~F$t8;p zE420cOlXPFz@hBmBO%#no}62mxsG#B?vFCgmqj&6*#wuoPS|PEvSt;K+yByUdJwEZ z6Y`HfXboMedkX`x03`+%XBgiD=_Fn8!T(%TKjwEk{ry&=$SbBHjQ9yV?MXT7e}j(a z!l{)>4~8EPius^gqVk0RvFvfbdMX8sEd0o2nQuz9tJj zy^lP-c6K(DE`+A9UpmRDcWH2#2QDH{1p~$!HY=3X)RtHLut#c`Y4G{|2|7-v8!+lU z8#l*WZ`1j~B>E`=Up16y|j5j%JnVA(OyR)xYU#-*A#qUQAv4@^V)9SA@%$2 zDbNcckEgX@{{!2YjS%O|bQV(~06$v0lKeS!tMYx`*rZt0e>3|b>M=G>Cft!vU*T>+ zl4APzzJFf+bp)wwQRpu&oX;_#yHmeOTIh(!CI0+5WsZBFInir*UgpI5`_`FBD`^Pj z>au*4Boau`-~&`6h5<|B{~bQWK^(O2KuX}iP4Mp-#8DlsjC@IqM_m2OsBzs%;V=ZQ zcDrr3l-uHq9*~$OkVRLb6p^dJ{2o7A&9xrcIMEJZBx0(4APqO7Km6Rmsjs-j`zIDg zPH_R7^O`~wl)DdGcfrmHFuDO60 zMbsf+f{0?t3TwFQbCJMdimRS?qY#UlVz`{Y89+e_3FbNiX>7sn$fgXq*;WY6slub@ zQ7bPm$%>Cupv)>HqJ_->NNc*rx1vArj`6WP__@~esyZXsmN+k)EU3r?`Im6eNA&Kn zRQ?n#rCbAKNJ3^47(067npBjoI%d{u+C??8voq+CEzBZ1Yqnpm&f({9vS8NwrDIV< z!W5lz>gW+2`Nqf6GJ6ecHPm$JF?48S`ZFi2PT_yVO&;mW=P!C-kc?T3qWLR1>!$|3 z*EQQFc~6MYPSp=5ku^FD-S{-f@+xaUZ5PJLr|zD%gO8sp`KIVkmDzOgK9REz_vp2y;I%^ zUoNo}%H+mfM~)8Gg$imt9$^U^)~n)`QL2zffR8(HRu{InS~Z9nN0 znHVR9?m%n~JALZdRIi2qokMr}=UepEc(_5}>YPCB;!C}==Ut=2?m8%>8E-HKP16JL z;QmO;&miuv-ZIi0W{if(y6NlgpIK)r0I+22?bv!-&3W~&hr2HmkHqON>YjwS~+D&IR~ z94|k7To}v)(2p@2i41p3H*)+qIT0UM5=b&`#FUnUaO#xnZs?CXo`9OEt7^dR%#)>y zgsIF30XkCJ!ve=M{dpyW7ai*!jH$83pC{YjGW?XT)^K(63TI))72;J zeBm+Xg9tmGCFhvz#2avSees9;U2?0ePoY6eaddBfXxhGdpwR^VI%P&kiLT=hw<$3; zU#k1HU~TeJm>YkFkW{a$rC7N8zCB%9K6El9(Z!D96ZK{K*gO1jBPr_GVd#ChPF@sf z0*dQ_%-*`j>d9V~gU2k5Dy2?b4aIVibRptwimw~agkqHe8g-Yp?sSi6eJfu09eyuV8jbvx?Y>xXEUHgww+*z>uN5_Z|Tl9ZB7V9Mhhr3x= zeiKctoTinE;^9y;G$gQksK9fnNt?x3kJTa~#sFh<2A}Dhf1XM03lgJ*;8YwPWoxk9 znq&*(j<3vOOw4T%1Y4 z$dLuUefGzHmOfktywiO`6o2fD{AqZjoP1lTcdEDV`h7;`#Vfu&PIlFckXLI*42v;) z%nH*ThDRSc^4E@Id|c5Dq{w0x#@ZY1u&&ik2j;e-G>z*$d4L%HJfCCew~=qvedz|? zSfKKY>Un-?AjVIS0m)rwDb(&`U*ozOV{+XFGpj6ivkmLlvAYS5?2gru$#TCHWtXxV zRx%qeOAqAZ_2eRM61uONOfqLq0oVQO3%K4^tFLgcdF0IDPlBVZ>#QM??W;DQ%SVFQ zhTMqeOomGjaSxcKoy+RD2fq@R^&<9F)Z8lb!FyXY%^&q`m;UgC^NlR$PmD@7SL~bY z6EZt9oV=SO6$aRDsa1T4q|xqM%e^+k>WxTIt}x>>JkwTWWNiMk4y%9FN-V^@v)lJ; zY&PcY=b1|({r~dk5}?jJu6g3d`hNXYj!8!mYA{O?5pS;oFiOnQR9cbJLq|AZpk8n< z(A*F*&sSkPw27riHb@A&_k-egmvi)eU^A`CERpX&dmxn8s!Pk4Y0v7|*4#(&7X_Y!H~^ zHLjwv-asiH-6Na-@ZzS`W5y|M`^*g{HWVOq!_6NuRp2(A<7W6DQx0y>ged9i_?7wU zp!R=tQUq8`HJ17!=K_~Fto`9K^(H?FRI<#u84ba4q}BovuaMnFb`h{O8vHr=uD|=J zs;R!PRd0ic6<>0sqaK~|C8?;V2TXXlop6X;>VxB+Om=_OUgw-!*Maw$SQwN5HG@Ot zzq;Zx^=O?fCmoiSG|EfX_A>vm;|PJ9teZ&aq)<<@^)W;kqA8mM4m{1gPEAn5p6wXvrmiSe}hmVex7OhfP1kQ-9kAqJC z>K(uI){dYz_R`U&$SCJ{bgxFOQA5gQ@*5_~pGkbXK!N$Mb$vQCg$z)0AnEa)r}^+~ zaVMkH$pTF)-e8Z#tUX43A1tX!2@E`KYKPcP(e|K;nxZ`L_ue5E?|D_%X#x57U7A+! z3akQ-YyYTg%P+%+c5?bY=W6+e6KZKbkDCqQpFRS&9vZ)(;h=^k{_woZNvm|DYT>aXe?n*VL1wDCdlEOmzE?oeFHP!9vt1g-(3%O-rl^ChAi>}Z0j?K@K zIPeh%b|8+%ErKQLd&qN=QwXJm0Ifh5V|3N0E@R*;AwX}C1+O{huy=#}Hoo-KrCyZ>Vw^!m# z@LivyL{D$g4&69i*Lt1@JWG7ul>w<)Y<=&ldZOrUZ65lQGl8B{ZpAv;#85ygerw{; zlYr;hxoP%1FzFvk5|5cPZMhk^w6@GQTVnS+-$$Yvat7&B^7@KxG#$U@Zi@4qdmL*N z7T%LAzpwIvM`(`LBy`>7v)^kyFiWhoL@T_q=lvpy1z7|S0|?1}EPRi?%&U2L*Q;ho z23zr?dM;<%2%Nxpr7KasdB&c@Y(l4LZ58G{7!~{ zRNmMMUQBSd0$E?gUg-9UPqy{ObH`h%-}`r!wvPFm0dWRpJc;(u6I>oqmWOPOk%hlk9x+x%ybh0n~RsnAD# zeg@Lim}?dCmEr^xKUQCfbi; zQ{x{aP1h>E)-PeDf$&Tu>OP^nr)DJPaJB#bnsI~JB}lj3{3h5f?*Hw~!wmw!4)=O< zXUn-D_SG#xHtq<5Bd836~kL8^IehP`9M#DXL$#2)ouA`x%fL}VTYTGQ<8 zjs*?%DmRAyfQFR*wGQ^hDbvhsFaPopIbStfzlaE(z7dzG6f70P0R+A||AJ0k^`~ah z+!fL#YCDI?$EI3h-9TkwIrT!MMM6;}hX^+IiprBQ-CnYtD)Ftx`OE36B$A)l>{Mo9 zW3}wr&W8_CRU{#4%tP6Adtnx&%(k=5Y~UQLDj``uxv6fUWW!Xisj~5QuG4d?JDh+V zdY%h=|H8otVJYnOJ!lz8EimhHBXG+9!J!)^-~=jw+6#dK6)i|7K92m)zIjaGH;9}? zwDqoAWJH)u56J2X0JxIEr)+j4xrHd~M36y3TWyUc>9(+qwyLbD#_zP@j$BDpCnGpU z!x5LnG-@fwopwN&VsP+GPziRYCe?^N{vP=cH<~EaH_(0xaUL{=!<^)ltG*s1hMdlS zgV*eSF7@N&bd*@Ah3`@7C)K4s4;#RN6oA)=ff=S75 z(!+q$_3mPwc4A3$HKa?Y>sg5%Bac?k&+QpH1XD(ra^Q;;KsB970Oo$MMRy;D<{-fU zPkxZywq4Igs3x6POB3PHP1LvP=ezQjFgkLcv;8N{x-p5?7Y6MrXHu)QxmvHM>F1MI zuVwn4?=BjCO>N&|$e+gb!n@jRK$-w|DS4MP3nL!(vY-2s*KUIJW9>Dcgzn+!mCYo# zjY6wh3S^nxeSY1~JuhzV=e1RQk)OT*??<9L4?c*f@33?!wNa*=X5O53{PJ;fO8lkn zCa2vPj8SZt92n$dzQ&9t6yjSBGSMQxXOk+$nyjMwZn|i2JyfgI96PnZqy~#4qk@aY zpvo2>(`#f0Dd5eY8mI==lw&eE6!XiD2qgT)fJ%KV7d(hc-rbyNFin6# zKj!$jP>TQrR(|4SB#-(KcFhR?K^(eav)ut1V5h$?jsC>{KSO_zN(2~}QgT}2kHwvA z*ZpmO(HByg%{VbAJ~gdm9w-~u6=@Uo`SuX>Ld*K)FxZ-??_}I0EU5OrfDZfLh_ca1 z!8YSgBsujnao_mDOgKGNKdW4`V`4ZkDIrH%!tw=i8Wh-rPKvOd2gj@-iB^+|2XO;T zpi63nf21S2WTMSkF-5YFtL4b^=P5xX`?glwu_qcPimc<}h)C5QdG7VXRS;dS<`R<}PJ!+(E@KP+FYlnwfm+=aH$L$&8%6ga zj9#=)4veC5>7xsI4?f&lXX{hMXnX5M&npmm<3}%77HsqdlvgS`G%g%WARf4| zp(XCs)rH*A?~G!acnV=cin;)M(N{0a_Li^FlG$D1#Tw}g#FIp=xl)e&Im6YK+I$1^ z-n5499#<C3LV4| zU20Gg#>-lb1!?MTQ#-+Dz1Vm2e$8eVyI{}sI(ywN#xeZA z!%rzyP1m{D*77!FH++j_(HfRy<$rJk>ofVariU~Jp5u}ukDwj?xP5iSF}c#|bF;+j zi^6^WB*g;#5|Yv_dYn7-p_BJqO$}SAlBGP-&zZUph<37NvHI|VL@1Go`03X2mFxs~ zQ!%PeH2PFpCI+k!*(F0GY3KNz!pzT2f01r%W99~vX9CQ6lkV$p%~CyU-rCtWDj^M< z(rdG0l}O&xNef99fDg7#*2aS0agr-JAQCW(fiJjjWNjteNmIG2ivnuyOc}}hJeCGU zau4-U@K9w9*J4(LEXAj_jVO2Ouo!nsk=ew+g_}G?nncKrG`FCmMKMG|cs^$lL zxTLic#eWVZq$B`WxiJYxXl0)b#+1ZmtIlCo`H<(T=Z}kf9m%+qOI)R&Di5ew4TTwf zB3W1ETQ+NxhrBtSqP^q@V{pp(^iun_e?G6;49I+F+7dP$hTQ$-vaeNc=qwOhP|xzI zdeLR>sFKi_$1u_j0qa0bp_LNqHg(a?#%*wsCPsY=;kNyaZTc4x5smEX0MfN(L=?j) z5r468JhVYEnnr8Lk($vUIfja_BF&;p_11PCC3)253Ncc}F$2Odp?j}iC@tq;*nxuF zB$1BH(`A?hJ{#E7vt*2H>OzW4LT)x5(0Q1J7Om2wY&`6Cj@a~fEQ0EaHG&ggUMUs` zBz4n@O?}|BcpnEtuzzQH=%9aJ z^2$ykmd9%P5a`8ZLQZpemcK zqUW2g^F3Bir1xHb=a#aZH*E8|kOD~xiQ`v9+tPOF=j2qc&t(U~rT?u=RHLvnwNsjJz2^jnsk&KD>t(Pn0d(I6mK7o+nj_Oh35tL0+DD8xE)pQenn6X^5D*5fh$9v_kri4AUB4QgVU3G$*)&oED?;9-e4ul6!`MPnxc%{9P^ zC38JCW@d0Bq$+)F6O4G!mo25w8qYZ1?&VS zCGlp|sUGM9y<99SqG9a$F#UnT*Wq8BHZ4K+-#+kNd5#|}lQ3Axc1(0D%tj&^s2r_} z{l&sCq*)pLco>`(O4(yQg_RMHClM3a2ZtIaM|?h?s6D9$WF%-+;LF8d$Ep9=CEJ?o z{Ts6cEiH!ZuuoIMmEt7C|1DSGoP(9E_aC?D(b|B3ch(=-MWu;LiFrh5soM3*74Msz z&33mpp)pZup$~L#CmrdSc$Nnm^@V=$IuB~AgF`oKj?wJr10t{m5AWb!ff5y@8cs^f z#xmf+21pCWkU8_w?`7t^Hy*QIkDOVJVL?B-_U$rEvyyxpL`QI$nR^4_81X0!jS^Cs z`G&rx`Tyxxs)b7Q*!hGuw`Mfv5a^QiOg$mKi`_mQgYXOv#ap2j1UGg?$z)>7RV@=? zf>1&~)~L1>X>tKewI(`9&5!RVk*A?flPf!Vo4jd=59PFW3e^fZ#RWJM?iZN=6KmrE ziXzkA6RGQShi+Ml#0 zDFWTLevr)ZIJ3&`v+_RI*{};a1oTir>Zgpbv#*YMay2ZI-S=VO67eAATnIJF5AmfbW=x;qS4 zKieQdo-fzyWHTdf(2RA+bCpzy?ft$tiK5q8(_2^^H}iJ1za6YVqW3h zZUpc)&$UpF9Uolhu@Jc5XCtCmb&L7I-HbnS(A2AyU}1CtbXo1ff%tzJ62(&M?F-gB zS(VUV?nagHt+u_E93;KT--~binnDTLZ_9b?Ih!#y9&_sf)mO2D>SidA3)hvmoQBsY`1?jKzOIHwgjkKu36<~wA?Vb9l|4$jc}&c@iq z&;Bny4xb-ism!@EI*L(hjpshiD*m%;dzdV1*iV+lb!Yuxmm!F7M7v9#Uw@PO%{PlK zV+P-ICzTYTPWdZ;?=kw~gLF;5=p8m{}Xm~3-@VBt7zbLA$|XkGTYFE>QO+qqnQ zKxuusjL|hFwNugJ%oHa;ce{iDQ$7)JuXf-x*6%2p6og{xXCRpzF;85?Eg# zbJ0X1SFF^j`@DozEV~(a{o@-19Ty|06v4y}@abOd*ui-pb&yTq$6yx3$Wz5K?m`^# zHCGH1ELW`x2niC_ueZmBGm0c4p+QaDiHRi)GZPxbGW7NQ97!HxhKpN^*w1o~(#v2> z2w)z+UNer*dHOWT9X}2T3u->zU$(Rkbz5O#heaj#9D(#|P4{pM5!M z68=B+YEgaC$W$8Vl0or$L~1J|iX&N8(NNqa2=??c;$dJgFP>@D;J*&w;v`MgidC^h zYB6`;GLn0|r<#;$R+&kQTMtx)C~bAG#^S3n{!lqSH_IkJ*ehlnW8sgQV7Z%`+>^GF ze2hs+#Td~%-gvEvX^xO~l70uqIFoVlK*To4q07KyVO@cTzN`(_&)zbFTtorID;Y)9 zVxwOP;&<5&QS=H^qXtyq06|2cMPlp$mJ@}6xkRmkD}hN=A|9VWb_N*?fj%$!;8s%u zxF%lQ{l-c}=ly=vYJn*wA&&qzMj?_aX?XYsr=Z$g+qr4zfJ8=0GR=Di%`vwHLiG5! za~4Tq#N7A{$LfPmRn;kvwz#c@A@FVz6lFOx__#1@pkhn01zR*PPrR;u=U8bPj97$A zZf^|KE9WJS|cwHVbPP>;yXqstY+5}qN~ijvSqQaY5df#+QeR_0ZB zXU3hkf9G~{#3oa8UJuHFm5rbL>{(F_1d2qH!ou$SFC<&N(!RCIAl$fpIb? zAo-JgBMU+y4MT&G`5_Bo;L*k#k%pjgIZ&-*h*=d&D(x$Zz>gD$HqLszZ|+`nS9DZ# zKJYBpc2@q^)ls?X%6O~4>TuJ3@^!vaUEw+NneEz>*#w8NJ@p&8J_^uvsPTRBeWxJA z1Seq>4+ervWcO}(5AKJo$|zdJ4DvDK`nrd3#O_+hi5`h3mH`92j`VV_3giJZdS{fJ zVm%?v<~8Wf-@xmxZsh3sOT5$_7ff^eriRHQ7l+1%975{N6JtFH8OunY{JJs0DCmO% zL+NCB8<{KRK~+R*LExj^AkX0a$e>{MtI{Ap_jO8O#JFO|{rYH$*P|LowyRf^+U0g1 z#gbGN8A>#;Pa?-Vga4h2qA%iL^T})3oV9>5rNA(sqI7bdT>Fs2{ttt=5cLPzv@|H` zSZ&I~J(pEVRhsyVe3aur<gnsZ*}R6)@56fPNv4V13T5O#q9#x8e}D-Nfjy9Bu<@gOv0MzJ7I}zNh(-m;7T@nLe*N? zz=J?20)K?4)fbGr)g?X(FXf1>ypmJbEo_nrX{*Rn$d$}#ixpGdw;A^)QDMhdcOYoU z8wI=93?2RKhvXo_*EJG49!x-%oVXu)GDKtY;E+ZZ=UxhoLHZEtO);W?L-N;Wq;I$@ z=PM}ug`!YsFV_xxP6u!EYI!V+%rRUJ(LK%VwE_M=h9Rfy z=XDacxU&yvU4EH%9*0Gg3uNPVAQjHpe&XRc&N0ycG=1J{bBP!*kTU%pusn(Zma!r; zRD2~|qb7_3qlr@BCK5MkH+{fk<&{{GDnu&M#&D9xvg&?jCS{=kgLJGc@<6#Gj+kD##>?F?S4b*YT z&V^hoAx5aZzUB^LUSaPdQmoX)8bpqW^7P;hbSCcElY{J!0mmFsEC4A46B*YJnNl01 z$ty@DxBP#Aery7KGLE zLU?vn8_2^T_YHwH*U_K7D%XE`*wwDNA@&7f3F)DZD%pliEC$G}(PVs60(z1I+R( z##k8y>}M1%;w={6*O^|zUS>*NME!3^ASB*^8HHV4>vv@4fD2ELhORl z@wQMSqZ&WCYdU*<+s(zSfP}(MmwdPkM~ZZ>J2mMf%b1xbX5Ccf-(C+I#t&bzKs!A$ z|2}TwIlt-0H``wMRTo#}-(;^?JTh=o3()w4g!7@hKmAWRIxuw0GvvMIWpQsVz-(1N z%ArQ1IA@y|MHkB<9sU|LU?H;g^a--`@%dAPn=8}CFJ%vhK|vm2PMPMqKf^~_qZN5+ zMp%&AD`Yi_LwNmxCbthdhvfW-4Er}k2Ix?aArPlQktGC-6#zA&=V zd0GXNTli37aogeHbX%PcY;So2V`I%L8u5&zHI2Vlqf$K^mEyk{uH_E?T(?g5cszVW zjYQ7l3}$QP`|F_=a#j$Cs29G`6@Gr2;$ZtyUDMWjZU(`+bQ))jL{++k(A5laaj>)# zZj#%rtJDtHuiv^yLfHH!eqP0PHeHa%BrPE{I2Y4QU)SiIR~!Ern&;GO4uywGqhbg}*CTcBMY zzj9w|VzfEgf@9}=m45~1s3PgNlPAMbt}Rbk?$V&jMBrfHlWG4&O; z;>U=NddFF>pKJaT$Anz8P%l#x`&i~0WaJ#eHFJLvBLv-bz?IWp0iiESZip5d%ifzC zB1Z$F0Oz=_$$n4!7x$o#|4AQipvnE!4$02za`xE$D|p`IzAKQvEHG$(^BZr=llv0# z${8|47ZN+0QRd;$YAW9pq{yXt1|_E7WmYIShbALBviWcRkDY_W|E$k~M0UVPd+Qel zT|if8a%lfuxc{q8Ym$H!5cOr0a3zp2vRNYH3OHp;F_S49CFwvkFi?C*Q3&ZmkRFpH z{EYgmS~LT}4N}Dmk7WXihwybv_hLNo#>-bEe2OPA;B*=(c^pZRxG2mLX!JI`6Hv>5S{r)XJKuUi=HYX#gfzrq`)cy~J9) z#LAs8W+1t5Ho=F>*p~}AjvVsEzNJuCn(-euB&nw&>Sh?&`sNLH0DygjZ)QX)Jwg|{ zBdW4jVY`3(C)Z-N6EPh6;s`=kDM<#=7->)P^*IL?Uq$cT34gXw(>iov90wi7-NWvi zozLfiA_ul7wgL#}#eCd<>MeRzzvzd7FHC2~&MADQe)D-Bdf)W%*y{xDd>AVbAz}F6 z^tk8hcQj+Rq>V8mK}8FK-V7}(13MD3jDdRMpNqhD=7F=k^tcJ>@Ow8d5;5#RoGph$ z4L1<=YnKj@DW!y;u4=NPu_jx=*qq`czWWm zTOW9<&ebYtJ?uvqv^U5YeD2>Yw(7sq0#0{d!Pt_A_LH;}rz;}F3}l4;$kk%0U38+_ zVb5U-Hn2(ZNTH^4y&r5mZubcI9_L7*ZdnE=K*G!$PHwthojFcM309c_jGFmC+>vxp zApXORnEpUAaR&4)t*iB#>&gwPVPiK>)j-&n}yTS z=Aog`DWnkj9?2xrYLNK3yp-GQdA4wSN;`;qz&;(P51Q6zD9Tj1pP>kP+C4w)`6)Dy73VJLvw8A%J7Y^D=REX%bysS3J zf_Za-W3M7;vFWzk?|Hy_wgdwF-6G(&S%p5fe*f+8ZMj;_d`;WE%O`sk^+C+6}07|e(CeJL7SL5@ehcdO_VFhDVt4&mLXF?7S)%a+z z=E!v3iX9B_ppQ(c8a?!`Tz|>C)8D}I`bcPp2fL6qMu2ygMFLvDByUX^cYaRh`qv-g z-4yqwZ9#W%2Hl)vTYnt%DWhN}1c&bWDQd!&SoNu+y45QqUN88D+I2Hf%A$DhG9d_V zo*C}FwYEx6QLINOUpfy%ccD=ULgKY~4Oj&noe3O6h{;(efE&=s5-Gx&sy5zgnHU(T zDX5@+*15><3=4UiL_1KiEc<+JzTf&df9k$94_Zzz5U0Q$*J&Ftjk)-InW50ZKMYrp zv^armbF!PZ zg`7pOq_44;8gW-I;7^L|-6Gb9ZL4nnrMG18-Sln^T2A~!YT;YDJ^%9S1OWZv=Zw_; zf8pz^yX&!csu!v%yJAi;Mm8$p zk8oo{w455k{sptQn@%9IZurwLRbp;m{i^*MZzyFg3NPt5EH2OqT!5t@O@&b7%z;yW zvNXm1r;nxFP%EV;Jov_588vLqIIDw<7KiaPNNLv}xn1Ci&?xXvmgy@~8ehoqm%~NF ztal!CD7@56zu%8FImVp37#+{FuRB@EOit-0%Eo%6E( zWz_zFsQLpQ2|?CBn&C_||Gq9(m}m~bPC~Xe7neEQZr0iD`X87BnU+(yur0|2P}A%Z ze8sc{z+S($Hika^z~Liy@|6F%?1`5w>e%t({bJ9O!Cg4=JjYr79z~&zris!HSlTU= z{hmPs89CoE(D)wvWweco!Lw=(mj}x2iWp>TJ4TbQ-JMf-mCdR)Vd3<>gYSikb~dtH zX;+mM1w~sa?d0K>s_$`@iFG3jxXb;(27D2|GnOHotgK$=EW8tJp0O)hLxYtF?zLm? z7C};0V&XeTP(&8Miu&ztM_H{qYp*0~g893n#Rm|_F(FFveEzMQB1w((!~3I*5u}l- z7MMV^om$sh0}Z@auc$r1@&3xLo}Q$M&xbgABQHi815SBxG!3%I9d?bpLXva}naVF- z(gXv`_?bBzq;ccEj|>=jFd#2Bn!i?=1z6}F6v~MCIp1(qx2 z=&Q_Bjj%X7B2Dc1n$YvO_(I;^<_R;6e`^D*zVW`ZB+0zZ$(b52WDhOz-TrScfXSP} z!UhBb$lm=P$WNAzQ8#lA-Ec=G5o{}?Cd}B1`H7F>`!UvE7@@e_Ug3%t!ez>h zETA3b>qq;%Fvu>HZAt?RM|?LHO$;z0?CSZ7=XI0fC_OP+>}m4ittmY{Z=QsjsOa!L zqZ@;j1M76MBBni^-f^JMQa;g-=lATlJ7(TyIl1s%S5FxwgU6bsH8kwpasOifM|hsl zH)z}Nmt@ZBUl1Ia7R^zlY0^wU`NDM)|A8D6aN`VHM=f)HB3>o!7$~&B+_W_D; zo{VQV6})KofAkhW{GpNe!08L| zw8g{COz0B%=^R<69Slv*csKfEjHThgNP96Z#7%$uT(aT`v$0ySc|L>7#L z^?ByP;9#fgH}}gqbl6Bb?Wt@98I&`~&CN%d* z(}kv&UcRwqo1+)q4kmGng8ZLU=O=EFSM!WZqFoXG7&^RdR*a|5qoFco>A0MBDdk_W zp2p0xx8r^&#mD}F`L{sw`msvV9Ah-IB_qUo{B~v^@NCTWC|2n$UzT8P9gKUQW*zK| zd)a?vlXpfrcuGzpsW-O12)t0c#NNDedH~Ceou6l*gs)H}Z~NY@2qaS--!eEndK5{V zHPV6l-bb5{EEA3$?hnX-_}nk8gj(Kpd%vaF`)H_V5wL0$_Jj2v{{oF z&0N*M`fM`Yk5?OuFRAc@cfPcY8i$yy{H_ijUop}e=9km=E!SQ~-!p|%z1??W=`Ayu@F0GBn*!0|8YWlL3BnCfUes?duJr-dF7cr560R_4&JHjU$4I#*fXlpTRnE zCGDD?M^&30fA7tBOINwL*wzScDHkr0?Uv}YG~2vyhVnFay-?A2a=nWSLIj~M^*w{6 zmurYdbkg2{ zQsTs8&s@jB$Ll(t&_GA+4M%czZ)mtHNEG&gRahMNJinqs+7=%xaih&CDASPjvtfJ& zZeSEj`LPm+cw6c6D7TYjenWmGhLf-+wOBaAfyj?DC1COd)nMp93Ks=`j=hz;h3#@O z>vV?USGnT^@$Fv?ioM!prh+ieR8wHaqKlp|z7mg6F2xC`0GElx7AYa-XQgpR8Y`aj z-TO6Y0zG@R!JeH>0P*L3;RNQ`x444()jOKP>c|xuy=PcW!B=wP*0U1ORTtbBd}M{! zhxJwJf(ndwL9}>SrtU2zp{P4KC9$t^jBbO2{wizI6;@mZ0aE2oo_P^qpbgg*eXUV@ z!Z%byKe`oVgeEC*D_I%SH+V8$HOU~Qn&u3Hmz6$a;kJ%gsKq#7;qcb;^u~pv(V&{S zf5+Sf364hyYW~L{*8O9H&8PN7!KJ$6@sIik+ex0sjx)+&?N;6We%t?v?Eb6y`CsS{ zDzcBIx(mLt^M^Th&h9$S){lmK$p|xEl8+?owYsS5h7N3M5i3plm!V>>^phmeK^`Oc8w`C>_^w0&lM__&eX zJ+~dvu*-(TB2jK&K!t;X_vKuItU-PSvbC;BLh@P^zG55ryjuU~POnW1umsCS(WQCF z1QBmUKoneZcoPKFEzgH~3l!x2L2#>i#k*0(z^}g^zqfh8OAH$_3aEho#fLvZrIwJ> z;;LmrqI2jBACkr{ChLVxofDwLSUi3_7+fLWT{aS)uKQk8uj&oZ-So$Le$@1E3^s+2ck3~L{5nt^ku>D=uSDk>>!I; zGMnnXpNs>L3YHzJu}EHqCviq0l~ID^aEZ85%s=a!if&6-zpinyYGo1KB z-n6032BvKxk_BiC8VUX`bY*mLNpDSL9k})oe$RgE0CvAib4&l%^dLW?kr!9NT?0pEHVFqt>SP2M-9=Zsr9DUF6!9}K6E_56zfU9H3C%05o2d!5Ve z?Vcfdik7JN91mwLY;mWrp6MsL$ulAb3GJBdkQGlS_7{Nv>ZGaq!(`h)SBYDBI?4NBy3JU|@#`aaM(|dcq5$W)Cy!Dn z?c&tbjWZG@ZMR01qH}hQkv6~dpKV3JEltc`IDsf9(r*K+H_}*&({oxBtJF_}@IBDV zG9p2%cs_p^=px;~jwbL?=4Vc#Is5Rc4M@tbtC((CB(nqe7P|5y1vq_eL}(018G;oJ z@w4bxlO?+d)MR{ejtIxCZ<7V5Lk*?VdD6j~z)DJyC7vtbYFdrN3sVo2Q$J=NXan&d&=_PG!qlvzkeAL6CQY8|9=i+{9(iWVy|w5_nD*$F1DvEIPv|u!w&C zijvXva@~Ps01{1PtM3hzqcCfhu1EGM3Pj`ye@(mrT~5>s^MIFYWN_>`Hkuz?m^A{p zt`%(no+3~LnSUXZ%BLX7Vb8?DUIu!>zD|W3@!SN4Cb_LhG8M({5~AkX6+vJJctkW_ z#Ppq6zKW4Y48^$jmtOp=VE4^Ikf;yXFkV0*#~xyJN1m2c?|NUqZ8Zwv%+2#n-J*)# zCLEtNaa8#P#>NPu%tUM<+Q#L$r?D?!c%KF;EcU*;ey`BK55Ug8PyEDc`zF) zkgul=&IWomcH<}Tl_(&R`+2pSr?dO&=#ntPx zl{f2i9m_r8wGYWJYw$7Q$e{HQ%KyPpu9?ZWZX_SQ=s4Tl6KPupMb&pqP%8As@{LR` z6x1A_M4hkyTIzX{5gxrxx|d*p4UCyJtDoImo?k;Y9#wj}6E0NSGae-JvRYzuu@Was z5gGiV;51gNT=(xb=~>F`QM0NaFG-F~5CX(AHd%tnPi3ulM-F@ygB@Jj`?<_0f#S`W zi^|OM&k45lZwfX+KRaCci>)x1K9|NJ*ONRo1zvw zl2bAy*dFZHJedNJs>6xCEpp=yDA9Bi&>azsvbm@A3=XZA&kb*bSDv~F?pE2H_{+4e zXLG-rm~7LksQUwE{sY@+{;-~3E0N0*OAP;cgak#$1!CPMSB5dBjB$d5LJo}~L6ttD zsTqt4H3^kqDn$ZjQxs%8xYmWG;it+i!J|P~EM6_^dea45I!X%Is{JPU?DKtmIfVnr z<*adf*W*>S@3w_F#TnRFu(5KIRj9U3+Hr&D$BmBnPy7A+bP>$%ZbPnI-cEhj6L6=b zNB|v}WbxQY>oTfE2p}=u$IlvS%Yt@co?InyMo-2=-W!bA%P1t9=}EHIO3PVt1{GKn zW2f#u9@P`fldQTY08=a6S2=ce)o9MJrW!xL*<3K0MO4kWUgi|CNYYVc`=HhN)q1Pj zw-%8E-(IX>0Un_l4|0 z?+OHyIx&^flV=Zsq?^(jzi9>IHKqzqRww4tlV;U_K4yHRL55TRtU*$#p8TMyG!q<^ zV#s9R;@b+DQn6_MHxb{|uhs7(%+uGysGirSRVrJjcR`he^8DtVV6DEk`c<8A!d|yj zhw)KM%GS0U=~{kc&t@dIi?4rH)O1aHI$+k51%r^Tw*+k>>08emEshx>!_!Zszj7cD z@rO>&+@h5=`-qe=fd%eq`DsT7yY!rn%2|9zr#ZObp#d(ti2+Ock~>fdKWKvY{!3wQ zx)%VO3U=`;wkPnAR-q>9dXeg!1ClqoOKLLXrB`Ng>RLg&mWmQ749B03N5qyO{jpu( zBQWMP_jPI1lE+2796+G=xk*^^eF8f>Us>ywNZ>pAUI*pGZ{njIvq)R(HMxA2Na&Wa z-&`2ua}`~oHHv48@3?NiAv>NV_c&AE`Vem5FQ^IybzfN)XFXnTBvEc?|F-!)>h!X+ zIS+%mU>?wSJi@;I2&Fb7P|IME@woQ|%RoGM-7Hb2x=pd@E$h@v+mawRHJ3Bj|Ak+1 z=()Uq%a|oTo!;UA_a-ou!tDanRk?%Izdb01klwj5*lrhMvI zJW$yaBz)wMUrvY%9L7TK2C=};A4=tc)%xJtgKon;c0ZyPOqXxWgRZ(RF%~Z`tWt4Cq~FEp#_O%k9=$%M_EyufF#| zxJma+I6g-!J!b{} z|JgeN_V3e0M#{l(4AxPl_@C7ai4BAv)O$%exXT_2D-11Z4&#rQRia_^qVv)lSd>FT zOE^^?)0A912rfRkbN-=5_#p+}!2*MlO5=Rz+%>K5tqz#V#}L(0hP^TAiI|Kv*-CK@ zXel&GQd<_D74Pv!#4Aeg?`^Vz=a9!RD9u00jXa;t>WzC&iI7SQ$ZS`j3r8$>?)sb) zCn4n5tH}$%W5|PCmvD(EuDYQ8D;*R*AxSb4ZZ+yu?D@9&X04KSA5hq4TI3Yt5tgfU zRNpAf$Rq;afQJTBRpDGY0iDNYT=c7@N?e0T;eSCiN1b-!+y$l+=8VkBC}CJNx&6$a ze=UfCPUv&C3uQYtZ)l6b3J&#OBH)^*SAz;?BFK=SBKn%-0fiXQZa>y*L@}l$Rn?WU z39E90=L$EbXA{>DJMd~zT-Qo)kP_*-+amAk?l5pF{C){4Xu*%;J^A8#l|VGH zQ~N^2j0UweJe!%OeNv4GC-cv_sUH=!w`8Ddek4tW3&nyz61%Db)G*11#4|^t>MQlqv!~te{%t z3ty^-Y7{v9M|Q^_WLG5 zM(YsuTG9XR+1M)lahZzs%i~wD?Rlm*Hm=a3tO>l>=N15by(mxoY&2E|f-2V(3P+g`d*}9IcymR-9JPK#%W=BVTq;<0E01J} z95C=W^XBM3UF{k-e<8gc+8fmah>-CacBf5-vH2@&rv#wo-p!rZVaoO=qe|UCnl>`RR`QJ- z{RrC^xxnLPF2r@ME0BymbkOTXs@+pA7fiQa#S{g1SE#SMnQma;tRN`H_rdri;x>Tq zefRgaJ|GgAcd1#h^*%-|vbj;l^Z!c$uRi2IYo0rDkOcxf&l3MNl)3#rPMCXVbI;hi zFR}Sap5gCi*~f&JTxH%O=EEjhX+G#X6EhyZ=2|IWe=Dub{`>NS6B0~ zX-X>4x8+QhCv=gF?Qgsi-xGN_%LU7NJ=}*X#IF5GH2k|V`-PYbmt&w0M0KuB%p%1z z-{K?dGV)TYeJqLdSZx6kMl)P*Y)#q4Y5Xd|Tn8juJO86zZ>G%8Xz2f%7yc9_K}9eM zU3E;=t})90S%rR-83bTxnu)BUzSM!GdDxwKBZp9op-R)FENc)X$8b1K18Rdul$``N zD0GF|Fd9eh*PM7d+1gQf(g``LV_Aywa}&5RV#iP@>3I$m(-x|;hMcwW(mJYDhRDVS z9-l|O1)?mVylAu7J?w$2Yc~~aI5hVRt<2ktbz|)Cph0%f(8w{StH1RcA?lyhDTe7d z55-aECum)(TRyqhwAtoLnXRKT!7t3~lZs~R)NHkGDl?Jz#0TD~0x7g7u>#jDA z_#WZpef{^icih3o7?nj!5*YT_#g9-jo4)*b-G#~&MoCX2z^R9JaOvA_pC=YnJB8-$ zAzjWsw$9K8+)vN2r&(CN{jm7jG6^FmdZBoK zJ%6@>GOaXohYh#8ah5$2eQw@1A5nL|f4}6dp+JEN?#^&^5SXBQYkk$YL(k7yMZO8GwvAKzv_8Tj1pCY_$r33aizHMHiBvrp8u zyz}3|#rufEuhXaj-HhIW&(GS98J(S-kAs9>5$tqGoos*K3Lc7l1cMRzWqjW>7~6(a z6?mWcE2hG9*JXU3mJVVU)enX=D0>5cvMd=lRjWp*ilv&8QzTP{bo>d`AGj%ojhun| zrz=V+Foss(a@||hY}fD}Z6$HE95P~<;lHD8y)oH#az&~OB9x$#q{XZz6c(PE1iGyEEhq(7@TI=+SXaqc!Ngvux-$~oHT8oboc(3dIO*6eW)>? zcXm7Vqr}0};py@bouFY8r~hZ;)*5D`XbnkYhP)9a6e3y&0P{0sJ~fF$h77pda7ZdV+b_?wgDbrs2g5fg7yM`+z>tZ9gEaL^zb?BT zIFuC9huZhMb+^xU2mZ9rWoulyt-Wsi97~S|!eCFD`junjx8-~m+p7_-j5sNsF!l8K zt^>)Ev6k3$4P)h&T0NtJm=ZJc1US&CyQUS^F>XuvOGe9grpCZWYdV-r$-K{y(w|{(Np)nh zw=SL0eObSwSgpAZ)NnlP+erONRxyLeK_Q15v)*4n@p}JWz`Cpl(Wl@Gbl6JC8zMmx zmp$KO3zmgL{6En=xw0Xz%XsyOsBwdhTl&bqp*q%Z z`VPz~sxhTG!M?_+@tR~WQW5*dR!v?Z@#@((w}6q~%z-o}fIph`*PI$Wd8SsN+~TNW zRn;QDMrJc>4iw&Bxj$Q=Qt714TFRB55|APO6dMguXMe36q)*prGhwf!|u) zaEg%-xy)y>8S*-v75_>~u#Ao% z0IB-&NWiUTXR=Jmkc|g}l!r8RxKyPL)SN6A-x_^ufj!DPre*?nQ$gd?aGSZ&H_?CL zEqgRr$oaH_CzNk%Q7S2H5HoPM%=Ovh(FATjNg;aH(>RQu=@bJg0gj`%=t^shy;b=TThjRpetZl zl>{109TFJ!A-NV^6|nEPdyZtl_dex$1{!M<_jjwb?d^GNL~@$jdlv(QCo9p=`}2=M z0iy5gf$HztYg{ev*YPZz(vzI`1f8GIupMBBSWVK8hwSh=X+wg4y|Tg>qMH4T{$po> zKmv|a5l{ttpwn|AHVc(Jlo;KB<4loGsUaS$WIAViPkr-Byb^vva^&Z6T{Xs2j*pv}oLUzEriR_i@BI ze2?&tH>a!AWnV?DOm!%duY2X57=2PIAYHe;3%S46H&YhBYyfHt{MhR^ZduK4{uRjY zymFQNs5_@pNGl|M*^(zvP46Fp zUCNms71PMIM888#Vtp`=UJT@YJQ{fACPn3amI+WG?6C!|JIz4Magzi(N!dY6YX9u_ z#7k~q+0qc1*eY^&OQ}`5UTUwlM7sQcAhk#lzbl2_wzhMz>HlDon8?6tGJS?DTT#du ziJCy9g#lp-Khnr}rlOU8mmyygxmZE`c|Iq-0*}E9Q?~A{I+Qjay;P&R${#tR2MN4! zB`XQ}*^(b=cg?VOv{RJ;o9u!ryp3SBeYz=~vSVzhnsM}f<2+1Qd=ORJ?W6>Z&rgOV z&1jEX%qoLB7*pl)NFsOLf&Yv*LXgp9Vt~QH(Y(8~90)H@NfoizontnusBX2^*9-D) zZj0Wqrkdku3q_V`+AOX0!XZV$RCWkG2B!cjTm=hBIyLvm>Tdw%q?EBg(xm>$(1Fx+ zg)+$3@)K6pB4o|YZ(bY7Sy6a-x)XWU20UJFL(J8AXQv0bj^I#O!26UHS8pod=;dZr zkSulFY^)}^)For47}X8JX*bmP^c}twP4X{0EG2v4ks@L0gj>waEU?uAE!BirtY6G9 zIh&`0@w$C%^ViqzF31gsnmMgp1W6~DdOL2c%JsO#-ko|O&R7sWr?^IB;B1-8=X!ON zjymv}-SLF8w0@8OiE8#aQ9lcO;-%3%`z8ng9k%XfnNRR}hfZaAla}UVr>%0I(SH9q zru^^P8R6HV#A&!hZQF#`=hZ)0vX5qXm&ZC&Wf<>k<-gtISb_P(4$&feZ>c*4JfV$e zkq74(C*UAL$a`xm}XXfA}z`-}GY1plVyt6WLAYJPdu5 zif*AeiK?V4@SgZH$c&7lCjI#@#V9kZC=wcaKR;E~>Rv73Ra90^`4oP(UfsSb$(G?g zPVsLFj}uVm6+E$7-RsPWT25YTP{4zeiwTl7T)+W@)e~}ko2Bw6oicZ3bx9|>j_Vh~ zU;qr(7s@s9Y&xe*8!>0*4?g-)x$SGSj;E5fuc&>Q+3vA}7oj3TF zLr&&Nhsjtf=o{XyvP;Wx;_Un{PKF^foI+z1Rzj=3?vqEyfT$muEPv?~HYTPTEyk?v ztg;%qzW7LZFdQ=#$D278Mz~kB{>XLxKi%duW`aH`GB*k2R#=K^5i8jr?||g6DI6mT z21RT7?(7bP7%Wtp7vS@bRs|vXu~O9Zp-IpMK1cBv6HX6gM}St@%1wNU-oYqi zkwm;hXr2kb+PP{kgZSvpxSZ{n3(DEpBTD@FpZ;G=^&+Crn73{PU2dM?KSqwlVuFG3 z{lbsX@dXlne!oO1suj&>B#_x*qM0dTRq>UCY?77B@uJ*dT0G5$_q*2S1Tx?gk?Z4C z7adIf)8rBp?KoRkSIRBOqH+=$pw&qgB3gh;;YJ!)?MAgeYchc0)`2=;=8Ji!qfHy- z*imJ%cz7CgP8-O+|8yx{eQ>V{qh}}_K__P;j!KXpd>wPXVVvdW1jKXwi!l;vj)KQV z4NO5ys2z!4wSr8NwTW9cWXU5c7C$lKYQ!>8KEtCihh+89C{ro!dKKGPmWGZzl2cxy z=fn%eWu&tJoo{U@lEg@!?!WV7o$zw8la-{f7R6CTu5Nq5=FwldKQugpzdE;WfOMo0jFE%#^!nUr~e5{S}w*^q{mS>T#r{;B&&%Q{yzQT^Q2;Km*b5j2DW z8{pMWFOXM8Td3X2Bm7=Mod163K~K2uK1x`PRu)p&>&AV_NRU)M|5qyMaq@!9_X5r` z8*|rFJ*S9C*28gfoOLW@9N|$)#SJr1f1?T+ZbIL#)cWr*PvH?%S-?ISmr}A zB>zp>`Xlkk!-@2Y6gK>J`{=wca6)~80qcTdDnI)d$fK#*B(***^BM#FB7c+IT(QZF zG+pBvF`6+nq=EbToKQ!<-~=_M{P^(lu&2i&Sd#@MwWT&!BM-TfkUGN$;0LUY3P>4z zE#%IrCK`Rwk9^_d=cEmZ(9NP2T+cwV~pqzHnBx;o2~pb6hO~8E#SyU_qZis`G2|e4?0w zChBN(=H~NZW`UP~s5WFf0QV4jIu5a6a+ZaJ^xO%Ix6zMEUuNzUdJglx&IP_{YGI z^;7x>jvgz(44n)VVT8&#alfzf;aJF7_RX5GmS^^Ez2ULRzIqKMJe12Wv5!!lLqNf0cr%Vk}&{rj9pT0BeAn=Fu)xG~8vfe5zuC-eh z27)x+xI-hs-GVy=cMk-2g1c*QcXxMp5ANb4G96=~Zc5ft*zTNQ{mo z%;b-1x-KR#h@-Ti+B0kzG6n(PCY0?Zb5ULCL)y(w7M+nKsx&$%lJaA^^_5+Brn1E19T!Yf@zXgDE=|rPE0^>R#S#RS{k`&q8Ld|x zEJ&VpuUzt{Sn8|sFFk>{=W1S7cDS{Y+1lQD(`2v)PWT^t6*RY_{P#bftGaGfLM0Sm z8ZC!IF1^1$*nV@D%gCJ0sqmP5(&bh{7lkUne7xdGCI`2VD4Fq>{Jup~wK;GfblA+e z8r1>Kv+wcjC`i)Jqfl-zK|_9{qCD$c6M~Q-(H_JajSUUzFicIlS9a>4`vwDEdfQ;>jWH|r71B(A&zIT;dw2hL;TU@8_RsmD%Dlr;L!VGhqAOnpX}@7BW+Gx9atsqJG)a?OSoT zp{Zw1EmW|&S$9z0VFXratV{_tgUKO1eC3Y}$kgKH_6!UrFh#i=EU8lv`baYGOgk$mkSIWLtgOaq{%)N{k~#2#cZk`i@z^ zf;_81{EFwqyqs^htpcPCDP)8B}$0*6Je1P;Y#HPa5Z1*>0)N$p8oW@!!vie z23f+8oB4ELJ2*hhp~&eD?c>?uB*Z9!{;(rO>>&MZ`LY#T%i#{7Q#)u)N>f{D$+!a)iPv&V>O?k-R9J)9);;h95g7*cz z#f#9<{CRGj2X=s>DSHZ<9imepZJ)bM7TG%wxhEI^$S} zKjj#gEcyH0(=euWvpNmrhss4NY~4IwG6Z8p4l(GlPfr4SGB_MU+eqF_)44cLI(C^l z>DpM)>gfj4NYj9S6I%kH>Ht7M(+sU1X@KOvpd*B@0wDj697C!Xn;kBXazdrd1T?S& zwme|NqJn-WP0|OqMLQgcQfMnSY?z4f!#2cFGoLwbu9?qB%Z@+39zy{8o<+NAOgTE6T28K+5f|p?uQBK0PMtRk4TKF@_Kg?)m z&kD3%{|im;s99%M(wGt@Q7MhTCrfHinF}l@Q#LjgUOJ$FT84IqWeZ!ia0HdRIdnWpX9(<}fA%H=etRzo6ktY(H>XOL5BD>d9ir%sS z@Rcm!Nm_t(tzVGFGl=|cn=Ll*Ni5{?zkXr9w`zMyWP5E3wXVROpb&7HFXrA$C!Csm zI}h87ho387+`i>(FJE=R1okSd!Y51l{iRpCCe+?MLpoYSNaZMxQolbX5|~dF&hp-- ze>)7an#eX1+T#M*Sbw0~BZ2c>F6PwaB3cCcM2P0RJXq=Zo*@~1W2jJB{mn+M(!zZ@ zCrPwez*VrzCaEX;J%3*ClQpsgBGagov4+LV_tG`9G|<$^8yp!f#QnH^cz@^5-h5u{ zl4bbl$2u$_dMzoKWugwWq#aNc%xAnHBWe%E8FC%xnP_v&?Nkx{|Csm_wR6YdDtetx zA@38?i$WQbEW?-a6xIq=HnZ7@*-h7bz0x7h=jYL;BP2k@BZH|vM2tyhtAs|WPxcAO zv_|~8A*8yNDzH(>7IH4w_?->)Z$NZEiO(Wd9raLEJ64a`h=cO@4uc?aDco5;(qYfr zj}2OV_kLjXqzo18uUBW)p5w?UJDykd@jW%SV_pYMBZxm#V^dyE$NZ9$_$5AB zUP^I>G^Dy)2`Nj8+$J^ZVvKT3?Jqu>hK3_S^Y%-jg5QTb<|Vig+ZpC8EN?0l|({$r6&5YQ1X2>Ks|4P ze#bB6#tg0^ch0?0w$EY5LnKT~JgQ5-h$T!azUv~CW<`T1)U(6~wL;c{M5f{PB^hN` z_6|}U;J?&Lv125~8P2s1><5_pr<>SL_BUFc`s9=Z6XFG-v6F1h3uIyso@M)k0cfd2 zB5*a>{At7K!e*VWEf~XM*P3>0f$|0PzQAy`FCy+;=H_u^!@c^cBne^f2Can@z-i7A zx8)q#R`+TcXQyKxXD7XgFI_Oo=#mB2TP;rBxy3nbC)f=c48};}=*B8H`Tmy03jBf{ zyQEil^-8DZh!CfsKf7D3!?R};sI%lMrHOPvhy3Azx_l3tDD%H0^VFiwS(6cxi5m99 zb(VRO3EWk&vHXR{)1K`ND}VlIvdHLJIjNz@`BHVKr`+htBt+Uj;A0513fejJJ!h==zb)~aj3eFq3!d5Xnufbef zvr*8)C=L^g%%jXrFXeTla!}9@W4*UfqNcijG!9d{#cpxqh3RuCChF)W>qXn`m3LF> zI)Os15>XJ{cy)**_U2xPK37wrNT3@FJWRRO`uNse=NbC!tRWaJ)AeHZ_Lh{pUVHPC z<4&}0DMnJYsNf88S&IK?D*wN+i)nTW@xK)c$x}InQ&@oKW->w_&kH6l`3kPLau&>G8Mn6dW06 zowPA6tZbAC==W=MVhkcR65z;DEEr)A#C{FI1=$wI?V=yvxMk*}>95ssg*{RLzUHNUyG{(I7fz#(k1v-eO0ZIQr`GDM*Ek@?Se?#bJY| zP0&?6rzhxa|G&@9|C<006VM&`$`&TCF-P@pXatB9kPK5W!^q`>vYt^q*b5|ds(>Ul za)RiC#-sSn%@l6UkrXk|z5TUk1|??r&yGlpE@l56+vkFUBI_p^kepjElv23*JufsG z6$PS3J;{`sBt|LZDpsZh7vCNa?tJ@InK_SoOoZX}K*sTu-YP(E@$9c050aWBOuU4( zd_(5%y0zOc;>^C{zIV*Q(*yjU|3Jd&Pv`8Z`=m(1jr1u3?u~8j>>W9k`jS<0U`WOw z?QC`gBHBe3*H+1^ZI%qRAZQ#|?yC>0^{R;s7|d zLYJxJ(({mcG5CG^bzb?1icfS>w4}h)eRr~#X|>D!a8uuwkUQwiG7F1Zu!!W_u?vR0 z&|uMEI@L<7`?+lLu|dbf;7r-(YPO!bXciUl)T1J2>rtHlHLX@LBHz`!zMRWNs+2!Y zhchDCotMJnFTQC?NWWAoYNT&YbUPEsL>rm4`}&2H|E=z}>|^yq{9}9bRq8q9HG&J9|HP}oB)Jgbm$u;b!JwIXjOF^_R?OpC&ng_rrQH&sBx zR{JYOKjI5eCxcd*sIpyt`ikH1yNU3h04h_3EP7tOh*?aF*i0!UuDrel-W*OcA^H9;M3KN>F?W zNd25UPXm-HA}ARi-8?_R(|62B73%Ut3J_gxma(zU)gZ6g;V{m*{D z7l2{|JW|VlBIy>BWQ#l`v~z<%EkANpSq5jAK*Dl-grDEORlx&kz$(JyMWIQ18I|RK zZ4?)~J#gz-pjz?i6Gw!95k&<^`wQ^==9|M058#X#YoHljxCoAztm_RXP~lM2;IEl2 zKZd7n`paV%TEoQ0R3bOks>-fo*?@_XP@OG2OBYImXD9=tl2=M2lfcBBLPtSqP71c1 zW3!wyVfuN+;x6`BXJ52g>fb45Ji|tfiCm%>IiMG3RA9e2#Ef}iv$3dL;|>l4ES(LK z*xG%>({C=>-ppU|{YqimF|fkDvaIBGq)tyTGeG+jmcUGsy0ffQH9PGU+|Q)Irf*53 z#xERnYXL2D)HRmK+nnqIJ?|v)zAS}IndA}RWLM{M?@)?@NAtUTJr8Iw9NHjL?0yBL zOeY{UcTQ-eKilDEUds(q5umZk?D|&jSL?|&0%{u>NtE(pTO;nOieA#jf!uSkh#jsR z6pz7V*;byatVH;!KuN9R8te5+;r*NMWwlGN>2oOW_A-c{AaJQ5w&&vSjqLTRw-Dlz zfCwsp7S7j$MRaqyZ2I8+QjVM2<2a6}=sOGMk!)t_fVT9>lXpM!CZkB$@ zV5@zvBsXY;US%uvxj4!QasoOO8l7zE&?M#ewShR{MEx*+CONeFy1Vp*|LP1LdjNf! z^z6{3QNUD(8t@fsX~lk3zW>!^_TOFrnz5CqjSjm963hwRE}jXp=j(W|s4%ao&O6=4 zb+Wc>f-Mm;ijL8~#9O~$?GNY5!Ds4&B-UVve?YWUH;NT|Fy< ze=an=V9Z4z~nQp26b6KHu+O(#UMLe#*nQc`C+UMgZd!us$R~=6D<5`sVt{ zw9_qNHc>Bkqgd~@QA&4F@FxC4k3w<3)R`!J!LduELb0z)_?mt_27~iic z9e1W=>`?z@l=uG%I2sAiU!m^=EU$!#nL6wngzQp!0{y@r`Pwy*%(zc7DXzadKPVQT zl%0cR8Y9T9Vo`6(UvC0oVt1OsPIt37k&8^7?VF-R6sN4}NDF7u}ob`uDEMk~tfM_FLhpg8rZ3x>wiwsXKVp;BTJ*j8n zO@}HE-dQ}?>;T+0O^ATi4Jsy}`goQzj&oF|z)i1t9m((0Iz0sxzfj|2m5Scz zL0TD0uvk=L_jQ!-b43B@3l=6({odx>m6f`DM*_YJ!oQKd-=MjvRGgy#+Mq1evE1&* z!0wdsAA+uDy&r24j z$iEZI{_V-u`6O>iN=UF(Wx0ZVO2ND;NBcD;@|DoYt_u zl?zdO6p)fCJCznct_4wJ7J3aTs&$QAo;PhrhtXh8p*@A$#p)m;Vlf*6FHoc!Tiqlh zpR^m0M$-AOakic-6ixY?^k4q^;j1@%BW8=^q38HZjn!0_>Ew>KGHjRohrbtaP)3X?BH_TVZs6<|cAr7;j)vhw=A2vX2T zQ#NT0g+&7DY%5r07~RYlu|`KjI^U<1$tSPLMSD9`8DfYbZrt=*Y*s%P2msjz{@chC zMQg0EUe_qV{D$YftykeR4;u0ktEo2Z;XR-Fh%U8(LXQ2aM(bt+j)T7-w<3y%61}S0 zjIPgq{72OvOI(pk_jeM@EAB-6rmJ7B;92%q+Yn*w|C&$(Kw<{_fVwq7kGbamD%;B> zz@jGxuH;`~s#08dgSZhqX3t^(R9bd)sG3+5i3m8A@MXOIb~5!hwQiyK<@`+Ot09-7 z-uGI49Z)x*8bv;W*j&ACF-0)Dt`&eCd5n4xVQ;RnjtMuOgy^fd4Unx128yT68CpMd z#!ItqQ4Ys|ODR*yoW~dYuF(ZEgch<%gmR<9l%RjN-8D5y;ERfS z-pOT!&(}fMT0+H4Va|S^BHkprc^(&G9}K|(`826b3Q*)bqiTdLaW z#7BNu`zeA4^)zoYXEDCe6r1!KYEP8FQXNC48wU8+#NSSCYm9*ckc6DKT1_ZJ_E**o zDi!3!n>>>^yFSw)x>0&jK5-ta?%PxO2|;7^og}62nz)oc z2!JXzU2n5RTa@DRSi|vUJ#sp7yiA7QE8L{>r^&DZaH++?{~GF?jabn~4cq#16d22` z!K>YBPy0HMjK`7P9WfrC7B?I*XE^dTrdp4G(g&M{16;Lx`4WWVU)JJy>)gYW0j$E>OggoOYM)K&r?;#QkAfRqxx6@ zxDYKLCTop$@n1D{67uCxe?uC=-3x+na53A07Y}&^kj(pkzL@`1O>j#! z-*=v_F(rJ1P49265d6h(&!)62s>l2L!t_rVabB(7lHqoEYDcGsiE_(61}fc_d>9VM zq9A`FIlHl5Y~Y}Q`PiUl(|*GSa|H7azcq>OWqBHBP*RM>H^CvS|8zq9XS)%C6vQ(E zA^es3Uq`$g6`~chNV26}lDev((z3i^j3@n;9XM|8hzPW_F*dMQ8tImwwSaBIwz{)e z=1nS8K+WA+a{Og>8=@G~oJ$(JgMrOZTJYuXo zY;|nY7*q#`k0q*!2#Kp+-#QZVqRC?=&($CpfgMG`=3p`Cm`sgDLD6xozr)%(J-<3= za9J*)+rtfxzXnN$u>rriup@tK zVYKUf+IkT$TI3zsVTR-;*pXUbXum4@Q0C32Z6pxPSL+-%1EYPCxD%%kFKMa88~4K` zNyI$e2j$y*{T+G@h(Y|FC{^JF4`XfBhcJCJ|g16n?=%AC{aL{@^g2`aZq~t!t)5PzNzV8-(aUq&hyr6rF1>-w|y8T zy~3=~c-GaQ4Io{as`G}Gcwz&$7Tbvfp7(OR&}s?CexR$Ya6Sm&VzTMCm*q?d1F!xh zN9GNQ8;hj0t?O-~ICG-5A=+fsv85xAuWbRD%qTfeH0ZqUg^V)yxjgulWpUcz`0yKQ zig8$Uw*W#1t~!rw?;oqJC;hCwZ=M@*btZ$~eI|20^+TlI*wtp9cwpI2xo2@$r^B9& zRjYwd|0}a4N&)!Ob2S=w2NxSm=^@m;&!$;(@CdYQR53({kJ2}_@uHkXI5#CoMJ0RKi?Se(VE5KQ7_;}hY@f%TK z8Vg=Q-38|wmYbq|h@wNZuh|i;glxi3&uxaSqL!75!E$fvUwzh2nF>1|3YnWdPJ`)Y zS?PtGc`x>PoIHojI&#)o4zM)>aOlG5-TMJOa@u|sJ`b;~6`6&!XhicoBI2_{s78aN z-S75Z55<%K-Jce3+2;8w2O)S{%Es*=UwI{ZTw%OO`m;x_Z}ep=`~%en(}|q zY3gJUHTxVeF{0+qHOIzZz882%9*vQ!$awFrkp+tfdq6r>NQBBN|Be_xbtf71CsRj* zMGu68H~=iM50r7BEznBo!&EkY8`QONfsT^$>-xciUn4`VvnVaP<-KLUXH>Y+*; zLmbQm3P5S5Jif?065-p_T}<*oRSdz22fi)`mpQwUZ}V~V%n@R=jhS+TGHt*X{Omaz z-JlYmAE^AxFf(H8tfrxPqZRP7UZ>@gNG`!iz^$RJ|hQ_3ux(pinyC;+9 z-KU$up`vQh33r9~kzN|*brsA%#!d@)#JLy{z9^r*FrM#wK#@kHm9~&0BX7t1k%?l}#^jf}b zqi?=M&rC^RCpxcn-a;RT-tQ{^%!ua(ZUkE2m_~PejPR7AIBMxa>LTVX!clu(wOD^D zYnh(=9k($>^a{N$0udu=bMbU$EfHA%Z(IuC;T^Nqy)Goz0q|roCVpor7ea@v==g>I3<%zZDAu-A2U6K zP37B|GhRat%%S3QH{|Jw2@K$|rLVYfULBzM7j*)h3U$@PT#Y1mZGEaeMOi>iRwZ|m z)nlyA)88}Bfp5FXe;OmrX5#xN%Q9ty5`jzeDUNtl&{;SH_uXsUT~Yalsp(a3D3;=Z zs*N~ra%PwsBvyyw4)f|UmYQok5xMo53bB3<$rYpVPw#R{yBjCUoNfa1`WtG__tweI z5Y~HRak&ix*BrSCU+sT5JU!EUzS)0ZK~z@+eN-9kctu6HYzAX*8y{4V>GxoXq<_&V z&MwIU(wK6_e0qDq`I1`(zDax+z#64SSw+E0Q0A4{Pd4L_F+;f>*fvRCUda)$ij!`? zL65wbn5~-z>W&kDAt9M7HE^vuH?@4D>4hsxAPJ^z5{$>nktde?PfhF}Y~4Hss5h2n zV1>-R`WG5M2@pW|?Zvqf;GcN8quzL;NuSYk#R{c}O`u>ZW;U3Kwwn~gt2oZ@JAB?1e-wNLTp)2H zxH20ait%Iegz9>78eT{tz6l6mP?U3Hi`${WA2NlNSm01ERySM0@jh=dAFCH1#0C+M zSa282a4POW4*bMW&{_SiP+`*M9xrgKk!`8k`(lC_R3+~;o4vE_`%P-=7dfIJ z_E{^Gclw5JN)9durj=ysdbel8c=>H~!LOwi2Sn{ISzi0rJc77E>=;KvBsS{68y>9d zUY#kiA7Tmj7wfre`$!vf3>ElrvCE!KKQaFr{oJBWi|-`?|7=>l0G5CC9bAs(*^8nh z#W!|i5wGn53yZuii-Zz%K8+y7 z9y=M$e&ioBEt^=&YHG!!0m4Nbiq%Z9&Paw@o^IO`8+gf)ACL zD;Di;o-Q$}MMSd?h^%W4^o}zl_(etNeVtrSM+!D=ELmtN|0IB4m8 zypm1c!>BGpk|dBF1_mQFl3zzwhNt{#ebjaR0gWrchta*q7Wzspa8=o>^y{hV7jBHS z&sX2AqNhLZNA6C{w;y#6l{K|mi>_Ox&Rs9<=ew8J*RkNsF zy<@9|i=vCO4_@?0zw1nY^ga4W*90(u<%uocK1MA(T;ISyp?_uj@^M*XaY=LsJrF$1 z!6$aaDs;URXDyP3{wtB}>y(%nb9F^5bQRx&XtDC|IG+OXv#C;fE!`Yby`817J&PPX z`+gDNlp#?bbn2GDXb?Xqcol;&!1~*pgPW+90@3_c?5m9E{%JRVS>*V zZ{@axeRmkGrGM0B^lzn2Yc9-(ltnPHWQ8xz!;Tb2kR35x&DT!x0JrOBcBzCPr$*f- zt{GE?RL`HFJ^SuQFWrHISQy>lShTw~?&q_}PhEOQJdBeX@b>J3#j>bxS03$R*YHFd z%}R`hB8DM}V|sKZFi?Z3hjGJW(PmbUQyiQv8E-db{@aval_OTu^~^H2V_ux!$7!D( zZe-Y$(`F4H`?t@-$95PKr9fkSj3_fLRO%hAR~LB0$okJ3gDxe0O((qJDo9i1i|~q3 zZZ#O+iVE%Gxq*n?ER@UhQ+U;K6LpA>FGeT?w zi!%ve1m{=PoCFmZCV%uvq|>5~$E|ScKX%B|{q#ehH4IaM9O#^5ae=lQpA0H#6v}NmhSP#%BSR$;}jGur* z#&yvQr(nU!OH-IRMkC4f5$P~sjw9A0Styge#IiW%JSwoj*&dnsr1aEAce)Azy9J)h6w6Y(Ug5zcquw7S1CnaB*t2QnLnXx!*XW{cM$=$xc^dhiLKfTTa z@NyYLQC0L)O_fmt(#zw4QNx!u0_8L3!cuF<&HI8q{+n~Q{07`PQ;FK9 zrWW}z5Pz=FB=T2hW(W~O^ESTNprPs%B7X1Dt=^L2{+UXVU$wD!yb8bN z-r{tEykDxkzkDi!S-zW(n|v^tGnsN#`8}|BMw>qAYYMp)r?2{t!PL z5>cn(;t*CQzNX1rmVIV4e9*LF)`CJn-mKz=P=Q zX>nVGtk>dty451Xk;8DBTlO_ru;b&0%hA?0yvdfYHnJC;_vsnAbW1eY!MyRYnMQ64 zw_SCwLhRJ%EKR#_69=wI$KRXQ8SbdB`uDvgd2&5mbVBs&!%FtkG|RUG3cm^j)x`u? zg>v$Oy7YHSiNS6P14*M9cmWA@8-M8fCIg2;f7>|!`5J(0yCSB{M(obrq0h{^>cqsE z3Q3NNKmYR?{+6^vS6S{$SIoE1m(p$P9vj-r31yG>AhCc%C9}(T<6Vy+7w`M-^U3;w z9s&ji)^KHNQ4q-Uf!}~90o=F_{5hI4mp}BDG^J;=Y$d(x#U)c0;>!iX&*zhi$(D;J z$M3ejuF`Ya+<5@)gQ8KcJCQv#Cx$1LsH-#V{m+>KUX>>rQbsk%L$@3N`38}+bYW{U zljN0)rtz054gZHh8~LgB$k<-OqeBxx_r!|gWUawQbKzY;(s-ilF%4LMmoqBVWSz-* z*#Ag}2mik(T@?|Wyj!z@bmabj1`Ss4159g?3p+iK;vBgxm$hsmo-jBka-rf58zG)N za6*`m?QMBt@}`r~wij9>kQ<#jAmYcV;`+KdioR{xxU7p>tK>TYTl2SETO6SpKkg@e zJ?mk{cV9s18TxM2^*tHAf<$jK)uxm}cMQbKQHS%%uhi(8!)l5c7_^yOWXP6)kO-~{ zo}Vpyb(!TxATBhIy#_L5C?2v<1FCWPOge{j$8@v8+D&ot;dBN4eE^9v zu6PH~?(OV*eAU2ODkBa)a!9sq;Yae`w&gc78@VirYa`)w}cvoMY9#yX; zdQ{w|fYP6~-@S>olxTyG7lPortl5xg)*?DGQANrRw=ybU%>>b5?$F7*Hk+bp#h(5P z8l=j&-c8;6Nw=+30E`t6!l%+N8{}KwF9JE_ZTD9a@qAG-yO>+un-v^0Mv{PSMdDXw zlFU+D9lxR%!En_;0t}G{#0$P)DZ8I|e)v4g=MOgA2~v0azufUl!V?;lbhB@|)U%aQd7sk57s;OV%d^FEUz`*;D%RwDi zXmjVE!X#YMukNz1ONlG|I=IV9L*}Hbvys8fwWaW^Pkt!>*nG6uI04B303f9<`dBDbz05UwX_PU#a zmZfyHc^`Q^`zW@un*%*fE1$^7UyebrYZb6|Rf`tHct=JB`5Ik;3MY;lLN#?n$dSJ? z2wItEy@zJexI7GnF-)a0lSki5M;_0ZARS=a-Q=FHI<_|mS%q$8a2U;E^9*mIz4u_{ zt2V$s+$Z%D_i-sh=bWihmmDE5TG{1DEp*`?^N8BHBH~jTUGM*THv7>`NVeRf^-Z7$ zv!Qy)6Lc*ZL}cqKE#iX@Hf~>T{D@{q)H8U&4Q|$@|0OzoAU8&Wc9mcW{YUL;Lq8u; zX2C=OKv@cDLWjd{->2px{h2M_n2gIuVRuAwdHKQ*-SmF_Y0kP(#eYu^Y_fKIxJudv zJi2?cdB9j3K?;F<(0|!14s{dpzVMu0G{FjQJj}IizeR2O{4yabKOWVcxnW53d4$9I z`EuJ!TToE>oq|NVgo;I_%&7U2+$&TArx6YnO>Z3i4A6U}%;Jb9!LV|m6_6;UJ%1}g zRs&(W?S2z_B)pz~B^e)^=#JDSBOoG7d8#g+atT3MDyk4V{i3Va_UqX`KlV(HO_4 zGpdD5nh-nZ`ZJo^{P4$D>052+88qxN_mulhz3(vos)Vuw)`e$q zP=v_$qK82g8tJMqp8$r2kzpUqS9^Sjcu-kz=c;PmO{JsT>);)WrOxgix012)GkjGuZ|f!V*Ssf^Q`e{f|`M30TYis!m%>m1LU&9QtSJt1n1pg(r+ zE1HCnvHivM_pvBanpOxzGOe#iE%Pm8)7s$8O{;WU z=e<5p ziS9ysHBZQJlwxEsEfZC|OP!6=T@g=I+Al=Q04e)EZNDZyZD-+^$d ztM=$Lmnbp3+&^-eujR9B3)lgYvBiansGo#z(2n*Q1&nwk;GiPlut6*3yAbeCT+l6z z**`O^uK4aMjF4=PCK}|$*s6)(oc3z@0NCdV!2^nyvcVV-2KkDw_USIw@&S_hJG8su z`q(IkL^yqf{zA8OpzhdI@T+};%VA_5*evhARWWKxz5U?^NMnDrXNg|q2QBqKj>>g8 z2|ezfcpv{F^T*0UX_SeeEVX&V6^@6kqCq7D((yu!yJ0wJC5w`&KkbN>p2n0vuiXxd z)1!;PVbED~fRqv;iFneLPr)jMc~cRU+3 z9|ceSnTkji4NxOIM9Dg9if%^Cj+o7WmYsSYIkZsjN8j#&@rJm+|9N83!#@+zz0S=L zq{!$`pDuO=lXHxu>bBMM0fA((>nWPSPJLgOQq^-cOnAD;5uyNt_1;DZkgx4&zsF4O z73TPg@7Zyd&D1CfSX|(^E(4Bpo9FLc0NWX1SGO|^mNwP{q*cH4F>aq$Lw9ngJ!tf| zLt&&&*oOr89Hi^LWr+XERUt%y-{Q2fyWlH+BH;@S(cSHfT*dz$iMeQiFKfZi@g#PL zFDtUAc~@sJgkjY?{(a+1)!QWlX_HPOv|Aa(CrstAv}*h=9cO7ua>ST~4bVLmRwdTw zgNZ}2m-a#+ODZfWO^ALi6^7=_SfTG!BI~sd&B!@vjoeeCpP<8QfaXwj3%TcBz~vge zbgE9iui7xz^)tcP-=V*L| zxf8)>b#Qwf!@z@wR8cCeNE*H^Q!hX@s!D55_8YE(Mp_B|SX*gA`qD?4 zAEgzgv&;N9qO99xg$o>`WOMEvP4i88INQHaQ<`&aU<3~wjn#}2 zZ>vbu3ZSWFvFh&Y+QE>b42ct}H!le%yd2og#_A}1FASByYrZ9p?s%eqY$@^v@4Ox( z>g~Y#fUM-doArEo8iazlemm%4KKRb;GR@-sLlu(Ri?FlHx`##Q!+0^E$ot;l@{bD2 z-T*J7?9bl|PlP1an0pBH-TenkH_k8XVpOk+)2>L2XL@=hqiC4`ibuE* zK-I)0k7K*xgvwxCj@!FzmnRwdATsM%#U2u_lq4d=V#MP_B znYpAJ*%CPqDY#m&*h36>w0W9Pq~;xet^G0l(tk}(K96hXoy(1nq_gpR9fr{N&E0zJdj#i$(8b+NENrX4gdrO3dpuKPNXZmV zAr(#%9omJ_GS4Bt9N!&rBQ4rtpHT!5ID~~71r|2N#l6~B-+~Om=jLmnf$eP4vpk%U z8Jy&M!q0}QDx`|HP~S%9hcJlYv%qoLe3AR@4vW7Aaxx=rbgtA!_&*4ie?XYJ;y*P* z0vW$-9PmFu*i@9jPqb`RlaV|x<(Zo>aS8!yP|lxr2TAg5r=Kf!{NV!Xkd(8rM-wbt zq3zvD9H>kx+Ibs3LN#C!Be1A?8p$XKb==?ZbnWVGHn-XF-Pn|b^fMu14RxcH!mw)Z zz*&QcNT9Duu>*{3_e(glJDTY!qpN+%JirosmZ;-;>}AIwtivUd;zVlmgdqdVP)5hvd!=;*y#6Rq1R#I*_D2F@9HEc}~5hIm1nYphp7TT&4 zJO|#th7xB>ZLx`UWoAxv&F~zy_at{Bj_Ie28+8wWR`xBtzl^+nv$Y*Up(h*&FQ#J= zk0peD8GRdEooR5zWiq^fV!ga1%YY~E^lpM!?MG<8$%!zd-D8*X>wagdV%Lfl?l-3g zfGb(|ymhR~Z>;$WxxybbUir`NCX=u~?6MLqtD<{=cFGX7@X5BF>BGCrQHBnnILrXm z+RcZ<)uKa`v-~WobL;SWuN7h4-2AUsK42%vULW?CY1ZCwYio9>s>#hDX;J+^4UCV= zpgPoXJ2eDf&o%(V+59%%q*sN-@;_urbHbo#Sj3Aie#2I;3WZPhmK`fu$yK>=lh;ZY z>n%L|Or?e9odHRCKR(VV&F%+(Oa7)7;zVmUK%Mq|wrij=?q=*C;5cz*A+<;m$GjZv zav?I!w4VIArTNFBwBiMC|hExN@Vs1RQy5$sFIBh?iKAGVCvjg&~w^&g~LKm$*g3Xr(wK*4WM z%*tqoRg9plzHA^R|8y_>NL8wipj5zT=ses)g$I{})S}!27cMZC&z(#%$%YIwgv9QL<^C?G_<3XIsh(<%6IYBb8t6fiJ&!msVpT_HLP zbtjiC5r;LUoonDV@{-qz3H3oCxU9C8n$bH3)!G=+q`uvH*P&I(3`&Ed@n9P5Kh2wU zmqpT3#mDM87i)F5#*VU_rnI zk)bH@==6RzAUaN#nab77lfQA;Ao}Q9MB0|*gy;Ud9D^wB6XZOJ?aTc=k0ooe*#dJC zK#Kt}UuR&-URqt_i70^+20yLMj^?sKG?gA)B^e9#RcoqsNn^@K|J9xjI26np)rReA zJM@3pddr}=wsl! zO}9eY*6+%5f<6wNCX<0ML6Z_%*U-7cRYbNezD;rQ@FNL-qJ)M#n5gAFI6XKxB7F*& zh#G4T+6r=>rDDYrkb-?7gNLsi#I`OHhO;cix5j}}B#=v;(3J~76B87jx^ssG??b9i zzOv~CuJzkAACfwHT*aNbV{+>jc7SP2>8C;HnYHk_Ih3!b+Zn6vwirC(eR(VUY1AJy*PhE|fcZk+b;hb?vNjkSVfN zZu`hF`sFO}i&zg8Hpy~aq?FG4%g19<85rw9%hVOE?c7f|piZ4e5W=5y>EjGut_j6r zd9<%7I1J(c1#{A{A^rGt7b%9k{{7y%pby*PS!tgGzPNB-r>BtRnL9U6ckLdV}y%k3ivWa@Vn<+Kk6F0Jf()5{B$X5c|=c$uo@?bU10T|+B=`9)loQ(Ka$2Yq( zNn?>m4N*a(@$GOzSE{7J!k%}87nApXXtms%4N(>f_Q@XaFnjNKl+2krMBIAhfQW}< zMhaB_n?KjpU7OUG;C({T=cdC^pXZ~=?);67Z{L@eHGG`DAw=Uc1}Zr#YMJ?KiF^OS(g=X%D2F8$4- zyoUh3ssW-=Qs${q%$W7(tP#;^;nPWdu5`6p!!SVW#ATXh+2$+X@G-TSy1*A7%oyJO z^to)=!NS4oL))N73U}36bF{?r5=*|MRCo$h;q*-yrR>)I__&F~Hp|=F)j844yFgO% zGUWQ>civE>^c}Yr%Af#a0wvnL{DDUq%%0@Xefj(o5-O97Z(_Kgrug&!Ol;;6>zQglnZT7SckFbT_l&a)k6kh}s=HR9eDt zFKLRbQbV%A5KYx%iCIas`vEc7pdMJ;75Nz%s|Dc3XA;{>jOY@;eFC?A>|7xP&{Kq1 z5-)(~h2~x9wUuHYHd)h*^#9NA$N&SyA!UDj8TmO{CF7 zLUx8fQ@>RE)#rRwAl9Y-sC*;HI`shX4{>&(7QaR; zx->IX(MHf~lR>zNC*~&}MKnokrcwGQ2`Sk+>1vw>A;pNB4PzjC)lAm%+kUGq z5EUg!TasCbXc3z>ojXrQKB-Wsm3lqsuk|sIgFFFniT%j;F%2#KkJFSQd1m|{FIN7+ zKvu$7u2H`1Z|h%UFF4abbuR6EgdZ75lDFYNE`Osm{KFweQ-68j3>7A9$xz2Cy1W0& zUYpv?Sx8HjCRIN2G>4V_Zm?QfpLN(7=s5-A-08%Ph8WoLQb6|k35bgyk>SKPHMGmi zxY4GXP{WGZN2fKG_e$cuCkaKOcH<&yKi}SOk@s4lhMkjgI#xC1^m|dQLNV={y7aSZ z0a4?sSa9JCg0pY@#94y^7-jP6eB2p73BFMLH>h|13)GLGl9f&U1Jrl7QUtuwQ1a;L zTi(+X89EdEo-wY<8sVV~VU4~UhCkw22(bE;aLaC*j*F-Pk#ZYSISi^&^X1*{k z0ma}<3k$>E8V`EHVBOK1!0Ns)6k%FOPekjvzX@Gk(a3(!0b3Q5fAK;h$9L?9(zIlx z3L&P;rl(vuDbFknAZd^ln!1LcDWx%DM@ga{-|ikZW;YH0j*9pS_e4~iE?+^(Z3gBk zMecj#&L9&Uo!ZT_gT5xgNMsiM_?V8y;+)D0QeqN@uw0mo{qU0AEbn2y+n_sCvj7BE zDTJ4&C-1Mzl^CMDtsVe&`#G(bvRGAA-9H-HUUdE0KV9KngVIK(AXQnV)6S zK@GuXT6L%&(;Ytx+0zYkVNoHfk-y$&TifrsjYS4Tnc1Zv3w^d`fn1aTzRtQnRJ~>S z!}?!5=LWA$z0(QYWDFUW8hWj^%72+G3I;zZiLtDe{Pda1LgD^A@Q+!60P713q)>7J4L(CLoEHB&3>=DzT&!%*LQC0nd65ton*qHC z(T!Xo@))%7j)5&c@G{kAR}aT2XX9$j^n?<1WJ-df zB&4)iV(TjTh<83LCHD{wLr_04vOu@BEj*4zfs6={m9Pbh`+e5ng>m^uJeP4*IMWSU zk`V!v~{#xKDb01225@ zWm4?t?kaGN_NH8(NJLe+v0Y1w82!(h;P7o{#Gd9?C9Y7ab^@&5&ogyss&+1T7}TxL zQ}iLU#AXdjuO z^SB{i^g(0(Z5#>`zP*|1RzBvdLsn8#-7A6uVxk|arQAs3O*qH#qmZH+8zhBgcGy6=x>OxThjB0kjTZ9)8=n(%v;pFtWyuCdAX7)5@+ILEY__AKr+= z%LYy6hX`9rpeIXIc+BX!qSX^Uyp-_QQB;sQ<^7-;Y-eK^)V_E@&wEs(whcHk=)b~a znv4$tQBx0Ear8i#lJ!_|HHDffLp2|?&y<$SQ+^sXyIz)h_KhmotM+q!8$>xuykQ%5 ztCz%-kLf`?-$aaP4;%htN8rm3?}-Z3u9(}L?qW3q?!^2a5y#eljn&xVXDaW^|F@a% zZzX~<3PSiR6#@;S>Awakg9a*UPrMF)1+rQy z4ld(lpje@LV?01hiwH?;*aAUXgxw3>A?t;{1SRc*F`5HxP7%{;qBs;I<{3k%0cf8xQ+ z_2PR8l+GYV^VIf6h~11%sETDXDD)*Bl7-H-KXzQzY${&KsA{asfQhJ=7R|s45PVhh ziy07Xv-;6TN$gd6?{|8<=`V9s!M5ieFIw~TP3M%HFLZOhf!8NF&%(2esAj;V6ntng z^z}pad+dv6_y~E%=>*u|>m&{2u>K_cHnZCfw)$(DknPFyMb# z70_7m#p%q)GH1fjd+q)dByc~g|FD5LDkNNPLwu=p$O49OaY-q27f zw#=cAe?Qv%V!fTKjy8DwwbJG;gY9+R*>tbt{tVu#5||BwKgtG|^7{DTMDv3s7)iUw zF7OYr*UpFcPpZ!tu97>a))H)@#NSP8W`Vl?xb<8`-k6TFV>n|8xPc99{PBjdVbPe2P0u z01`iqSK%?t63HeTk273&S6{@k*@S3fbkdK<>#D9N^&MC*HPh`36OmKK+qH&8=VF3v z-&-0%O4a!PmIc9Ip+SNTI8hKd;FIkC@LYefUedTwfm77_HQ$e*XeCz@FvZo9K>1N0 z?=Wv-wR>o-$mB-$Wu@8X;K8>9tMJ*cb+I=~E27F!N+Ke}l91+qE=v#}dSbySN8*!b z4eROxYLAoA2W?P%ZwjJEe_VKoX`ttGrP8A{IM01 zjPM%u1~{6}_0~I3mw(&lm=)m9c+mj{Exy9&ybK}W?e7Vlen@Pup+((C2FIKp*4GFr6Zg z3tVvVl-xfTNk^9JGTZb~Z?pmAUD%l9Sl|1RPRaZ>To#4I}TV;~*X%qY1e%;$3&( zFwad2Mf@SnNWbhv5?fza6IXVSOm%cBuGIV%o(wbYEM1e!8jhWWk85>mAuy|(?KO?o zz`mAT{Xt8BR|#ta8(F;m)X!s$nM^pV#j-voYfFc-L>|Pa3<=Z6^6TuuT9-#UV!@Uh zT?Jm{C-b-TJ!>5QXI2&h%(uDKR^KEcrQR}3cO19gHTm4r`Q&Mm(579K$FB_AOY}#&4Got7+ zlVTFs3idR-=$3T;HUk>1#u_yVd!JplIM5FwRbcB9>3q$+iIpN=M!6J=P;?H5x4U9Q zGSRH&KO`_>IiVkRbHa~+7?;DGc~NhlE_(+%7)G|9w1*F(r-{D26~U`6nl}RHPt>yw zcZg=^^SQn?anyoV>~O}>!HZVN0EKZu1G-QWGfH-JF!9`(_8@40rJ&58^3@9|YUZ9y zZpL3xnEPavxImRo5q~ee%;)_xj9b&yMWa4-mR2RjQq^h4_qsRam%p5Z7?NbxAch_y zVl6|Ft0@qM;m_U>;Hw0qnQ@GW7g}|yvsa2XhCGSi`6i4ARJriO>r~JC#UbWa`mEw- z8|@LAoC^nkZ<#o}vabLzA>r7T-?P;D3iapw91iq1Cn2sV1YFx-&4|@xJrcdzWq|)> z$td3BbF*|QV6w;)p6c)~=bF3+GnU2$(XnUZ#=BfT+9A-YIT=aJSk)7WUgf2fkv}dNV+HDQ zivk#4@qU~tkh8W}f{$pXe`I(DO^ox4{MT|acpg--0%}k~CKmtaOjjl91i4sHUO|6< z$4Erv!>4?S0f`dMn_67^^~AF{*RXzVDwbbkQxq;GYBK=PRg?;~F`Gsj%V?uh;(&Nh z^Sb=7O*-M7os0mn~w;#BXS+ZLGG`D^zA26y`i1{!nh{BNtd z2oRvQG9*WvOq{ycJ!XqJR1v5*rz;7;_dDrO!9|+dIJlB~=JBWL1(!t{_FBAr z=Rtt^QQmiUY8CV_eiGN{MqH5|GFa{Ena#*|WaP!dh`?C+X24qrAB@2HzxI34w*r)zY{!&l8r+?}tZ^Ds-IipXY`Kc_KX+wV5!Rs;teB zka$k~W>;lqVGy!lDXDZGid717T|&Wn*V@sks!+8+YrP+7D;>Hu7?%C5Sl&w=73!zO zI(D=n2=LK-HO@Au)WQVaDD>2S{geyq>nt857A}9JxNX5V))1H5uI3oIKb6F-?i*wp zn@;vL#K85H)YD(Kb(lipBU7F2sG6hrdSn=k5iVi$HHQ(v_0Fb@XAcR^7CwsV8z7}* zhCJ$AAH_7Ao(HDzKsk~wj5S?EwVgxQxzYu8?96P>7v^V|-tPn*MMsg2 zLAGqDx)82kI(?;Gzg(iI+F&l4vCKgc$Tk>;1M?+>4L#s?3x6h4mE0JRbcFW6Ip<(TuL#h z%_yr_H4!!`Sto^k+D4;DGh3GpiWNOCW;JTD(=w80(Y{#lo+9ZJeKe>k$^>VE3VbZ6 z`xpRqyo1x46B0@M9lyKWWU2QUZE2CC(JHO5+ezB|B?$R;o*=9D1Y8@b6vtyX7 z3*d@-15)^QrVGyh>JRtUrF#czl!Ldw3%TsNSm(8+QBD`4wh6n|Eh|v%MZm{@Gsv>@ zZQ^sq-@cbUPW+Tbp+g#G@mLbPrFNc5REhe2st(|MVo8LMHBGOxWlJro;(}+AAty0< zoC{--sbNy|;(j}l;uCWF-4!;8t!epFp2Yk%k6j{ktNA-orOS0^F{B%jsy%RNjaT-O zOhWeLchm`=$*h^zV(<8KRR+16<(W|J1#TYPqJfOKzF2EgOcNC!J%`H+y}I%lr=t$n zM{gH^nmXcd?z*TS1BLu#tO395 zPzkGYJ3`tze$CwZKw_?B;qu&{k-iHq1`;!8-v8SI_Lr-X{;z1F8VQa@)L)9hU)##x z4jW#9tq@9OlPvWnM4eJb-9-+j?UV zI$KjsP_tzg6n14EPZPBb;rI>-L5!D7Odq+;=g?;&OHA&_-2dQBnOz$-?>S0ZGNz}B z2Mj_O95G< zJdcU{Pbt2=D#8M^y6)S$V7eY1{NUEt7gr&6NMEh&?ew|D!GuG5y=J(Bz;i?8QSRH` z(6$B%t`^r>uxFuZL9{e#u|99v!+w3wmuPd|N{OHa4t?5vv*q#a0##Q1b3%)+mLqI( zdbIp&HC{GRjy6EYc`?Ik?zPS|^YNN*e}P!CUM`qO2UOdem-UwT^WFtpdLoi_ndH)P z*-`Z6_2sa-PbdJek*4(*f_#X2m8S6*@sBE_C$BhnlOHa<_hX=HNdk9Z{i-4!I@k@K zvu@vxv1i%@A4qoGgyUZ5C9c7-z%Jw3in+14Rp(l!IBrt5*pkdDU0;v{ojJ1A;!qc< zJXE@5g8g_B1s4-_RCyrEN#dWzh4SDKc=^`^R%5>iTX($|@di@wU?7z-YwD!$ZkV_e z&g;3odScK%SkKXb`-p}}_7loVTII*d$Pn{b5>jP)k1N#TGM-JXA{LcW1A|u4232oT z@WY9=_Ga42>d2a)ZY+&#F(-bGD?ZkcLNmtCO&I*eJx|4H*^75vP2~_R4lXjVQx3XLlKh(qj*NNHgrj&|t{-Zy@mOBLoO;sQo({FiN>-}X1yBW+ zYUu#tr>LIBQ4`s=77!n)?voo_qn?mt5+{0Hr}5~9nfb?rk9(TN(e#f-Qe<7A17~X8 z-jndC`&mSqx@gnLO2X_FCWb3LW*Goh1BZy;LfU7(EG35YZZ-whFI;drRFS-6ItBne zN=CaWOybko*Y}jCx;zn3KObxlD)^;DwhM;-t+XnA(1=9WVg?)%t9E$d_?Srs+EqdjV3eui zSn2?#>8Qa%(&oxeY40G&-29q>KhI`B&hw#;eDm5r|W(F zyc_lHC4T!d_ibPL^gw^5(Y{>)7GKE3m9ZhNN63#c4e4_>6M!gTYj_fjnSOri?GEMkomJg3tMLtWLuunMKjg;ix?_WA^RS6 zo(^JrnkWYE$xJA<=xEyuKk2%^cKQ`+dd8e=x!}pf)2DHN07MO7(5`-$_T$_;ZK;m^ z#Rj=pUTrAZ5~Tra<^#Vjq#Rj2Nl#Np0Npyy^-b?g1eOD-q_Lu|=5lgQ z>(3UIRNAMEkCj|*6%Z8^7YTYg;<-53YadN)V{)?9M~v81L0z?WpNiUBLw%ydHmI2k zO_@xCh?kO`a-<}(`T)$5SolBqI+FL;h#--7BX3!&dOo6?7~2S0$s^tV$$~`I3~2hV zO$A(d2ey#eI%TX#|8t%+P$5SFGn25a8!{U;dSu}d)dq2wai`V~AEGmEO-0a`YM@L~ zQCddn+wLL&h~3?P#1Lq0VD)*Sl9We`U_xM^yF*^+C`Mvq3U$&J2u{kWoFq(kqdi?H z8;K<(JlNwHJ`^J8F`5HC3|nD`0%j5&98TpUi|-I6c34!m!b4!HGk&8SdY ze{5Mce@juW`4UTF5Dfkk>O>*V9VuYAbrFDXoWtpQFKd8wEoHc<@Iu!j(V1;Myubyi zyqUxG_ub9hqcjYfxN=!CP87FHu^7*g=(4`%%DGMlmeWvF;{d0F-caxt^LjK(g(31=NXsYY8FAgSs@*{%=p)rp_%H}J zGY`bQWS?KWebF5EcAoI~DP-MA-XYdoZ&`fyzY2$hlXydceKwrmzwJcdV(Q>i5VhkO z;-@7b{L5w2MS3XFubKOB=)Ilk57ao}oIas2m@MiI8lZPtbiUNT&qxPGtH*nj28$3x zR`Vg+50wymYJwBH`hLR1+S8uUn7F#Rd9p2k$wqohG2C+nL#KFwE1>F@nph{2SHv9{ zWf*0KK4pC<;$Y(ta^_BAp;Sw6BMqfib4#Xj1Tjb-o(eO_!lCVBH$(-+vzS;^KB1NH z51P)78sfZyP5@jn%om&;SJX$+kEv)AQk?qJcQcI=sfaEj-_MhMcAqeqvr#Fx6Wj47d=HRobVa!(f&`CGCK(=P}vh6J)xpvR`0nkw8Dd zBHny=^nD?}j@{<8tZ!idJgB#6IsZkv22;ycEZY{J5&BeX6D%V(C;`#7)u=54BjBa= zheWPEd{FZ-rQJSA4ce>W0f67aehg{=XRDc9-`@1C{t_WiF)lQS!M*napW1Yu3)Frk z;B#=mFI{PFY-bVFE9IJ5d+IWNB>qt95!+-T&4QCb;upmU_&GUH(IJbqcuTf;bLsxiG5H&WfkVk3tEhEB6k6*4>w92i<~b2e02eA3WKI1% z61c#@%*??xaZ6Ej$aBjl;ts5#Z3ABbWzU467E3XpLWN2>1C2`j9cRZfTuX^v+AlRx z-;RdrOyq32-yb&^B9_Yg*K6fo__rTjnDDL;!7Q^n5ig%^Y%t-=YFj|yVw;`@3l$Ys zLp{IV=z0?7#SbV@Bo7`;1dJdq##k)MoUYsPJ-zlJ&{5HfkxF@@)n%NyWWd>bbn|O` z+r9!w6``7hhAc7|Jy@o+%)gLVGG3JRiF$6Aljes^`r!{-_nRWwnF8b0iwWHGo~e%a zo*&ccsQ@0H3RWaAZC?!l4&$}w^1hwOX0}SJDO<1fgu9j20)GUc$)dcK%1L{`vu{+l z0+&B|y2fTDn}4J26MjndM|mHze3N=OPVa)~dSHIT_CR2a()+cu{y2F|&_tc~HLv%B zI(Fy9ew7=e-=^w$7^?6kgx%_Wp7tv_haf0!j}0X-tOqZ)&l3OcM<_7bV_r_KGSy5b z3Y^ODa$SZh$rAX@KO~KnENDR7@{*1YjP8zw+kj2e4WSOJ*BVAsDW3Zx=Ybf%Ts`dE zAp_*d!o38(?kVF+Xz{O6bJ%)IFSGb4kq~#FtnoX9+c0imBx*Zng$PFt~@as~xEu^woDhP|bcDwVV2IvD5+ zz(H{Cc3n&SlnyS(Ljwc8pui`4z%M!O>#!>Uba`LdV+Acsq>Q551;yR;b{I*|# z1`c{d9{bjKVPWGiqowVXh*Jt7dwo?$($OLwBpJmMYc*3!M50`uBJ4l(E|<@DOG258 z4XpeH{hGq15nR7Lkqp~@v5V<(JaY<(_-ILh?s4+K5NlJT03IHefbNCeE{LAomjr8G z5+d&MEpQq(M2nCY=94!5$VPFSJ90^%Fn*vKXnIsA{3+^v$_Q@XW&S3_4Y={aGgrOQtn=7zsZ;upf&J zD6-Bo%SGBKiaN7Zs+#gUQ)NiY)9WM~l5#+A*2q#T(h)p;3IaPx%aucdy&ewc-6pp0 z-E|)Pb_e;HiCH$;w>I7g(;KhDZpf-TTwz9#)OZA1`MG~Y4O~guVI!C4_aVp(eb}4w z!E&qA2H(z8icMs=W2$;0` zc6$|U0X~3bV{?s1f!qM=?|xxJtnpZZ_&)yp`D|yC*3D;d$$supWWyc~C+ljhy8MO@ z%>OJR`j1=+#%uz>|3?A*J(^H~?Y~98YxmhPyrM{en1->ZXKax=k>HeAm{c%Wul4I3 z)E`uq+vq>dUOKfmVs@G)$0(9lEZQ(wP(530&y)O?KHb9IucEYsmNNdxmG~!EW~;!c z$<8&jMR-HiXk-86taiKc(-VT&dqbKXg%rDy5jeIqof*_OB-!-^d_5RU!1OJHjWwoQ zs>Dn7VGsg~StZMy&;ji=is6XhmT|;B1vJ%!^pu> zB5d1YlLG@1$@)-Obp$j;c36ojxdt4ucwbP47V@jAsGbwK)}r?p$hr%RFFMv}F1Fkt z-A3E3C?|>sJ~TacrvKjUYh{HZ27DS68gAg`6Q+12rtBXr#lT``OF8Td(Mqh|8$FWh zPW0GFoLBaGcqN4vfnoslJlzg$z(_=;HtsyWzLi#kaD9@GgnJr4QcFK(GXBhEiJ^Z6-!~e2j1D}W=#JlH z2EDZf#I<)`Q#4SD6Wi0g#tQwelV&SC!R;4s&4;B_n(HT)pZ$z~2Y2~B)-(@L!Zg_Y zkU^Uviv$pZ6}bTu+3uDUKWk$pn8{Q@{Ln~o#?ek>7Mt_HBoJ4dgqB1Q)!58|1+hG? z6LJ)0)yfQig+Eb2?GxOIM% zulC9&+@pkQ3LNs6gj(8X9NyUxpcy7f=`>{ou}9c8bvG6pb;{)Ome1e;06(h()_u0C zc1_h3-Im7H#T-0`12W8zv&fKLomrNtzk7I)-jJm;2GL^oxX|h1z=S8J`|~++tcb46 zRINPr;%GHr$O3#1U%fLVvDOnN8rGCAl!}3Pe@<5AELM66F-3ad zvrqMio-Z2_RO61fRTg4UGc5uZ__`Si|U2l-tms1Tw?D z)}_4AhW8tLc%~j!s}=@0b0ey_xLq#(c#}z+S64V5Xl1PZl4O4EaQA~x4v|A+`RQ4l zTjOsE{95wDb_eb*&x9(?#je$Q8lDnA!GSA_hmjyb8rWubK+6tkL% z@%ap+_Cw_$aGW@>uL4y}b|u5Rt86(xeh+x=x#RS3mitb(?tkLyaYZ9ckYHLoqJd9L zmgy$y$P)W`L)Ne;m1~Y;p9@jMXp^Z|^Zhqo=gqA{Us=^A3di3jBt_u{=&VU0p4;8w zemF!H3RnH(G*or!?oYp*WK_s?#uN)n7Sf{M;Jo0XtPLzALd=_?>czUgkT_6*eX?E; zyex?ZzwDzfzO$2}Wa6D0c^%e8Hqd`*5BgBgU1pK5BB)Ouy_|vq#i6M(|KYF?YfEP( zu&-||N1y%OR-2mR7%o9mS83c~`-`Pwx@vajDR=cY!5Nm|^qy+Tw@#?rk3Wh{-!eY} zhAr*eG@%xT^{sd%msi&Z-S7AYH*Qd}w^!4-Ng+hnVdNVE2KAR!X!Rv`7?1^@w+Gdw zDvhN}Od&t*+Yj3a;f0|@-8mLEx5qI&@kf4LEw$L_(qqo${0<)hN4hEiEpRi2cBxdDVR{=J~|?^-F}4t0(DyEgN9V z?yCbZUD1Cr<6m&vXaId$jg(+wRpNs@($>uMP?c zT!yO(03H(>eIbQ32@8Vc@=TH1yyeW=!-POcgzmyWHP_7ZM+3Yh-HL)?dqGgULEem6Wo@1ZLMMRO2DfwYa z0N2fWogr{Sh>SVS&&;@)q@}g+mEojFTE|%06UO{7I;v)UsUcwR?va*@Q6}|{BMs23 zlvxo;PBF5LqasS0uGnpZEfrJ!;ratNWN&$uE){LobRC4}Gfi4tJxXL&mX-dNP1S@%h!Q~RlcS+8`lB)%LdW+mxaWJ1IPTb&tWaiOwSe|HnPRqonBq29${RZb)eDlZKr4NZdmY{=Ntqbrp?Z%JD@ zM;dQe6mp4^&0t4cj<~E4p=K=g~3a4@8dzGpi5@})P#() zr*J@x*%Ipei+&JKxKrEkrRYHv`1UEuJ_)~^kYmL9mHT9G(gtb0gJ0alLteW`S1nLU za<+MNLI#K*@~cAU(=dK#3Pvs-*hAkB{V%&b3)GSLRxf|D&@Zk3ok#)0$hlg)Z1$B% zc}lI7@(7dR`2cjvcx}=kA|6(IR zn@vjZ)0a%d30QUreX`c4P1uoYT4^~nc09`bpv}HJDKOxjEhmwiJc#B%CC6Y~Vh##L zj4Pt!5TbIuR#9E!>HRZSmpdg#h~+M0yiq+1lkgQMfGdD!M2u!(W1j~r86H*R$Z+emEn_aqrQkB?$$pKV< zv^gnI%63OoH75)j!_l?409T9fR>jPd>Zh%Ng}{fS6cqAB3x%+3oVTwHbKl+yjE^&$E%bVVH#tZV=NH`3xf|5@qjRtsijOsdy@q0R)eeWSl=`m{#OpwcQL- zbG+1>`mp~~lvv8o95kYVZP<%`w4i)#GRfy^xy~XY0x(0_=>_(S7~S`{=P}c)-Mh`# zZHkF~=eleyvbNtSgMT4HFbHcz;N%fn34Z;O^xL4p&8>2K>em_d*JE7yl7+M0qst(? z&eqk7bRHnbiF@@UMY=@x0t?;uD;~YIneDxYihKzzPOzUeW5Lk}e^I{K>jy-*lsoeX zL1W+xy=wY(BNGgpy!N1*zn|_T?&=#gRdS%6HRfwG242SDuzLsDOd>zXW54}TVq)-^ zrN*_m_Xf{}vi_Z#s@Tvb#jtZ)5f}CcPc9l4R{PLnwweO=5(!uojn^h1gIoF?3OTkV0v&13gOogt?4x(d>H$mOR>& zS3L)KO+wg#*i>;GEbqCcW>Sr)(zRYm0F>i_E=}k_G7|m43{LFs(vk4HU&KeOc653_a8eR-z`&{`8+D_o>U8kGYtT<-B z8$o3z1SdjO*%1p)f!TZ*&=$1tDl^(!iz}myM^DeY{(0}^#u6{g5EUl!Dzip*wpapG z1=~tRz;J05>sz$|70`u>jkHv%FfFJAW-a)3te(UyLt1;dxS%6_WvZsg?+i5ZDb)lY{a0x%VgTsa$iXY2C&E@B9L#|TV$+yqDiGz z)0OjUZI?>mG=u{*qI7mRvh#;%-Gg&$7%+!uCaDRuf$%jrejZwZBmlb~>(|j;)S(dQ z2Cx4Pv2WZPzS*c0;L=Ok5C{9dtctmAO@>oUU({WEln?qV?Dz}8|NJ{?p!*+-e6v4+ zPIqiK&3&z|4`VLCc~|PLOq7-d>-{Z+-A};f0W-+ zrjsDT5)HxA2rtx1(g<-(9lru}468hbW)?t3#?fpKfk@Oglvxiy*# zYjB};`fD_Y3++(^nJ@}}7E@7PY0uG$u}D}0H~@y+;cu6-z_mTvAdsEY&YHqf1|1dc zciWPJ?gZ0A$0`ablQez63@Fsp=>!hwIt+z~Nl)KA$r_o?ei9XJ4@(G=LtFbr{4xCV z{#XCVJv@T%@&dfABlrERTTEt}6>bP$P0)8?l21AvO0z04jS(pNVm(PsS;JE87W*Vx zUOV~cJ|?YW7#P~xgT{-D`Xo~(A>>b&W8h-wy~t!xJmMh3tRZHQZ&gsx zk5bAl67{}fq#$T5!3`acb3CI06U}8*;A?rIcVl{KUPku0Sm=zr*H0RezUsjXw4E|z z*Z89+EAo+S1jCsA(JL?{d}}BNDvf6mAcfy%Kqqv3i)9WB8KA*3PHOS6jKwAwn%SRwZ18FrP^N_?_MR2k|Z<#G=z4Zde@gZ@ciEuOv^v7_E4@|s^jPMb0 zCHk2ZU}^~rWbMZa;?1N5b7s>vs6z_fxVuNp?Wdestxw-CJ07+P~eXzSe;Hf z3d(*Y{TC);I=asE-neV9RmJVOC>w+JXuv)Wxh`!`$X5-*41JGkz!%g}tSEpTIN%1L z<4!@6b^oMQyqF$3&LL0Pwi@h=A553%I5u>-Zue7quV@=w62lY0`TmU=YX6FQo^|H* z;|kOgFX1O2NdkKZ{qQ=SdRzZ0svKFD^F~j9!+I2bwvun&^JYk1pKTC1jhTD44iL)FP1|aUpVjzo3?}m3jwy>^%;hzt%>WRGBv+=s4BQbK!^)Yy+NUdAnVY7 zT_l(12|fJUSmZ~6iAipgY0Qi-6A7JjQy3k9Q|QDGftdnlB^PMv~;7Z zU#m1hlEc<74Uw+0qz@v$BT<9eIuO6^dQbE4ikR@=6YbWb-d?TzAF|#muFb|<7KRYq zU5b_B?o!;LcySNzZo%EXxO<_+txz;L#ih7gaVzd8@7~}3_WwQSGWq2q7tcJi)~s2x zc;%P)pCm!pvVNsMEcMu?Cad4GsOzz>I3q;xx5!IfDi z7n%-L=A;~F<;m_CFM{WmIT;l6{ZR$Op0w~`qGzS5HgsR*`=BHL8z=4h(M`bG{p-Vzs&?H3vi6s8bWUCm1>gUn8 zqU=NfOUh79186ZNZ;JYZ?Jp~bjtxxtZ={-73k9eE@j`9#=n3H1$R8?VOa!Khj~8_r zXt4k?&1$5F8T6@lPyW0}E-VTp`LdY|vk;D$mTOZN#P4%`$|+|X zwl~0)T=Al37;fkKwCttc0i36`muKh(3lNZQ5%jeKxtwkXPT`%FH|tS+`%MJZXA(L} zWK;qPi8(WkxK}f7Vc7&)>6G(@KG4L8J;q80=gPW}4FpwGB)FV>&4@TBeJ$x_#~u5a zSunp!^g|LgfVdn(Z*PxUdO~WRU!tly7wtRF%Y!>@Ov6;O7)13C7ojmKJ7V0m6tT#S zN&wmGY4d&OYFsr5n0#e$wJ$g zw`1dbL}$tBP~$+{4z3K`68B{J+fkc7B`rz?ePW;xHBl8G+VHM(QM2>ebA3d3r*a?} zIdF7JiQlfx+47Tfm2YNd*w8+uOye_4?41=uzC|rRV4UDFZfel)kI3pu`^o5goXT0f z996L%yAc^!fBpSZ?WddRP1W|le+0!LZN(m#x95hm55#L9m-GEZFri}MW4)_*pYL4& zo)XN0G7y%ko!;^s^rbwf$lxMXuG}!9JCP4rLz0|1UuZhYYPDLjP@5^4#z%H5=_o_zMrWzr5cj{;oh?P=!M7XN ze%4&_wISa=s>7a=`VcjMf^HL}$vrMKmf%i-L$>;li=ZW2e?2=XF|`F8=Xd1v=~iw> zhCk|R9ORSvCymxA#x7`vNQ>I#F^T6C{_s1eX=%|d6rRrX>#Fl3AhXYN-z4<5H$2;H zf8A&Q>h%&guuKf1-Vd6Gi)Te9U!2an$bT#7pBy{w6kz&KW;x4c2J3>8Bpk8 zi(cqgz-bv;(;Ykmg^VdC!Nl7Duh(if*urCzWkE0Yk?nYj=yl_yV-6&S37b3EYiGi{`-y{ zx?2a$VZa4J*T|8fAL<~$2x$OwUHb{i|NkBI2aq;g$UPM+>Zc%}t^uAGG84w2fQ?RM zNPl|g6yzOpTScZ#Br0wu9jv^TsWkjaa4|9Z&E#XX?Pxd@>}xnLTCe1b``TZ%5k0f}&`LYMoats5H8hc<~aQ{w=LmQp8v) zxprJkD)y_33E+wfi*Cx_>Io;+ZnmI=A)kku!`ArjTUk?Y()Q!j{?uk7L!7&G$IQ`Y zVJ%#DxwAiH1}w_Qt8Lu0^;ApRXDA52xQ5i7L6%6ekRJi5e4?9Wo*3nXrA?v=j+K2w z3W+2xSGWIwKHC|hvv7e`A_quqz`?te4AjM9LO-%^l!T=2vkm{gw7`FREK|6s?1n}h zhffA#7;NM3x#|C*8rFWl<)!0C5V zzJcbOC3%rO8Cp4c7~zcUt-Rf^^QgKoiAt+z8k?c31fUMFXu4L%uDX6a*#5AQkwDh! zX&Sn78Bjoe=sb$j<>6!ZrU!=4?*mdnPfnaA@xo<}Q}l{E+>ee5R0l;XkI;iuBR7rna9Czw>G z_q7I7aLW!)qLz4xGVYd~PMUAwn@om`TDk;O^nPN1^slkK?@aGhPA7bhLX2=S(EB{X}5$ z`l%_v$%hwN4UM8NAHvDz`l+zhn~rw07wVs0j|3Arfp{;uo>w{0vcK3A^1GTWRt?(( zym*q9Z`oQ7tM7KQ_h({H z>^TOA$zW5;Yz1<&!c=zb1Sl<@$6S`>>?N4@8@PGX%5?+&Qb$cHC5wyn&aCpzWD(A!y-?6RO$VO)`Du8 zju-aNFWcI}gd%;6lc4O(o)-s%(<)!wRP(jC_s=b7xvg*i4a@(*C}<5iEN-w$kl;-8 zU+{!3kJk->;Rv}eWS1~<#{bwG>}r`}7xvJLkA(7=0*CWM@6*zmLXLIHLpbW&xEj8E zw*_s2o22354Kg95$oHr8Wdc5R5T)5e=xvbR;dK*LI{52;23F`a{5`DLkU)qKvUX7> zK73o8dPUdQ-Dw#?#yRUb_SRu3z8H}ArC-mmusx^a8rQkp^*J}jzP+i$hE#t^Os2_X zMG5_M6t294LqnE1GPqpajF=&GJ4w@e{=;YU#3gQv-{f>t?uu7yM|g7b1!`qWRVDYD zxS?^oS@%366#0|DVx&cKA>~FZj~pbP|`d{Q1a=uRCMMwImU6{3GX&GIZtI+pb4DeP@Tij+X=)N|P zg%$qe83hm2Tw&BeIlo;~sd;fC*Y1ViRzKz6x)U!7uU+#@=6A{ViWl(I6)DzszbWzb z?oV#uOS?%U*k=SNcYnkK4aT}Uz^&`PWtID1-%WJk31ri4<9#kiy07%7%~)oT=N_7)L* z4QE{yS(!w)w9l-vfm$iumVHcGoGoD1l z*pEcIgL;aIj(#e*9_#*)We5Av(Dlo?*)`LQ-)B#%chRC;Izz6{j|N=4!Rf)ljLHZD ztWj+KpIRN-DHV7Z6EJ)#G1QRjZJTki$}ZvSe8^5#WQ%Y2*TV^JpTJKEHb+Im)7+So zWqmu@dJ%C{I?{LzimbFWzmws!l4+6)ybq+kcvV+<;RR52l?G;^PTXr*t<+hw00g|a z;70ZU2jUnY7oS&pd%fC2P_SMI>#EMoZrJW&H4t36NQ>RxR2n4#v z1*fG&oG58+Ovy>!&K5H_<;6bWx%73WZe2yZL*Fw4seU}gM^p)n$(B60amwJPz=Gz= zZC)TTj-heFj?S|A%nvrC&Y@q8H%XrD_67fN;{SjTN|3>OR7vY=7p^WKr>y@aO$abO zN=&8{akB&-CA~sH;oKJMV(W)97Qs+i=`BonQqf90T9fidg1R{cVzlMc_uOI-0x88y zj|0Nc8ZK@R4ttQoz&f$eRLAwoS%ViP5!Nm^GTbK0owWz-L157bWD{1TFw28-8BLN>LBYY_(sIb1hE0zBh`;*QgcAqiv+K)F zeO#L;zsw2ak%xR9i`sm|v*%hlj#TTK^_VPv;2yEc?+yU|g>F4ry92fvHo?5XlD|Lc zfZepk7;QbIh@Zz7YIi%z8sOvZ=!#b9x(`s9yV;qI7>j zlebCSy5Fe#bbnL(k-@GQA`g>+aIXg&FZ%b#&_Uxc& zHtH@_&CSWK>omuKmhPMJi+n_{!l^a{r|5}BVH)21 zHOQnYBGS0^q+5}mlf-1+!>I=&+Y-V-xH47by4w9V;9rchCrRDimG$y+l*2Qh2w%?y zgD2V`d++#(&^CMbqo4 zFD}D7nBk&zoP8%-8_Zl?%>~xU*e|?)%1L2BsJB&H*`&r3UVscNyUZq!-bEQ(Sm5yY zo-XrVbl8@qWpK{qS>(x&Ng1CHnzGu77C#ffW0JDvS*>Mj!K`VD55k==OZU^0tNtQ@ zG}Rk_@Z6&3?djlPTfv)#dv9jeVO*)QIkOoF`JhIpE6#_=>OM(K;Wm)3pHKI1kU`(l zD8QMY?~LF%R}ue(zHk~!YTTEGx)*(|p|-4K2~KK(fPMJqOJBLH3@N{?Z~$Z$w%!0Vq<2 z1r?u$te2C?F7(glRqojGsWI7vQxDv{2P*jf#gl2HGP3btpKTzwH2XI8>4 z%1kSiq9Ewk+tVxnZ!p_@aLKWE=7&Ap4!yWkd8YDvNbU~HQ3*t4?Y!yhW10Yc7Y&BA zyB{Ny_8qi)=LDA@uSh}j9%5z5{VtPhJ>L6mn~9>{rP~kxa17C|{5u+9$l3Vx*-`0f zaOK2rFP$J1CK_~D!J9O0cTeyASf7xgA_Ts?%{+pS4K}6eOp?OM+w29VXF#T>-%mxN zAk%zfEYk{&#;I&dseiUEwg{EMeNDs>a&SBkjw^0_YB5q;eEgevjAUYyjSwE+Ui7(0 zr-Eb1xb9J7TN}HTmzNapTbqxg!4hGNzrr+FQfF!X_twS5(a)u{kGFGtYIv0x`hwEz zs|dG3aLu-GBy_Wh_yu;(Yjn9ar81$$ck({!g+#slG@r04O}@lOk=aPW`OC&vkhzBC z4P*)nM4G&|knGj)%ct~l^?3dXL{n`5pNEHhMj5l;ShkUQnGkxAQBtR-X~qhjo0y){SYadPk{cACdgD_)H==} z{pkHK>@`yGSi|BI*oAuSvl_P27AXwS%aj{oGaDnwWe zAA`XgQrV`^uo|CON`_1i=?H?(x8MT)ZH>G=9`x`kpFsgbyxtl159t=t-HO{!C`lBC z;4lA#+ zr~i#xz6iD_*2*UG6C1);8rTH*HnE^Y*qFdf*GX*q$Cw7w6Fj|;YI$SKa>Gk^pU^gu zOb=}dwEmb}$^ucNk&M^_Wiac1) z|K8hbUHBA5PFjF-`&qaXNke0&WZ&b7eV#`~rTps&BsDhi45Wfivl1XsX*KgH@a0cq z%clByC#Ht?HP6zg&`kCH+eDpbSLK7By0lpG5c{-!`U28Js2S>rAckpkzi_@Q(L%f` z3uGKEqv+uuCPiox-udd^jfDjA-?}OY-T3*2zL~)~KESfl6CBDB8+i4LBV+R@1?#`G zog&!8=Tq(W*ta9mCxKQ>Lc6;}rzK%L6%kagF(w7!RU@iPcT$q;}l zEq4T7qqZ>0{-MuQ-%)d1c+6H9g@9s`CWmAfvBSx&%3f;kxa92qH1OUHX6T^S#J=x^ ze?rJ_3H08N+lZ00;;E;>x;X|=#@+kU*0hS;cSlBtW3blfzhejNrWcEe7LP!xW2^P-UxO@`45+@pI zM=H9QPjK$Y_o2uPyH`topn$sd*Vs7TK#H#CK7?J8@1xQ!X>5guyxRM~L&y8ybO9Kz z&kD41wH-m~f@xL<8>uQT^dgBkTA#;^zLd?`)7AFVOX8vRWtzmDj%?QVdQ?$bW;qF` zly>I+7>uUzlG{}n4xv;XlX+{N2b~*gV*tO=2U}>UnU^sI%zd+Z09Y?6DVmdr3h=NT zd!wLOZw-_*!Rt;BC@3QO-JLwd1P!s_4F6T_A00HWsd(URp^6q+Waj7Nd(DeD>_n^d z)#XfdlO4i+9sN)7;alFVxNoZ>GX9o9vKUPh3U*^5yHhJYjq z;Be8No?YsORu#Lxe@T4RIq*Us$Zq?v$YtZJNm8^aGRhAFFI~rs);mMC{6~(R6Llb- z`FG_h^GxN8@fjktHJ!y>TcKN2_S@BEf8bOu zs%;Fn7nT?AR5rpAyLW2JuKe*yMJmt;y$!>= zTqrUj4LJ0~Pm~9UqelUZ0g=#pat~ThlKLd0T+{IAjjwf<=ChTr^>9- zlNfkayR}yEjD8U|ut5jk4u3nHn1TEF1+3Jooha-J*Y&n*W|%1Y@+%QS)(dMMx8FW{ zKl+T6s-Fs`IzjGze%?;chzxSb&II?#U^By03#`|72k%VQra@Jf5ELDQ|JKkbQz2!e zPLTSDd^4u}hQ_}<6N6&-Q#N*-6lzuVd`R)bnmJrd<_MkKc83@ts zM8@$4BDlFX%$xW;i{u2{l*WdUb`s9Cu$q_K^)jPVzcbos8ya$p-zE4h; zU|K%pIZTgSN}z}Ptn=Q55uQsv8KR(5)FVNMg&-hGH1mVv2X*|f7Q{{Fu_#<#$mt_z zMP~Ha)N~e6c$flxN=lWZX+(}?={d)k3qI|XY#~eBEQGR;#d*T%ufNB_ttO%Qfuxo3VJz)g5hC1C3s+sHBHV64hPkYaHY5JBvLkHPMyP;==hln&F8D z-iWze^Xv#%qORE2gkfgh=u;1aubs6NLFpTCYyA37#ba}|-HRx$Bm-+WXv4XykHPz)N_XK4Dn}zD zEO$pPa7N3ueQ+6<1Bk3#(3}!x{t8!=r!3h0h)gj>K-o^Y>Ab;)ZD@$jKoxMHDvlx< zzJA`T5y{6$ldW1Hc*!epr>g~mD0+>3KVM=T8M$%oNiTAduq4P~8QXhv9`_TdohS)` z#Wv#ld%>3|0{isj02?%#!PYnV_WRgmv?Ic4r}03CG@-FVvRAvAAezqE1Tc$z!4Mth z8028Ojf2;NLxVl!eYrQ9FH6B{$@E@0F+;_^;)l694K@F5Z!RiI+e{A^83&K-!xJ3gA*#`-_m$u1Q?12z z=It)h*xmwFyI*nmiTdnT8oO#myA4yW6N(CG^RL-2cOMw@);-=nyN=isq?|N>G&7I` z;;Z(f;Br1;(8`fHMG{C6;_je;{j&xZTej-I6&p|*e#YzR^&xt)BAGTj(`~W= zhG@RL%o!rzT?w5jl(1b3;jMfs9XohFSQK8^iRPb>`M-e$odQrQ0pt^@OAnb=EdP_g zKmb_S;08n&U46h8Qq~~pV$ClGKqe{VD9)&`G$H6pCwH}hfe{%eM5&jX7K7jqeJE6G zf{072t;qxz19sgQlZMd=X_N3^aR#vs@RV^Bm_yR=e!~g^&Ym(u>_E03MH!}gT$Dpy z*;h#6S5>FYQQ_2N5s9vSq{TmeF%M#P%C-1;T%B~`gwa1v18s_Q&lRk zypVGPJxpg`co7%UGtKJA^fAU*iLg|S*tZdsll$F3fmArD4QkM z7`Y}A=HY6+1Jytp;M7?I+B}O}!Ubzrxta(oMJ}iJZ?|gJgev}K9qfL;^Im^x4>&eo zXLWvpO1NlP|IJr$>JR($0FOS{M|TudQxCbS1!EOe2tmW~+#&oyb>t-c`pvX43b5{V zH}MT7;EwAJR;alNCO^D=^X!e%k9LwcCkPp(Bj~Pg<9R~eaI5mal#hugUNJ7mkSQM< z`2H9lkYj{CGtdgJZ^#F?48fi95X*cIvwqS5whR^;Pkzk!C zQ103Ge0z=lyLNBJxW(d^>`Qd%|iL&?U z`O(4;@GjM2E? z+&LdP-;E?R6I%@HQa34bXpN}dbmP0SrIj4Pn9lsy)w3a6yB9`vQv1<^71KWmJ?z=4 zA<)fBuEHOI=qHwBaWZ7#o_hD+CdX@)`|<=k)uQPHZzf+O=#GRd`!+Hm=D>qTS*;il zKXG9l9PSRo5KBTh9YI_uuGFUxFOgfrWayezKzSy86OFuO>6BK)?*{f@NS$e`uBv(5 zOI%b+S-=wgk2zyYun1A(x2luEsWtoUfTygBS`#4N($J}$^AoXFO8LK9wtwbw6TofJ zYD23}t6u+7L{gEbqWYI8$0`Qx_fKew)jYgkkFc>gx8NqTBdE0An`vf-p=7_m1as3{ zJ-kT3zCxU+zEy-ny7uE+&_6>`cfVjMVe9=s({qGFocmtc;@T?f_Cc&z9)~#uX&yXu z^%HtG#${&_Zn{G zyA&1eM+6?8qVOR>)#|Q$Ny&__Hj{F2jp|S4Hf9hL^56Nd6ku`w{0LGkNao zIO}4rKi=ONaVK(wo{_^EtHlor4jGTOISoO6WHHFnNN?5)Y^zO&w zZg}JS=l#u}PJ!^`uNUQrmCR#K-)>2C(7O;mnTB)wq1Vhy-8ZuNm)V{5QTVZ~cEhW3 ztDXc8nYI}a9HJr{&*|;NH?w?sI~o0pMR{3Sjw$S{WAEUtMdCXGB#46aoZ1ERrAF=j z-SY}zIScySLAd^UAxjx)!sPja#i<2{aa$`<=88l|7yIF_QKb;3zTh3?GzToqZDNCJ zrPTEtHeNGk+E&x&HW@&7Fu5MyUO2N149p%afGx_cR>B>jtCdC}MGIY$n*M_7%fil# zE{Aq}0QTdEF!AjB3Qe>LlCdL9`PgiS=KjIH{`zZ)&h#Erd#0j15>9gxWNbho$9dKh z!efbxinH`nU2FiSdSfM7)BDdgkUqaws|%y7I+i}9ES$)G2(tSZdKNVo^m1`ps<9mL zRWoe;Bs@Tew*b!zK@_RaaCMRFJ=b^-yE#wwrunCJ+pzw&uk&l574c)Zm2#_hpaWX# zR$)FyIuP%>o`>@A?cg8zXWrDx##}^#zZv|a=@^u2WP|F}%dhxC_W`Vml<0u(*#qpn ztC5$^vfJ7Tn)&nz@jtAjZ>ADpbkR=_UqbSV4a9a{gt2yUkc_~-yx$^Fi4-Y5`xQmi zdpA$nDH7xA+zk~(5Rvc-FoUgi)_`9bircZM{E^))EEJ=PBG-tWNSP#41$+P9;Ay2m zmQwQPPAKkT{#AOyBWGI1x$815o_id8P7;tAll4ps14ZDoK>wT?Tf)t^E_WqW_7rNu z9ugv?(v9G8EwTz_Ey-y{1sKhd!bO=kG1CQ|enOmaHC3}%sXFk55CCs7I}-*SY=!?0 zv4CSaT|qRMJTLl{_%e`K{7(^;xf;@_SWlsDsh3Wx{%HB1xR*b;Aqx<6E2`c-( zi;E^6Dv&pkhH#05ORWjV3YY8qsLs6QNE<=UQ;)%>Qx*7}kl~NXW9r0uKf|3gq3cn5 zX5ix&L8gTk>65AIk|hIUHq(tII@-FZe|9L5KE^gscRCv28CEo%Y)bxs4#aJGW6f&I z)*AUIs*32mIvzru_eM5)GAJGtz?<<-a8P-Ys|>WlJN);+%IWpyeByVlrhOGOWj)Iu zmHc6))}#II5;G8{X7{LYi4W#J*&<_h2GvyxVc{NOmBYfjZ}IX3wph9saW%aXPk$xD9KDRXhjT9MGn<$hD)7SUvk%#w+=^x!)NG@A5)qh3_AE6-*ZFNri)dLO3=tSoS zJIw5xq&(pk9-_@&SM6Imh`QL?v*(Ic`@Q@7Kt*)MixTawCD+~+*QP^-68*cfL^=RE zVpDDW$d40KBDmiY8!)={$~=^N^%8sBavli`9OS8^y#ctHcXhWmM-`61+ zyvTHR4VpBz)QfNu>@#&?P-cyK7xxlpHTy!#jsmNbswlb!NmW`UjN9FS~)Ol-mgxT zYtmA>r%qN=pO0Jpn-3C+75#O>^nq*#MG+*9Y@LnJR?idR zwe_TB@WI7&MyB}-v4wdmth;Aww9ZRb@9?llt{bROUA;-^Yq>!#bM93VZO23T2K<9* zli1}Hyteta_;?T^Yr0q(F3Pq6Hmi;MPHooTw>BRxg3?bYVd(?=5iH0<|!Yw9I z{*br3$~SZ)zr!?0_1kN~Gn(IS5A%sdg7~e@gRR=UW+nx-pNDE$#$B)Ng*z>~Ff2~D z&nqwmeBsF}JVva~FCdcb61z%@8>Lb>XDj}4&jTJE5%MrT3H=tQJQ zi_7-n)qkmo2Hm4SFgQ|xEW>eLqhZCiaa1IZ-fwF#D+k%Semu* zgP02*F(!OkGhnd!$4*UyF5aZ|8j+o0D-m9fx?0%WfWIFIrndci$`Wxz?`5dW%-T>S zuh5{Bt|w$0*qYo=-!+tPvRw(unm{1=;lJ(viAa7yvf7eNPZQ4+t@7PcyNzW8sT(}8 zP&*6CZ@WCxC{ley^uCyvxVSUVk4rT)v7T763+-ruRsead!h38@9FA#M{Fe5lQ(j9+ z5ytY7VieXv_tq|8OzOa~_cP6Is7>Ek>moJF2QxqG@?m;q#uDpv=KTxZXc#pslx#YA zMk9hO|JT`iWS~J8TbFt7D|+q+!2p@p_-Q<3V~Y;j!Dikkzr?0dE-M+a9_H-?L7!*y zRLL&BwU;USC!zmmuKs|N`C4Pr_3C!~FT)FyWRMK)BO+0xhmxkBHA|vnUmfd36Es=o zQ`b8KiEV9G)xpYxX%?p8Dw!6sdx5pzW0dRcegaHW9z7ts$Jo(b4T|jeY2vlwHX(MAmP>-$f%mV>quOnX6#Tfe=Jnt=34OPuIz$A_>daa#2d6t-7=WDm;`oY(x z`msGKFO5|Msr&hxaVXpCKtV6l#uM%8m3n~=Jztr=3g|ONK(cpk+V;PVYq3UMe#9cz zw}>VS?dT1@9;9vtUK9Uxrv*JU*L49C{#$wT&xwLf3OkECZ$m180-YGwI z%MK%uKM2cr6}Z<2dcs;yJ;bsbR#tm^WYXSymZ?quWk%##ckcrN79%@VoDGvn%6us#JVDC1cnlM zfCUD6lZv_jjYcVG8#6oJuI{Hdvb`(<*+4BVcAQ-?zp9NL97%j5QO(46<>mc{#hs_0 zO+VE?YnzEV8I&D8_McRAfrfhC|Z#Lbphe(|94+mzX ziwW{_WnJ;-MGCb9hiK8%U0&F!xf;L@h{}@2g!-@=sUTeobaKBllgkhD$5$jpr>B*^ z!_v@bMv{@j86C#w?cM0Hu$b-xHaDpvw12uY1c<1M3f5xGFQ^(!vmX_jZ4jMl!GP@oL@=nC(Qw`B#} zJJNv%I#^88q-0k@Elkq6m--;-<_I)>%Y}!jG<2~c+}vpUTMF#C(`+#WlgBh-E6Rme z^Mc9U<)6e_F5opRP@6rE)`DL(-YG7Eu{t7`9zIH|X<)I7aertEg{QY(=@U~>;DaNB zC=0)~cL0}Rd4=hI!=HZYstY#N2LBah31_zCs>uWH5690C*c*4m!3r}v77z=m{MiCi zz%4zCH8(U49~z?t6rCY_oiG9w?pV~f!l&o-f&QTJyIezdg%JL7vrCe87k-4v3S`9! z{uCOrWo1lH`*!^jvcwm#Y)U1fXcy*aGMF%Wq-(u=TV71z&&Hj0NMn3oYSSw!6bN(f z4elI(%oxNkI2GiT%-TmfaKX}IC5j#1e*@$H)H(vnMO{McEehKzZ7e$`wov+OQBkF} z_l}eVu(FI2>b)5ftz&tR&hvX+7(D1oYSo5!pCE*dC4oIF@S^1Bl`a9IqUvTua(K7* zHS%KlzNpUn^H)Ad&e@XGR;51W$68he?ZruT0JWc{9lCGAP*kQECs5~^kvPFV9JvY* zEOBYXUlqB^mxbb~)&ouvvZi-$HsszKjNfltW8G}tQHw{&I9MhZ<>#h$H0Ssg7a~DV z-(Y4<`SP*=Vb}n`4@Fy?ljL$QFVHM)>%(C)lc{)Rockf&I(1An3!bxa4-V`YTp6Lh zoMt3C?EoKP5)2)Kq_VypxH0xh0UU-DIJp_*IqmI@gFijk$MGHL6u&hingDgrVvM63 zfB?=bQbgXCm??gnV!8f{V9a{|ey7hZMY7`fwJf)a)4 zf2(}h#gb0r1dx@tj>U?Vx!P@iRVZ_C?i7kK4v$)z1%p1p_tDiccU?pZ^1+s+Ldro} zls(zH=}|k=%xjsYENbJy-x=zHsmkVTX?_C-h7YT8hrjFMu{gxieqkpdq{YgBF+7&z zT$9}Nh?HHJYs3vL0gEEr(#vV~>a?_ys~EFkO^@KgUVTESXCD+>!9meb!mAa+0#PH2 zp!j)j>aaLpd`!4qfMwB)TPoQx4X`fP_!XoTd$(WY45s?eBKf~8Xdq;ENS1$%QXTuGTAWB*PdOiAj~wCSA}(aYCnSLQwr%|O?*4=#0HN!?;MM6q zZR6GdBJ3ej4%rj+M1S%Eg+x3ktk$T4@xsdZ@ly*evT^6jC-NVpLfSufL>3RTx7gfh zRUN(Wh`3gjW853%|RE?eqUuWs+J6Lu#@kd6FMSQ!&{z)v2F-DJl;dg6z z;qH9ty%kpqpPAP$%7i*oNT%%fLSnf881>g$bX*sLv8B^`=Jhv?14)KrM=tIIpB}Ts zpFM~6o;K@Tc)xwNTM@|V-N+Q<5B3p$3G>^kR^g*7U^A7d7F2uw-f4xdS8^FktzgpF z>4f|Ri4i68n;!X?7TmQSzAJyNi(fjhs>QIogh*VzM+!T42BX8G1(=w8K&0&U@yeGF zKZP1K}uEFs{Gb9^=5aljjWVA(Ci$t5+KoO#KT41 zFw0p|Yxep0DrrZ})&ZTPiouF1j9TlUk0DaMn;nQW5cqgkQKg5*{Ea049Tl+d<2W(B z9yJmHmKCcah!j8_V9`eA@)5Z~j{us?ORdZki_^42iYTEPWX!e&x41LIH!r%B@tYk?;>1088lYD~-brKa;GQj^>u{{F* zZUCVvyTq@YpF@=D7@*z1DGoiED1IZYwmuN>u`5-+AXHEAbH_g{H_3KBW=EEFwBC{Z z$1@UZ>MQ`)??RFy*h%=&qr%7^B?hy@Os;xK8OKprU2yuj=Pn901tOn8yP;(e}v#`ii- zfEyq5AH2qJJc+;5a!FJ5uhDL+ngW{>@uf*QGn^};q-xypdV8_U8)J0#U}`sRS=Zwi z-V-OOja|-0uK5mvkLd=>VzL&`0M;T=3M8Z!))8&NN zsL~Td!EbG*B_aI=G1}PXryvJGeWU55&kP^Uz|H9$kNdnxpuPy;d$G8k+>|k^0&*E? zM;AL}kVu@bvC%It_M(-=R6V)^n{!kGc2HX7filMo%~+N+m#+x(y5rT25|c= zGxe|-lBx<&>U)`)E+T7x*9JD_l0!lPb(l|3-=||=X78W4+A;<<6o+2=-B2de82LyK zG8EWZv)2s|*fn5pYm>brhD~er0oFBeMjIfXm#(8)VNJQwFtXK#$S5P+K zwNmm(9WqA{%NP~~QsW*vfW;<}(=C-)@&?w6K3Vyy2Fh{wQ3*_RF|)v~3}$=?@9F6; zZI^u7_L0_6`zpYfG6dnppHxa)484+1vGP>}Eg?@e8}2_QgjG`u!~!yLcCWmxBg`GR zlyF1s9@WDH2)c+4v%%wwS{c9DpK2{yLSe{c`xPO4?6`SoOZKo_{d*yb$pZLrIsP4k zO?ttZhABJ(>HcndsBe6{KML1#|2%qnOf1c!ifz%RL?yfMb>=^1GOQH1Ue@faco`f8 z?6blAud8~D=J0f@xx{sbc8MJN{=vl>{^$Yi+mO?Dr3u0zg_K$xOyV3&JBS5kcBBNH zl{XsWTd|i01Tm0ykw=AKnE8U|OA5&O3q>H%(b2c&)%!_hviU{Y!4H~Sr4WfA^tZ+M zwCz5Y!k6OYm&b5B-^GKn7iXZZDS!^0uplduyib3dwc*%}YIAetRa8iZ1C=x-=4oa( z*I>_57HdDBe@s_2nFMmVu zd{L}(H@l-c@WAV7^GDw|4h?;AY<4p~5b&>=l7P*J2Hmek;2I=AA!7lcF0HHgX4CjS zJxOXkX8Oq4kAzVfm1)oJweWIr5&4Szd~h5Hf1|$uXHs=>>qlxgU!*!5I$a^Y7hWzV z1~1g<3gktpXq9=>aZAm+@cuQ1E&VBI$U+whkM}IdvXhKr4->_AtO{3{m`~l#ZMchH zT%UTqpC&g5j-;XivpDGZcb{2`U2t#+-*_kcD<6|eXQw2RV{9g{4+(z-&fWf()d-# zG0eq8dE|GGs65dOMc0QtDm@lTp?5FHb(8McZB|KA*wi$r=^ugxmWl$tin#qh5E&~F zyRPVaelf%R7vp3?pm0qwx^Rqbk^2&ADhKzWLo#DKdQ=SZ!$Z{^uc&S^V#23!NA;El zerObrcz}`C;53~{JV}Y#@=s>dPk7xjcC62ud=M#d48{O<_Ds)F`#>^edd@R3Q*3yX z`TDy>tB*~J{Dl;;ndia5q0Pl@aC(Dbma&M-W-dFQpq^$3yGdoz_kCI~siu!yLaU;J z1Du?y%x9)D+o9@PRksRQ9`l-~l-u13QjpOT+D(=`(#e``Iu0UjFvF3?NeTAIGMR2M z+GdE$OO(AC%7--(MYm24>8IqE7#_Drhxb}s3Oa{b@9&jrxn^^bfz-A~N(e&!PZ$S!yOA~sWq z#-i-0e7kH3c=uW``GPI<>SY|#@;1An*zcH$oifO#I_9f`t$+X7BfKBC)g3A6V$N)G zJ?LEYL5JPO>71(LZX6S0_?KgN-GiX(C`d23JK#G-48W1Eq-uidFr(u)tx^6z{SxOc z&}+qev~~3!uq5M#c-=8)i0B@rx}3zYK|H7idd_fg(<8U_ zAir0%iyvENwWtEHtL}ap=; zdg0E@>UO>>QnCOX#H$uAbQS}!oAu%gq*+-C7FlsK(;@To(Z3sOAPtIGU>7n~+ADp@| zSs}1dujl~*ogwca@@5@`%UW2lUJNvV1rjO^MK&yr@_i12^c=C#5y;>mZ48pj$&hR9 zuf4wkZ-c0r?C{1T14MXhyDlYrdcG&8LP#eDt$?&ojuA=)qTPbL2$5Un3qK(Itr%~w z3UBaneeX6+NVDdUsRZ{;Rub$oRV#UlG)6*~Y!R9jbLWL@a`jE`!>(S@Y6&@c2HW4t z{D=nz?!kBx&RevxBM6Ygqrb8=5Ax$ry1-!cja#nI2!3&WyI)9QW8UZK9+IXIY#NOW zNVX>+CpRvWuWuX{wkXeivO)-bX9_4muCOKOb5t3qrG6JjBNvxFaL43c-q@IUwo^ya zu({)*MRxK&dc<%DpqnHv#=$mF5ro(AwLK< z=+c57Yqaimd%$Tr@JO2KUBE1|1|$5t3(#=`Fb6gNc?aY5pOSW^SfLFHP8O}rkd zt{ZKiima#%*(D^RjT};7#e;1_{NBtvU0yoTBEOU+`t|VtaP<{Hai+nxFd00-JrLZ2 zyTjn_Ho-NxySqCCNpL5)1b4Rtcb6c+-Q^9t`|jPn#b4CaK*7v6{h#jBavCNZp7tCU zzVm&NsXzSe{G1R!4vk8KVA8{ulXLk#$LaRh0X;6in~t+d%`4vWQQbEC)MWE|NRKnb zM(Y(a3Gz5JbYK7#yCMZ9a76nkuYI?_L71gM-C#r{e)%8Y(iZtK=m(Gr6gn};Z?|9W z^dK8R)_idU9zwJH*Pa9g;WGI~aO#)5ohtYoB5vu+jXoNSu>D}@Zm_+RwG+!h9phH9uMcIhZel$rNvPLYqO7AwAW}CNinNuZrB<>p=LQ^ zq+YO*)*$z<`_mvA?|9{*LsXH6lN)xnAJQK&*z5e6qv=~yQWW=$d6PKi_dL*<-sEHw zAR3r+O|AlUVm+gD6?B&m7SI%HVXEZ&(p4uwXQkWo9Q+DjanUmjA>s6c0sC}Fa6o?Q zq{p7un;Sg{o4*dpqJ2UDz64wcaD;LUVc-NoQGjgmA`^ew3sqIU|GzleOWp|pGYi?X z|GUcS-$$9f9icd&kIir(<_FCC7L758!*Ocs37TMfH@Iy+&T#KCAO=IcXoF3!r78iW zO`{Jm7`X*}8{FhRsQXkjsfBcd1d4BzN2sCoe_J>b7)3~F{*=VZaB7KTK4H@G`XcNm#kqhnbn*7oD{rttAL zw&JkumB)lt>IHvox~@9j*xk5&(e9!u8Eb+XK=fO8;?1)B74e6I^Coxb`WzB%#djbyNDq7IWL zVxW~<&)=wUdTDgLAUidLkqA_J9CmhppSGqcS#L6+v0hBmxjo{V2i~kRj;{UZyd^{Y zra-(}@%3g_q`wRynV3Ut5~Cb8={ww?;)Dd4!c3YxTp}=4qn=y%)XBkFU$MPfl|O#f z-O)c_nLs|hcj#lETX}Hr?YfHG z?>Wn?BhWaO-3E5MwoUlN!vdJ=;4_HVg1MXDNy8Zlv^CTrE)uVE2R>u zhB^KlX+mf+9bm#Xh%veH@ZEo*5T0VaX@zP#$JwoaAAJv~7PTZo6ljK19S5JhS|ZG$ z(G5i(a}Vxy{&6UvxUrNtvtQ1yE_Y~Rh{OOi&jxW1fgVH9#Ch8xPJ8p z;|*ZXNkw&XX0^d&d7OA>4=2JzQSJ;Tyyq#N98rE{`>9m^zxEw3tTLB$6#>ax&M?&# zAE3=5aKjAZsnw+t!Kk#xZR|BE!aJwG#YpTDF`(~p^2a~15O zUiPamwkWyxd*Rx`%W`D|Lm%!clJc=Ig+JZ{II+}zmcZr>4QKHHjGHv)9PSVhk1@}+kHmx)*sGwiij zt}bJrDk@D)t}9dS(d3rPLE z%Wjj%7Q@4Y59bV3yY(;$jei{f#DR-R8yu9(cMiG4Ta;G4O z)N#Jlfs)CTRzya>%lnWT zD_4^cEtQrSt%U=`oOBpN(&v^Tr{q|ft@V*PD2K&FMEvn{6v6Zf*Dm%yqxi4)c6z53 zX%pp5Y|8&BPLd%selUF|KrsLHF>3e{qObe~%&Pdq!efIi5f*+<4P^GKzBK8uLh$3% zsPwf*VMa~a?QXGG1&|U^?<@ZR=GX@O;MWQ!o2b|HRMk2Vq8J(!rWef1Fvw!1Lk%0C zfE{uD1?3>M++MY?-wche?#r7`*j@EHOqRFGU2*6dZsFY--NHpJn@S>wu2f=p#7kza z7_JPYk!`#UXE0LDM1!FAxOeyVZb!HWV!-el{68G&*D0AXatqI2B8yfg3hG{dMk8vk zj=s)yP>?VfVKlmfKX~HlzItF|ghN#yNt*OT_Tkyt0FV}{%*l0KYLY$%Otmz1Sdz+E zNAGxfW4E4W6D{p>%gp{a2zglF%DNT1Jty-;;LLi)*7i6ERXNFq3;|d5V-6{-d=GkW z2MU^t;`2Izw2pLZy!Ou-op?dHu$W-BH;3=02fa6OL{b1XFhRp1Qacy`q%ay+J54F6 zeVlLmC;z_|z;<)1H^ncP)obloOtrnQxS$?vFp!qG>*X)5H%T&HvIgq8fqBEWZGpy7 z{{b-42umKrUV?ef0GTvAc`>ImOzv|e9H&(}!<6D?E6BM1P9LU{MnPm_DFBq$aBVrm zbVcl_%vrc*542AizW{$lkKMVz-hdeNLHkQ#Klm_ggpr<&bV<;NK0BPX*QK3t8r=?+Ucq_va@f&V){O61B3$qSl1nWQj;?Qztey0ShylE2; zv3?JS2eZgM$-s8YHLzD&bsR5a9ut`xCyp&vE^gA7>%DZLYR3H(`1tK`qrE+Spp@x1 zq^0ez94aMQwmJUbz6oYWx8LX>i{0oic)Pn{23^7WG3EsFjV7t!_lzt3j{0uvW~vxz zDI7WAVb@ZymOGc*5j;%(XqKwEvV>PjOJ^LTQqga6v8s9on;(6ZK!MLO0&@g9L6 z^7|ru2VXH8SotHJ+Fc&(J}4DQ53YS+QTd_JKcM4vGuell<>tWXFOjtr+TwDNJ^VCh z-{yS#UiD>-goZ`!gbt?YjypyE?VS$S(o^}m{nwtf!SzaykYyn8*qJd z^G0L!6a%G8>v$yu$qp(vcB;P}<(p}2;}JPRI@@jE4!L_xIR|tP*1F47@LPc;ylc7$ zZhB5=qWelhUQ%%IW2v22H)A8?&7#Q(1ZKc&0CK0gT2rBdN$j%kZ~^K!-J`+Ssw13A zOgR!Og#&ld$q^JS{?MpxJd;c<)1k=8EqM&tO zUzC&7wXnojZnc^OI$;W6{5Al9dny?dY_g92lW=)OwN@Ymy4~jpJ^y9C{#aBX6o?>B z{kQ(ku=|L_jpIHt{qc39F(_k4G1xXaPp2wLK4I-h1Q6aRsy)b{-!CSPYpHU9qyt)(=iXj*e8qu7Uox(R2W zxgukIoCG*4eT#_Z1kBR*GWRdku+b1#}f2(F!6vBwFtfU5Wz64`N5Q`eO zkNb5>&%d{W4F;wO7*{)3R|WlraM@})TXi@ZyYt)RNe(F(-ode_8%i2OyELOfJGpip z$-P+htl2llUay1)DSnzJhoN)xb>VVmI|7mKfDY37FNY>OMV&*VeuoKT+pnFs!1{f` ze%Vpl^D3*y;|p{ebi2PrJ+*soc(A1Wl!?PAV0<;yP!F=%q3k#>^<9AwELnHNn1|7bl_ zMK#i2w5)&%0bVx&Y`FqrCZ{i2 zcP@hQDE(?Df9pI|3M)89=NUB`Imkr2)-SbzQ zbef+D8%Vt#(&96;>W&uu;{kg_pij2|PvVa!E-uM>C=1wx#IeLcq7rWj?TqW2u@I6T zE~GX5uYU{S#5D{S_-)#X-In}V_^I|w1O+Ns{?vNYil;PzyB=86!U*gktp4jNIeUGm zouoZayC+90hU56*QZ##13-wXhRyM&%`bvj%>hC}0$`9$B6+@Pr!`d}PO^-@4gpryR z&{MBo@to3mZLBXwt}D)ta8cNp3R}TEfpT`=#{9I}8Md=?dxI>J5HeX0$^8mWTac@I zcvQ1EKb*~qg+1_b2X&SXymK?}Kt|EFIUypMadSZNPc{&$!>T#Enck{|e9-w4#9Ge= z9{md}7<(ij!+42zw728N?^Ggilu#o@tEImINfGN9EYU8O);Sb9l^Ol$f3T)7TI$VC zoJ2pY0#07m$GRInJn^(XTc1E59dl9ybU{>Gee<;x{DO0DOO-$Re8^mASdZ^`5^sv~m@S$y{c@0NFgyK6?objQtC{fhT5d-6M4G&Nk^a_emTWZVpB_Rj_ zmtOv`iAU?U)q}v9u=_j^}vSrnrOha|iC9 ztB|HGwKZOBc=ne6Gwp%x2dTH50k{Sk{#B2B4Yq^;C7U-Uk?24JhCsPMpEFxZCL}`aaFW&e_IAmE(p1cGvzuV_e4vZyTcH#b1Ha zXw}-{=#Zr@#>Rvdkoynh0d&D<6z(@Kn1j;#3_t@qjlkR!OfSyqkcX)K9KJ<+BUBb9 zhGT&puIJ7Z@uY8VaYOgT_E44&@Ig1dGK;mYEeFGJWP`_ z6d$(opq=OM4%jp!SJ+B!NSng-2s@BlE z`k3iG#CuJ!5PFeJ+I5Od8Oeopf#z@YIZt}Z)7Esvh?l8eqq9y~c=%`L`dZG!`rP+Y z`;YA)7rXJu-b&03%Dr;jErkg`x8nfx!EJ3>8!FhXqFOsNb_1OHJvmIOU!p_`QR>zP zPkNLC)bW#|v4%WLV+m_22IN4qCenUtFs|Ofz?{jV3(lGb4n}8P)&paEDFkQ4F>hu8{=XnA1>znGAXC_4G#NnTQ zL-xEy90dK-vQkFte{my}7&jPp^gy8`+*PzmiMjSDaC+uttQG^Rj7j`deT0Ibtuzz{ zFqTq0*l6%i{ROE?N-#TK0bpoDwX<4m9=4a>vY?t^tvYVAc)_WpL>B!Sd78RQtct1q zd0mK1H88iH&ArOquIYovGTGxcHZfIABicAP#}%2vQRI6kh@7JK-DqQEWzFrL((94X zwOl$y`DkE-6Ir=#tRE6sg;B=wdVFjKjF|vf$rU*XvQe;<2D4GswNOig0>IpA={Zzq zY3QdgtZU3&H;a{DlaMMSJDBFQsR6G^zWvGOBCqzKmRYA9kebjpu`Mp<}?c zJ2+>am44UX93?h(vId*&&c`0Nxw=Ry^^|5i=cw9S`m?{=Qp52N3_WPGxUR}?QA2{> zNEm+K=)#hIMu4?wn^(b0?T!OqL6bnqvg(`SObs2g`jTvmH0l7X8=Jt^h;|04Mcev; z|KmtI9}!Nq$}jZb4x#^LoU_SLkWE6Feu1lJsESXTgsfr)N@_?jRf~-JNVkS>U-KKU zK8zS2&^$0hgfXq6%fQuw7&S|O~1I6mx&|K(-WZcL}fQh<4pttdF^X}Zo z7=(gBY&fwkZuo-6Q<;JC0h@woEPuC%S02f$!MFKa3oVpHfI>hSXk+vNB%)MSlbg%1 z^?TPy2vtZJ&2S^9p-18H%Q}(IC4aVgo;1M(MGcy>=JkXmCF|Fd`h}gX97X>ri_V)& zHvo&9?;o&7HvIOYQM%)n3+w~gI<>5BI}BU{P2~M;a0SeD{jg$%b#%umri_)9t!(wB z2gCjU$R$J`Am~TwuJLFRPqZ>W?v%*tW5HY1>ju8n<%B30Ktg!2i7(P4$O6B!ND&kf zfz{;m!+CapFz2eIt~EN>y^4HrQ!jxqF+V&L*~aQW%dW?8`l427-|_xMvQb*ktci8J zn3z$5v=k^mTPBD6tswbw_kJxfFmOp|3K9lhoVerGA080jLuw!oJHvDtTlLtPpr&BP zjLoxj$WZsU&T1Ne8%?P+6Hg>jkjUATa@XO-;Dwm>i75cF%Ta`{SM_J@ZlGqeg0%Pe z?W-1xto~cTx5BP%&o!9J$42kirB9cK)JtDk9&H_X1f_HY8A1s0#^kuwLOrhhw)jJA zd1%>ZZp^*TtfE{CcyK21vLG8BFom*B$AWVl<=O~uc%3K}2qOKcbN5wlEpTm09qkm3 z*ZEsB*os1W5%&D|G_kct10n|Wm7JJ%DuxEu+2&yW788gf&Mx^hu0XVHe*3J@HX%PP zIrnBOLVt)$H}wo(-@OT~{M_pQvT1dHC?x&zZq45U|3XTADTE)F*b!xedry1Be!6G0 z`!=-;LBdkdE1d+Im*UL-n5twDR5%@%JbRT`U>qI^QX#MAG--VQf@BI5%x>5@<>&8~ zIZSw_z@vZ-#=oLvEDA+|_K7vtX^WDpj*}Td!G1=uiKLMDs#tbaG$hpE?Aj*8r4fq^b6gR$$H%FfcCvS zd8U87%6gHwO?uh(g+WPtL$37Lvzy4o%KDy?`ZTWwxOV$c)ZDFM>oaw*v4UbHGP(>m z;o@F`Ab)jqnx-mF^ zsZ5vg`rkZWj`=a@g)Abh+KttbJNqaMkN##tglWdE5H5Fk``O5WxAnIJnqB&b_*u+K z4R3r>0c`)K^J=c4GcX8W*a zcYsuNmfgtWYq!^CtN(cC3yMx@=!@;Ka!70bUpV-BUs)p*<95z>r}#;k6@Z6@N8sP{ z-H=oob~-&BZn(l}=BbA$+rtsy|M=Yv+yQ}#4r?&=(Scuoc0t=DAmqz-vc0qFf)Z2j z#EDoBA}sNIjC;Onae5pUT_;^{;Xb7`dJp?? zeTGUn_zV*A`A2vN(nBGf9YLzFK#!v!2*9mFRL#1Bw`f3;WNca^1WU#Ef$AyH$W)dT}U`p3QmT*wM3h+H9>!~S9Kk~e1R z(HD!2E=W$Gr5BhViPFvJyFa%c>3ddWcd>BNS%PN)coMjGGpzWgquEOA7q(n{abAsbPRMBV6x`d7a|BU#QgOcXm8 zWZms&hqeFDJAVdrCS`e{wBGI`zza83HZ^W2(Cj~6-myj!1qVc*(N8BtSJQuJtUx38 zB{3k=nG>RKMIK1VHNxPGz@kpMYg(e4#c8OX2b$4wXAO7{fS_}y65?6LEiQ>Hc`j~G zqTrp7k4L;tV-ig)p^A>v5e+st%=d7KK-I|qe0=&GKrfQUe#+|7t}VtVoAo-O>MEFD zl4x{9Y+j+o;o!S-)Q$=iEv0FhkSz$>KlvT zkTUck$yTJnrbb34=Qk5Y%&6{Nh&_rD2d15WuOCb2TmSqObPrq%P-o{;PYL-@%KKpu z53{#wap9fRIukW@2zyx^C^;$@FS9aW+nLllWJdeMyj?JpYsh12bM^1r0R$1JF^~JD z7l4l_V10twWx<|Z|6;+kG^?e^{Z;n#yRLP2zYE$=%EgxJEfxFnkFf9SI-NJ$f^apQ z!YhzRkMVi=EnluCBtHib&+Q9gsj3={t_$K+s_oepXuo;?q)?Wvmv(1_*|DhblN^tS zs})+>2gxg9SGc3aX%kS;7xIM$hsZFVs?B5BFXj5+v~!!Z2UmFg{%DIt#r>6J))Fh0 z@o`3eZhS|{#QK;1iXvL@TdQqjVx=;4A53=+=u^1h(9g4aHq<(RoA#qOP}F``uOjU} zyU(0{dd-+ELeT?O5Bj1VD^mx+hv)7O_2p&&ABekDLSGw>&{+1Agy1`^336TGX ztVEHoH&XMIH^dH+(K^CVGQqwMwQho8S&hrg->PUkcOi^l2r&GOF-*JwiOOfxP&|ff zc3e&ivL+E1<$>q3qqsdR5SB%f(c`57*9}?Gz9ReiZlNn>)va1+@3$8@n*lDk8p0GV z@~Ug?U*=T3ODREU-dFq{*>;qE1w%Y+m!ED0tzX>l?$9J%AI7a=jD9wdY;ktNC-`Tc ze9tWwV%ZgnPrhJxNBkS?dP($~xa4aAoYa?aoO4{#(q@6=U8}rw0kfgFLfSl>m zVkbY4~JK@^x4lS6AUgyi43lXSKAVX9!7XLo84UsH(xJ9YBmWk;{4 zMey$ZI>N3<39uGceVb#s^&Y@?w$c$=s-cH`^eiE8>C^ZijP~q%y-FvZeAs&NU^o=D z%xc+maIdSs(}ztT_cTz#FW4XY z{rSke(fjKtx~Nbxvpmso%!T~kf`!($8r!ux8@26rvHs%|QFV0_HJkXauU{{3R85R~ z!yVf%A_u{vccU*$TQ@=8CiSjW@xf!&8wONTzE{^G9tTI2SxM&yFV8r8E+s;`4>f7(4&@d(-QWI5t7QhPKmTkBl z$8f4~eCA`K9bzQa!mT_wC049!zfNU%udCQ+!TTY`M-i6jb%75X_}H>$rVbfXDT$1! zsx+$^+Lz`r;zy||HYmSP&PsE@^%ezX4r}8jKH{{b)(g8n9X+yU4ftPV9YGX{B52>y z>pm?5XtV)^6Qtb9#GHerjkt_B<^gt}I8{Vn;OyyA^_%}7`nC~JaEArJ&o5^gfBNj& z4jEgCxBfB^QFnO~YJv(T_jjX{CpDv=v;y{?Xig;%EPo?};tqe=d^Y*Ebz*Db1%x;*4 zWkZyMf=2zHD~tnrteT57(5GvV5=p0kg_rMiMW@_e(4`d5N}0S@h#|W-1q(H9KFh)* zr34E%;-iqhJV4lKyzU_XBX-`RIkK0&B$o?#3fD=6 z67}q(0O{r>0o@Z6Nu$+(SUdY_sU6EyNtUy^vZ?$K<^|}UHRu-*u`tlZ6{UD~xaL-E zEV9m0Tj7)@QSOvCS;!+ACM$?~i!S`e)9WPYI&-)d-aep@j*y4DB*7??m*AK3q3{hJ zX+VJnV+7UM5$gzY53hUR$E1h$&fVNaN3Zj+%|C?aUZy+kAy?sczm#vbS1=IZxqo(7 z`(_myOt^x92hj=wGadLNvg@k`cm$9mQwQlcJU(GfzrI;#pwrZb09I(s!HR1OK*4I5 z((sE^@t2803@W0T2W4>#th!$Ml{^%m zQ_80ejpubM9ovnh6us>sN4|qiHt(C3wX>AxL(5%&is03sto$sWJ4*fxvudELMtWn4 zFJ4wM)x?T;`fBTi-*M|hyWaNmGuHk2LFM>NDr&n2$i}k&rq_fG%31WApN+@#G2KgR z3>zjcC#OF)oSb`0Zj~E%Z{G?J z;z!xZ#pE%tEdnLE?w);wt7A-Sp*nFnc3_jHh!ni(T4vE=Tmw}rNg7tP+7I60W~TG+ z^gu)H_#?_PvL(WdJm|S_&1GJeNiH+Hz`pK)?1d5vk_byzAaPnXo25ylwG!$&E=5;1yGK^)!N*7nQE7^UWsT4B z72m+qeer8NW_#b&tBzv}u615y@?_D-aqKs^igeuGK zF`4wr@rfpcr{-#3hLEZi(dKf&l6O2b0Z8zEorVbHhp^wTS|ZDV1%aSm1l1+% zaKZS^5?OBSZt2=RQZBsCUn<2X)~4l=Y1Fl=5;U zxT_CE`E;b`)u%USIle1!!!s1o@BNkT-mzqFjp%$kDeJx^|2)ql0j`BSGyi_IMKJ%w z=Y{^|WPRQ5xrfmwBvXcN_iOR5#2bM!$xEuWW|6+l@U->t@jMFQ$Nh4Ql*(FE^~ip-Pcc}8yZD3zy?dvpT@D{b>9wS? z)l1`UMF7yKd+25}vBg99L_!iVy>vu{67Zx_k#m@ zkdwLG+C#^2dC1ehe-=*>H*%an>pop(bjn);hY*s1CRyMLE|xRwg3jzWq&Mw;__Pg% z^2fp${{j4}>&nuRI=&4~Y6?QyvX7=S+^wR{7rXfa#OzdFMnvdhj#p(DFUgI|?UjQYufW!Xs>my5 z&Db~Wf=Izzi0kz*b$LWR@~hd>+s_M6&Av;dDO-QCh))7Uy!Ey|n@eU@8{QP@y2bcB zH9Y5ZaFA(DI~DN{+#@cZ_eEjnt=%pxl7Cdwy5xPCBMJmU3^)Nno7Ok$$GMhF z1=fsz=RN9R4X!#%d_LQa+))uDpK-KRP-d%?VC!8PS%XoJ2L^S=#oQ&M&q>x)^n1>| zi987(qfDP24jnAJuH(r&n}|pr%Xtqs$M-Fdn>cIPS?(NCc;?KB>=w;p zCmLIq55AWgrj&>qrCHv0ACdHuxNki|`ADW?fdEJJ;sb_^>CY%J%%)fK-fs}nBlUjS zRj+_PEKTQ!Tt%%d2eyg~NC=YlaAp1MkRupZfAy~LksyH%5xFNnF+M(QpB-17q2CHA zbl7+FnFMz;JNov&y>fX&s?P{@@hR5Vc5%rtiV@{{Znl{YXM{C!JlP^sV84XrWqYr3J!>h*0UDzA6jGZIFYbhKNTp*5g>Z0BA`J z$%FT~@)$K0FQ1v4==|W5!z3wcZ4*$N&~r6nPPvgdP#mA|a$x?xC5#Z@4May;q(3`0 zitNm1h%8at$nsY%EFfV$*9$$Wi^=6JSMoC$=fcl60z?;}k5K7<857h*4LCW}e7l(w zE)h<;k6|)llADU_YV$^Jn`uE5%#uO|R(XIv-&)~gd+$COd2A&r{HnUyIXXXu@196= zRh`H!#!%GBTn4*S?SJkTKn2tIiw_ivOYqIH?;(saG*u_&WK7@gE;}5n(AME4F(!9D zvoa>8noVGIcsyM(Do$M%e;!?Z`NT;meX^22hn$&nv-%|Pv@q8$@470O?R#0!A@VSM zD!DUNKWT5pvw2r^lIeCy<$JZWaIELCb#b|wDdYaV4?}@S1+H7e)T)X}&|eyfaP~q) z6oDUr+OZ!$e>~RnO&D%YKnUgd#jHgr`|94PCZuce*h+7c%shEkb1g!HX?_pnXTh>WVq<`7B>{h&W^p>26$iR~acgfx zw5wQuGlrna{(QfwK@ymym~Mmsogx5TrhBu~JvN0961~E=L4dL;%2fY&_Ff`fFT8Eh zB_M&0^m~KG77Ej%IZ7~^Ng6z_4h z1^qKxZBHB#+=77r_-zkVh~M@gpaTEP^t41eLjnh92`t$#fgt@S1ShUsBDg~`)@;YA zeC*Pi5dgRp^PCGZN)GDJcL}QVPS2C`C3JvdE`NRm!~TVFU|+yy+mMY9sO6!dcvdoD z_mU4B_(M(>F_qFcj%AK~Ed9of#EYUytmKOZ?dEGNS#t+)=4spFGVNg?Y(G#~JD<~z zt}E^yZIiq}b9+!qve6rvjDEWGg0b#g4ei^9{Q;1J^1mXjn!1f6AJb&aGoXhri}M>L z6(jmEL!G8*E{IX|WaU-NKJXPMv|?cRii-HX^Zi`MjbL1=+1c<&rSeDD;FA8JAvYB^ zEqH?!k7pI9@sAU{C#yNW*BykDwl6y=e~39Af@0)bq)>RJJa)sSe4ma^GCy6E>Um_? z6gUq{zN_K71r4B~KS&aze(+bGB3VK{xk1Y`p*AN(06kg|#%hLfc&=1;ec4pf11n*ZxVZRnyfZ4cq)>oMSU+Dmn+eUL#a|T!D12-C+7VfUgl{W9}$tdQfelRD2q|EUE2hh}YTQrYn5X{7%E z3^6JLG`xQB2u6Ybzb)nO$DQhEsH9-YQcAz$3^gL?>A#}AQc^_*0b;dirS?-ywbJi2 zKjCG7wCN7Lzr%^4wFidy!lek5F)d^}G$k_q?MYl)8=)vy*#7r@u zJfpX*x)J$y0E&$n7bCfLerrH5_F!JwPu@(zRKs_m(1gphk2Y1ADnf{>WBXhj?A$z0@i`M|L_hXMJ=bokPfql5 zI0c>%JUCYJ^HqaSXPPskEcF`>JXCF$EcIz*wc#L8p&6R@!|eT*6Tj{F(}S&&_k>!G z*Q>jlM+YS2zYEj5;^Z%`kHNKprwUddC)oK(wMZ5)rTTHeaXMCKE(zk&B%b{oj%M;U&CxQ=B0G*AM*HfxX7| z@j;1*5OaZi%$*hpZUm-Z%$m()k!l+iL<~us-3|xIg30`{wOGO>)x&BUqL^SXTtB|3|RajB=Sb^ z^oe{PV(bvc|7v8(#$#>qhtR|9_nyM@4jNV@m5&dJ*Og3`ccx9RC1xUt7dtj7M~HCt zv_q314SsYYvr8>Nzuo{(nZaZp+FeILSjap(s1B=r)%6x$#uF2W?#K0g% z`Kh14A$-jbw$BE0e)a1&n5ff>##5@uxJm8eO~SJc3-;O{c70?kW}cB&gim@h)>h45UQc^1<%6t=6z9W}X$Ve2l-6|ri91*N zRNavAHz%O@2S|P7|70$(C7=M{NTbMve?LzuPnPp)DvO^&3~q8%yb9?kmxJ!@;$Ui0V!kusls;!kY`)O zu^mqmPA97amk^hb@NG3uEK=`^2_B73Y4_C?bTmKkdH->-9l0yonqNMd%MaO@e3H+6 zURUVwtUsGc(ajzc%qpT)PMQWs(@kZ^1e#W`g1}&S=%usb)rd^ROJV#-VH|0wO%0^J z7WLp#6&Jzn3mECs##BjrY~rMRh*O)G@HEEV^)9o7f$o3x%%Cu!DAS<5<9(pTK^RGh zoiZ3ESWTX*T$pA_2n5WPp=EGBY_Fa>^&xnJ+OnxZplG{cUcZ)@e~tyL3`7#-sZ}R_ z%$bqZc$D7EjzSbPJ<)5CABa6cYf{>0)a>ULpzZ5=;%OFp;1m!$4kW4~jyfFzK}<9Z zAKJddrom!aBHLcjJtDX&#FfpgWNSC_+mliaRSv~q6~>oQGd>0-F~wDCLV|g~e_V!^ zFvO0u9I_{5{|zgS08$o>5UR8vQ58l3bmAWIufFfq{Vf39CdsRNl(@_tE=%n8g=qec zKn>8wm*^w

  • diff --git a/docs/md/for-solidity-devs/_meta.json b/docs/md/for-solidity-devs/_meta.json deleted file mode 100644 index 9f7b6e3318..0000000000 --- a/docs/md/for-solidity-devs/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "dev-tools": "Developer Tools", - "developer-overview": "Smart Contract Development Overview" -} \ No newline at end of file diff --git a/docs/md/for-solidity-devs/dev-tools/_meta.json b/docs/md/for-solidity-devs/dev-tools/_meta.json deleted file mode 100644 index 74f6db204e..0000000000 --- a/docs/md/for-solidity-devs/dev-tools/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "available-tools": "Available tools", - "foundry-polaris": "Using Foundry With Polaris" -} \ No newline at end of file diff --git a/docs/md/for-solidity-devs/dev-tools/available-tools.mdx b/docs/md/for-solidity-devs/dev-tools/available-tools.mdx deleted file mode 100644 index dac66780a6..0000000000 --- a/docs/md/for-solidity-devs/dev-tools/available-tools.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Developer Toolchains Overview - -This section provides an overview of the developer tools that are available for the Polaris Ethereum EVM. - -| Title | Description | -| :------------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------- | -| [**Using Foundry with Polaris Ethereum**](foundry-polaris) | Using Foundry with the Polaris Ethereum EVM | -| [**Hardhat**](https://hardhat.org/) | Smart Contract Development Framework | -| [**Truffle**](https://trufflesuite.com/docs/truffle/) | Smart Contract Development Framework | - diff --git a/docs/md/for-solidity-devs/dev-tools/foundry-polaris.mdx b/docs/md/for-solidity-devs/dev-tools/foundry-polaris.mdx deleted file mode 100644 index 3209c2100b..0000000000 --- a/docs/md/for-solidity-devs/dev-tools/foundry-polaris.mdx +++ /dev/null @@ -1,565 +0,0 @@ -import { Callout, FileTree } from "nextra-theme-docs"; - -# Using Foundry with Polaris - -
    - -## Introduction - -This guide shows how to deploy and interact with smart contracts using foundry -on a local Polaris Ethereum EVM network. - -[Foundry toolchain](https://github.com/foundry-rs/foundry) is a smart contract -development toolchain written in Rust. It manages your dependencies, compiles -your project, runs tests, deploys, and lets you interact with the chain from the -command-line. - -## Recommended Knowledge - -- Basic understanding of [Solidity](https://docs.soliditylang.org) and [Cosmos](https://docs.cosmos.network/main). -- Basic understanding of the [Polaris Ethereum's architecture](../../architecture) -- Basic understanding of [Liquid Staking](https://docs.stride.zone/docs/getting-started-liquid-stake) - -## Requirements - -- You have [installed - Foundry](https://github.com/foundry-rs/foundry#installation) and run `foundryup`. This - installation includes the `forge` and `cast` binaries used in this - walk-through. -- You have a running instance of Polaris Ethereum EVM. See [Local Machine](../../running-a-node/running-locally) to run Polaris Ethereum locally. - -## Polaris Ethereum Liquid Staking Smart Contract Example - -### Create A New Project With forge - -Let's create a new project called "polaris-lsd-example" with forge. -`forge init polaris-lsd-example` - - - - - - - - - - - - - - - - - - - -### Add Configurations For Local Polaris Ethereum - - - Ensure that you have a local instance of Polaris Ethereum Running. See [Local - Machine](../../running-a-node/running-locally) to run Polaris Ethereum locally. - - -You can add a profile to your foundry project by appending the following lines to the end of your foundry.toml file: - -```bash -[profile.default] -src = 'src' -out = 'out' -libs = ['lib'] - -# See more config options https://github.com/foundry-rs/foundry/tree/master/config - -[profile.polaris_local] -src = 'src' -out = 'out' -libs = ['lib'] -evm_version = 'berlin' -eth_rpc_url = 'http://localhost:8545' -``` - -To test the configurations above, let's deploy the generated contract in the "Counter.sol" file to the Polaris Ethereum localnet: - -```bash -FOUNDRY_PROFILE=polaris_local forge create Counter --private-key=xxxxxxxxxxx -``` - - - - Forge reads the profile's name from the environment variable - "FOUNDRY_PROFILE". - You should replace `xxxxxxxxxxx` with your own private - key. - - -If everything goes well, forge will print out the address of the deployed contract and the transaction hash for the deployment. - -### Install Dependencies - -We will build the Liquid Staking contract based on [Solmate](https://github.com/transmissions11/solmate) contracts. - -To install solmate, run the following command: - -`forge install transmissions11/solmate` - -### Add Remappings.txt - -Foundry installs all dependencies as git submodules under the directory of "lib". -And to make it easier to import the dependencies, let's create a `remappings.txt` file with the following contents: - -```bash -ds-test/=lib/forge-std/lib/ds-test/src/ -forge-std/=lib/forge-std/src/ -solmate/=lib/solmate/src/ -``` - -Your file system should now look like this: - - - - - - - - - - - - - - - - - - - - -### Create The Staking Module interface - -We need a way of interacting with the staking module. This can be done through the use of an Interface. -More information on Interfaces in Solidity can be found [here](https://www.alchemy.com/overviews/solidity-interface#:~:text=What%20is%20the%20Solidity%20interface,and%20functions%20on%20a%20contract.) - -Create a new file under the `src` directory called `IStakingModule.sol` and add the following code: - -```solidity -pragma solidity ^0.8.4; - -/** - * @dev Interface of the staking module's precompiled contract - */ -interface IStakingModule { - ////////////////////////////////////////// EVENTS ///////////////////////////////////////////// - - /** - * @dev Emitted by the staking module when `amount` tokens are delegated to - * `validator` - */ - event Delegate(address indexed validator, uint256 amount); - - /** - * @dev Emitted by the staking module when `amount` tokens are redelegated from - * `sourceValidator` to `destinationValidator` - */ - event Redelegate( - address indexed sourceValidator, - address indexed destinationValidator, - uint256 amount - ); - - /** - * @dev Emitted by the staking module when `amount` tokens are used to create `validator` - */ - event CreateValidator(address indexed validator, uint256 amount); - - /** - * @dev Emitted by the staking module when `amount` tokens are unbonded from `validator` - */ - event Unbond(address indexed validator, uint256 amount); - - /** - * @dev Emitted by the staking module when `amount` tokens are canceled from `delegator`'s - * unbonding delegation with `validator` - */ - event CancelUnbondingDelegation( - address indexed validator, - address indexed delegator, - uint256 amount, - int64 creationHeight - ); - - /////////////////////////////////////// READ METHODS ////////////////////////////////////////// - - /** - * @dev Returns a list of active validators. - */ - function getActiveValidators() external view returns (address[] memory); - - /** - * @dev Returns the `amount` of tokens currently delegated by `delegatorAddress` to - * `validatorAddress` - */ - function getDelegation( - address delegatorAddress, - address validatorAddress - ) external view returns (uint256); - - /** - * @dev Returns the `amount` of tokens currently delegated by `delegatorAddress` to - * `validatorAddress` (at hex bech32 address) - */ - function getDelegation( - string calldata delegatorAddress, - string calldata validatorAddress - ) external view returns (uint256); - - /** - * @dev Returns a time-ordered list of all UnbondingDelegationEntries between - * `delegatorAddress` and `validatorAddress` - */ - function getUnbondingDelegation( - address delegatorAddress, - address validatorAddress - ) external view returns (UnbondingDelegationEntry[] memory); - - /** - * @dev Returns a time-ordered list of all UnbondingDelegationEntries between - * `delegatorAddress` and `validatorAddress` (at hex bech32 address) - */ - function getUnbondingDelegation( - string calldata delegatorAddress, - string calldata validatorAddress - ) external view returns (UnbondingDelegationEntry[] memory); - - /** - * @dev Returns a list of `delegatorAddress`'s redelegating bonds from `srcValidator` to - * `dstValidator` - */ - function getRedelegations( - address delegatorAddress, - address srcValidator, - address dstValidator - ) external view returns (RedelegationEntry[] memory); - - /** - * @dev Returns a list of `delegatorAddress`'s redelegating bonds from `srcValidator` to - * `dstValidator` (at hex bech32 addresses) - */ - function getRedelegations( - string calldata delegatorAddress, - string calldata srcValidator, - string calldata dstValidator - ) external view returns (RedelegationEntry[] memory); - - ////////////////////////////////////// WRITE METHODS ////////////////////////////////////////// - - /** - * @dev msg.sender delegates the `amount` of tokens to `validatorAddress` - */ - function delegate(address validatorAddress, uint256 amount) - external - payable; - - /** - * @dev msg.sender delegates the `amount` of tokens to `validatorAddress` (at hex bech32 - * address) - */ - function delegate(string calldata validatorAddress, uint256 amount) - external - payable; - - /** - * @dev msg.sender undelegates the `amount` of tokens from `validatorAddress` - */ - function undelegate(address validatorAddress, uint256 amount) - external - payable; - - /** - * @dev msg.sender undelegates the `amount` of tokens from `validatorAddress` (at hex bech32 - * address) - */ - function undelegate(string calldata validatorAddress, uint256 amount) - external - payable; - - /** - * @dev msg.sender redelegates the `amount` of tokens from `srcValidator` to `validtorDstAddr` - */ - function beginRedelegate( - address srcValidator, - address dstValidator, - uint256 amount - ) external payable; - - /** - * @dev msg.sender redelegates the `amount` of tokens from `srcValidator` to `validtorDstAddr` - * (at hex bech32 addresses) - */ - function beginRedelegate( - string calldata srcValidator, - string calldata dstValidator, - uint256 amount - ) external payable; - - /** - * @dev Cancels msg.sender's unbonding delegation with `validatorAddress` and delegates the - * `amount` of tokens back to `validatorAddress` - * - * Provide the `creationHeight` of the original unbonding delegation - */ - function cancelUnbondingDelegation( - address validatorAddress, - uint256 amount, - int64 creationHeight - ) external payable; - - /** - * @dev Cancels msg.sender's unbonding delegation with `validatorAddress` and delegates the - * `amount` of tokens back to `validatorAddress` (at hex bech32 addresses) - * - * Provide the `creationHeight` of the original unbonding delegation - */ - function cancelUnbondingDelegation( - string calldata validatorAddress, - uint256 amount, - int64 creationHeight - ) external payable; - - //////////////////////////////////////////// UTILS //////////////////////////////////////////// - - /** - * @dev Represents one entry of an unbonding delegation - * - * Note: the field names of the native struct should match these field names (by camelCase) - * Note: we are using the types in precompile/generated - */ - struct UnbondingDelegationEntry { - // creationHeight is the height which the unbonding took place - int64 creationHeight; - // completionTime is the unix time for unbonding completion, formatted as a string - string completionTime; - // initialBalance defines the tokens initially scheduled to receive at completion - uint256 initialBalance; - // balance defines the tokens to receive at completion - uint256 balance; - // unbondingingId incrementing id that uniquely identifies this entry - uint64 unbondingId; - } - - /** - * @dev Represents a redelegation entry with relevant metadata - * - * Note: the field names of the native struct should match these field names (by camelCase) - * Note: we are using the types in precompile/generated - */ - struct RedelegationEntry { - // creationHeight is the height which the redelegation took place - int64 creationHeight; - // completionTime is the unix time for redelegation completion, formatted as a string - string completionTime; - // initialBalance defines the initial balance when redelegation started - uint256 initialBalance; - // sharesDst is the amount of destination-validatorAddress shares created by redelegation - uint256 sharesDst; - // unbondingId is the incrementing id that uniquely identifies this entry - uint64 unbondingId; - } -} -``` - -Your file system should now look like this after adding `IStakingModule.sol`: - - - - - - - - - - - - - - - - - - - - - -### Create The Liquid Staking Contract - -We are now going to create the Liquid Staking Contract. -Create a new file under the `src` directory called `LiquidStaking.sol` and add the following code: - -```solidity - -pragma solidity ^0.8.4; - -import {IStakingModule} from "../staking.sol"; -import {ERC20} from "solmate/tokens/ERC20.sol"; - -/** - * @dev LiquidStaking is a contract that allows users to delegate their Base Denom to a validator - * and receive a liquid staking token in return. The liquid staking token can be redeemed for Base - * Denom at any time. - * Note: This is an example of how to delegate Base Denom to a validator. - * Doing it this way is unsafe since the user can delegate more straight through precomile. - * And withdraw via the precompile. - */ -contract LiquidStaking is ERC20 { - // State - IStakingModule public staking; - address public validatorAddress; - - // Errors - error ZeroAddress(); - error ZeroAmount(); - error InvalidValue(); - - /** - * @dev Constructor that sets the staking precompile address and the validator address. - * @param _name The name of the token. - * @param _symbol The symbol of the token. - * @param _stakingprecompile The address of the staking precompile contract. - * @param _validatorAddress The address of the validator to delegate to. - */ - constructor( - string memory _name, - string memory _symbol, - address _stakingprecompile, - address _validatorAddress - ) ERC20(_name, _symbol, 18) { - if (_stakingprecompile == address(0)) revert ZeroAddress(); - if (_validatorAddress == address(0)) revert ZeroAddress(); - staking = IStakingModule(_stakingprecompile); - validatorAddress = _validatorAddress; - } - - /** - * @dev Returns the total amount of assets delegated to the validator. - * @return amount total amount of assets delegated to the validator. - */ - function totalDelegated() public view returns (uint256 amount) { - return staking.getDelegation(address(this), validatorAddress); - } - - /** - * @dev Delegates Base Denom to the validator. - * @param amount amount of Base Denom to delegate. - */ - function delegate(uint256 amount) public { - if (amount == 0) revert ZeroAmount(); - - // Delegate the amount to the validator. - staking.delegate(validatorAddress, amount); - _mint(msg.sender, amount); - } - - /** - * @dev Withdraws Base Denom from the validator. - * @param amount amount of Base Denom to withdraw. - */ - function withdraw(uint256 amount) public { - if (amount == 0) revert ZeroAmount(); - _burn(msg.sender, amount); - payable(msg.sender).transfer(amount); - } -} -``` - -Your file system should now look like this after adding `LiquidStaking.sol`: - - - - - - - - - - - - - - - - - - - - - - -### Functionality - -`LiquidStaking.sol` is a Solidity smart contract that implements a basic liquid staking mechanism, -allowing users to delegate tokens to a validator and receive staked tokens in return. -The key features of the contract are: - -- It inherits from the ERC20 token contract, allowing it to be used as a standard fungible token with a name, symbol, and decimal places. -- It takes four arguments in its constructor: the name and symbol of the LSD, the address of [Staking Module Precompile Contract Address](../../precompile-overview), and the address of the validator that the contract will delegate to. -- The `delegate(uint256)` function allows users to delegate an amount of the token to the validator, by calling the `staking.delegate()` function with the same amount of the token transferred as Ether. -- The `withdraw(uint256)` function allows users to withdraw their delegated tokens from the validator, by burning their staked tokens and transferring the same amount of Ether back to the user. -- The `totalDelegated()` function returns the total amount of assets currently delegated to the validator from the contract address. - -Overall, this contract allows users to stake their tokens through a validator, -receiving a tokenized version of their stake that can be traded or transferred like any other ERC20 token. _Note_: this is an example and not production code. - -### Deploy The Liquid Staking Contract - -To deploy your Liquid Staking contract you can run the following script: - - - The default staking precompile contract address is - `0xd9A998CaC66092748FfEc7cFBD155Aae1737C2fF`. More information about - precompiles can be found [here](../../precompile-overview) - - -```bash -FOUNDRY_PROFILE=polaris_local forge create src/LiquidStaking.sol:LiquidStaking --private-key=xxxxxxxxxxx --constructor-args ““ “” “” “” -``` - -or you can use a forge script to handle this. - -```solidity -pragma solidity ^0.8.4; - -import "forge-std/Script.sol"; -import "./LiquidStaking.sol"; -import "../staking.sol"; - -contract Deploy is Script { - LiquidStaking public staking; - address immutable precompile = - address(0xd9A998CaC66092748FfEc7cFBD155Aae1737C2fF); - address public validator = address(0x12); // @dev : Change this to the validator running. - - function run() public { - vm.startBroadcast(); - staking = new LiquidStaking("name", "SYMB", precompile, validator); - vm.stopBroadcast(); - } -} -``` - -```bash -FOUNDRY_PROFILE=polaris_local forge script src/examples/Deploy.s.sol:Deploy --broadcast --private-key=xxxxxxx --rpc-url=xxxx --gas-limit 10000000 -``` - -If everything goes well, forge will print out the address of the deployed contract and the transaction hash for the deployment. - -### Test The Liquid Staking Contract - -We can now test our Liquid Staking contract by delegating and receiving -a tokenized version of our stake. To do so, run the following script: - -```bash -FOUNDRY_PROFILE=polaris_local cast send --private-key=xxxxxxxxxxx ‘delegate()’ 1 -``` - -### 🎉 Congratulations! 🎉 - -Congratulations! You have successfully created and deployed a Liquid Staking contract on Polaris Ethereum via Foundry! - -
    diff --git a/docs/md/for-solidity-devs/developer-overview.mdx b/docs/md/for-solidity-devs/developer-overview.mdx deleted file mode 100644 index f11f0fbdab..0000000000 --- a/docs/md/for-solidity-devs/developer-overview.mdx +++ /dev/null @@ -1,43 +0,0 @@ -# Launching Your Smart Contracts on Polaris Ethereum - -The Purpose of this section is to provide information that will help you launch your smart contracts on Polaris Ethereum. -You will read how to use various EVM development tools with Polaris Ethereum along with examples. We will show you how to connect to the network, -how to use your existing projects on Polaris Ethereum, as well as any additional information relating to Polaris Ethereum's new features. - -## Polaris Ethereum EVM - -Polaris' EVM is designed to be as interoperable with go-ethereum as possible, which means that any tool that works with [Geth](https://geth.ethereum.org/) can also be used to interact with Polaris Ethereum. The EVM is still responsible for executing Solidity smart contracts and managing the chain's data structures and blocks. By using CometBFT's consensus protocol and the Cosmos-SDK, Polaris Ethereum is able to access Cosmos-SDK properties through [precompiles](../building-precompiles/intro-to-precompiles), while also remaining compatible with all Ethereum Solidity smart contracts. - -It's important to note that Polaris' EVM is interoperable with its Cosmos-SDK Application Layer. This means that Smart Contract Developers have access to base Cosmos-SDK modules through the EVM. With this new feature, developers can access Cosmos features like on-chain governance, the IBC protocol, and various other Cosmos-SDK modules. - -From the perspective of a Smart Contract, it will run in the same way as it would on Ethereum, but with additional contract addresses that provide access to the chain's Cosmos-SDK modules. - -## Interacting With Stateful Precompiles -Polaris Ethereum's Stateful Precompiles can be interacted with like any -other contract deployed on the EVM in Solidity. All you need is a -contract address and an ABI which you can find [here](../precompile-overview). - -For an example contract that interacts with Polaris Ethereum's staking precompile you -can reference our [Liquid Staking Example](https://github.com/berachain/polaris-precompile-dapp-examples). -## Accessing Polaris' EVM - -### Running a local Polaris Ethereum Development environment -For a guide on how to run a local development environment, please refer to the [Local Machine](../running-a-node/running-locally) section. - -### Smart Contract Development -There are various existing tools that can be used for smart contract development. -Below are some of the most popular tools that can be used to develop smart contracts on Polaris Ethereum. - -#### Foundry -Information on building smart contracts with Foundry on Polaris Ethereum can be found [here](./dev-tools/foundry-polaris). - -#### Using Metamask with Polaris Ethereum -Information about using Metamask with Polaris Ethereum can be found [here](../using-metamask). - -#### Using Keplr with Polaris Ethereum -Information about using Keplr with Polaris Ethereum can be found [here](../using-keplr). - -#### Polaris Ethereum Block Explorer -🚧 Coming Soon 🚧 -#### Polaris Ethereum Faucet -🚧 Coming Soon 🚧 diff --git a/docs/md/index.mdx b/docs/md/index.mdx deleted file mode 100644 index 2f5164b8b4..0000000000 --- a/docs/md/index.mdx +++ /dev/null @@ -1,24 +0,0 @@ -# Welcome to Polaris Ethereum - -Polaris introduces the new standard of integrating EVM into your blockchain project. With improvements to speed, security, reliability, -and an extended set of features, Polaris will be able to support the next generation of -decentralized applications while offering a compelling alternative to existing implementations. - -Polaris Ethereum is a blockchain framework built on top of the Cosmos SDK that offers a full-featured EVM with full -interoperability to the Cosmos ecosystem. It achieves this through the use of various [Stateful Precompiles](./docs/precompile-cosmos-overview) built -into the chain that act as gateways to the greater Cosmos framework. This allows EVM users to perform Cosmos native operations such as voting on governance, -delegating to validators, and even communicating with other chains through IBC. This design allows us to maintain -the native EVM user experience without sacrifices, providing true interoperability between the Cosmos ecosystem and EVM. - -Apart from Polaris Ethereum's focus on interoperability, it also offers a number of other improvements over existing -EVM implementation such as : - -- Improved performance when executing common transactions -- Enhanced Mempool implementation -- Optimized storage model -- Reliability improvements for JSON-RPC Providers - what we offer - -Overall, Polaris Ethereum is a powerful new framework for developers and users to enjoy. Its seamless integration with other -Cosmos chains and robust EVM support make it a promising platform for building decentralized applications and unlocks -new use cases for blockchain technology. diff --git a/docs/md/interacting-with-node/_meta.json b/docs/md/interacting-with-node/_meta.json deleted file mode 100644 index 1f2f71a69f..0000000000 --- a/docs/md/interacting-with-node/_meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "querying-cli": "Querying via CLI", - "querying-rest": "Querying via REST", - "querying-json-rpc": "Querying via JSON-RPC", - "querying-grpc": "Querying via gRPC", - "gen-brod-sign": "Generating, Signing and Broadcasting Transactions" -} \ No newline at end of file diff --git a/docs/md/interacting-with-node/gen-brod-sign.mdx b/docs/md/interacting-with-node/gen-brod-sign.mdx deleted file mode 100644 index ca5fb56b7e..0000000000 --- a/docs/md/interacting-with-node/gen-brod-sign.mdx +++ /dev/null @@ -1,11 +0,0 @@ -import { Callout } from 'nextra-theme-docs' - -# Generating, Signing, and Broadcasting Transactions - - Polaris Ethereum CLI will work the same way as Cosmos SDK. Replace `simd` with `polard` - - -Polaris Ethereum does not extend the base implementation of transaction handling in the Cosmos SDK. -For information on handling transactions in Polaris Ethereum you can reference [Generating, Signing and Broadcasting Transactions -](https://docs.cosmos.network/v0.47/run-node/txs) -from the Cosmos SDK documentation. \ No newline at end of file diff --git a/docs/md/interacting-with-node/querying-cli.mdx b/docs/md/interacting-with-node/querying-cli.mdx deleted file mode 100644 index 64c78e4466..0000000000 --- a/docs/md/interacting-with-node/querying-cli.mdx +++ /dev/null @@ -1,11 +0,0 @@ -import { Callout } from 'nextra-theme-docs' - -# Querying via CLI - - - Polaris Ethereum CLI will work the same way as Cosmos SDK. Replace `simd` with `polard` - - -Polaris Ethereum does not extend the use of CLI querying past the base implementation of the Cosmos SDK. -For information on querying via CLI in Polaris Ethereum you can reference [Using the CLI](https://docs.cosmos.network/main/run-node/interact-node#using-the-cli) -from the Cosmos SDK documentation. \ No newline at end of file diff --git a/docs/md/interacting-with-node/querying-grpc.mdx b/docs/md/interacting-with-node/querying-grpc.mdx deleted file mode 100644 index a3832bd7d8..0000000000 --- a/docs/md/interacting-with-node/querying-grpc.mdx +++ /dev/null @@ -1,5 +0,0 @@ -# Querying via gRPC - -Polaris Ethereum does not extend the use of gRPC past the base implementation of the Cosmos SDK. -For information on using gRPC in Polaris Ethereum you can reference [using gRPC](https://docs.cosmos.network/main/run-node/interact-node#using-grpc) -from the Cosmos SDK documentation. \ No newline at end of file diff --git a/docs/md/interacting-with-node/querying-json-rpc.mdx b/docs/md/interacting-with-node/querying-json-rpc.mdx deleted file mode 100644 index 338c208cd7..0000000000 --- a/docs/md/interacting-with-node/querying-json-rpc.mdx +++ /dev/null @@ -1,67 +0,0 @@ -# Querying via JSON-RPC - -For information about Polaris Ethereum's JSON-RPC specification please see the [EVM JSON-RPC](../json-rpc) section. - -## Querying via JSON-RPC with `ethers.js` - -### Requirements - -- [Node.js](https://nodejs.org/en/download/) (v8.9.4 or higher) -- [ethers.js](https://github.com/ethers-io/ethers.js/)(v4.0.0 or higher) - -Create a new project and install `ethers.js` - -`npm install ethers` - -To query the latest block number of an EVM chain over JSON-RPC using `ethers.js` you can use the following code: - -```javascript -const provider = new ethers.providers.JsonRpcProvider(""); - -const blockNumber = await provider.getBlockNumber(); -``` - -`blockNumber` will be a `number` representing the latest block number. - -## Querying via JSON-RPC with `geth` - -### Requirements - -- [Golang](https://golang.org/doc/install) (v1.13 or higher) -- [Geth](https://geth.ethereum.org/downloads/) (v1.9.7 or higher) - -Create a new project and install `geth` - -`go get -u github.com/ethereum/go-ethereum` - -To query the latest block number of an EVM chain over JSON-RPC using `geth` you can use the following code: - -```go -package main - -import ( - "fmt" - "log" - "math/big" - - "github.com/ethereum/go-ethereum/ethclient" -) - -func main() { - rpcEndpoint := "http://localhost:8545" // default local node RPC Endpoint - client, err := ethclient.Dial(rpcEndpoint) - if err != nil { - log.Fatal(err) - } - - header, err := client.HeaderByNumber(context.Background(), nil) - if err != nil { - log.Fatal(err) - } - - blockNumber := header.Number.String() - fmt.Println(blockNumber) // 5671744 -} -``` - -`blockNumber` will be a `string` representing the latest block number. diff --git a/docs/md/interacting-with-node/querying-rest.mdx b/docs/md/interacting-with-node/querying-rest.mdx deleted file mode 100644 index 28880b0c20..0000000000 --- a/docs/md/interacting-with-node/querying-rest.mdx +++ /dev/null @@ -1,34 +0,0 @@ -import { Callout } from 'nextra-theme-docs' - -# Interacting With Polaris Ethereum via REST - -Polaris Ethereum extends the base functionality of the Cosmos-SDK for querying via REST. -To learn more about querying the node via REST, see [here](https://docs.cosmos.network/main/run-node/interact-node#using-the-rest-endpoints). - -## Swagger Open API Specification - -Polaris Ethereum supports the Swagger API, which is a specification for describing RESTful APIs. -The Swagger API is available at the following endpoints - -|Network |Swagger Url | -|----------|-------------:| -|Local Node | `Coming Soon`| -|Testnet | `Coming Soon`| -|Mainnet | `Coming Soon`| - -### Base Cosmos-SDK Open API Specification -Cosmos supports the Swagger API, which is a specification for describing RESTful APIs. -To view the Cosmos-SDK Swagger API, see [here](https://v1.cosmos.network/rpc/v0.41.4) - -The above link will point towards the Cosmos Hub. To point towards your Polaris Ethereum Endpoint and -test the base cosmos-sdk module endpoints Change `Base URL` -to point towards your desired endpoint for testing purposes. - -![](/cosmos-sdk-swagger.png) - - -## Enabling Unsafe Cors - - Disable unsafe CORS if deploying to an external network. - -If querying a local node, you will need to enable unsafe CORS. \ No newline at end of file diff --git a/docs/md/introduction.mdx b/docs/md/introduction.mdx deleted file mode 100644 index 722f8fa34d..0000000000 --- a/docs/md/introduction.mdx +++ /dev/null @@ -1,7 +0,0 @@ -# Getting started with Polaris Ethereum - -This guide details the process of setting up Polaris Ethereum and executing basic tasks through the command line interface. To utilize Polaris Ethereum, the software must first be installed, which can be done in various ways depending on the preferred installation method and operating system. For instance, Polaris Ethereum can be installed through a package manager, container, or building from source. Instructions for installing Polaris Ethereum can be found on the relevant "Install and Build" pages. - -To function as a fully fledged Ethereum Virtual Machine, Polaris Ethereum must be integrating into a compatible host. This tutorial assumes that Polaris Ethereum has been integrated into a Cosmos-SDK based chain with the JSON-RPC running on http://0.0.0.0:8545. - -The tutorial provides a step-by-step guide on the fundamentals of using Polaris Ethereum, which includes generating accounts, joining a network, syncing the blockchain, transferring tokens between accounts, and executing smart contracts. To carry out these tasks, this tutorial uses the Cosmos SDK keychain, which is an account management tool that enables users to sign transactions. diff --git a/docs/md/json-rpc-cosmos.mdx b/docs/md/json-rpc-cosmos.mdx deleted file mode 100644 index 70681659e6..0000000000 --- a/docs/md/json-rpc-cosmos.mdx +++ /dev/null @@ -1,13 +0,0 @@ -# Polaris Ethereum JSON-RPC - -The Cosmos integration of the Polaris Ethereum adds additional JSON-RPC namespaces for Cosmos related functionality. - -## Namespaces - -### `cosmos` Namespace -The `cosmos` API gives access to several non-standard RPC methods to inspect the contents of -several [Cosmos SDK Modules](https://docs.cosmos.network/main/building-modules/intro). The `cosmos` namespace definitions are coming soon. - -### `comet` Namespace -The `comet` API gives access to several non-standard RPC methods to inspect the contents of -the [CometBft Consensus Engine](https://github.com/cometbft/cometbft). The `comet` namespace definitions are coming soon. diff --git a/docs/md/json-rpc.mdx b/docs/md/json-rpc.mdx deleted file mode 100644 index 3727f28c84..0000000000 --- a/docs/md/json-rpc.mdx +++ /dev/null @@ -1,31 +0,0 @@ -# Polaris Ethereum JSON-RPC - -The Polaris Ethereum API is accessible through JSON-RPC, a lightweight protocol for -transmitting data over the internet. This protocol enables developers to -interact with the Polaris Ethereum blockchain and access a wide range of -functionalities through a simple and standardized interface. - -Through the Polaris Ethereum JSON-RPC endpoint, developers can access a variety of -methods to create, modify, and interact with smart contracts, as well as -retrieve blockchain data and monitor blockchain events in real-time. - -## Namespaces - -### `eth` Namespace -`eth` namespace can be found on ethereum.org. Geth provides several extensions to the standard "eth" JSON-RPC namespace that are defined below. - -### `net` Namespace -The `net` API provides insight about the networking aspect of the client. The `net` namespace are defined below. - -### `txpool` Namespace -`txpool` API gives access to several non-standard RPC methods to inspect the contents of the transaction -pool containing all the currently pending transactions as well as the ones queued for future processing. -The `txpool` namespace are defined below. - -### `debug` Namespace -The debug API gives you access to several non-standard RPC methods, which will allow you to inspect, debug and set certain debugging flags during runtime. -The `debug` namespace definitions are coming soon. - -## Methods - -🚧 Full list of Methods Coming Soon 🚧 diff --git a/docs/md/key-management.mdx b/docs/md/key-management.mdx deleted file mode 100644 index cb4e882a43..0000000000 --- a/docs/md/key-management.mdx +++ /dev/null @@ -1,93 +0,0 @@ -# Key Management - -## Create a new Key -`polard keys add ` - -This key will return a 24 word [mnemonic phrase](https://coinmarketcap.com/alexandria/glossary/mnemonic-phrase) - -```sh -polard keys add test_key - -- address: polaris17l03ze40e9spskexcj928fuy94yxa4dy0t3vx0 - name: test_key - pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AlvTkLacqevyNZ6hl8ZqhWSzQDppseR07qthbNOsy+nz"}' - type: local - - -**Important** write this mnemonic phrase in a safe place. -It is the only way to recover your account if you ever forget your password. - -nature canvas unusual drill vault ethics sunny problem enact exile tank horn husband wagon town churn piano flip laptop lava pulp void pencil emotion -``` -## Restore Existing key -`polard keys add --recover` - -This will prompt you for your 24 word mnemonic phrase. - -```sh -polard keys add test_key_recover --recover -> Enter your bip39 mnemonic -``` -## List your keys - -`polard keys list` - -Lists all the public keys under your storage path - -```sh -polard keys list -Successfully migrated key validator.info. -- address: polaris17l03ze40e9spskexcj928fuy94yxa4dy0t3vx0 - name: test_key - pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AlvTkLacqevyNZ6hl8ZqhWSzQDppseR07qthbNOsy+nz"}' - type: local -- address: polaris1t6m9ug59cg9yg2cy2hfx40ew4jyj9w0m9rgmlg - name: validator - pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AueTD51sd3KDEJ3qvJVq5bxrHdfg87Tu2C8eOq51Imyi"}' - type: local -``` - -## Retrieve Key Information -`keys show ` - -This will return the public key and relevant information for the given key by name. - -```sh -polard keys show test_key -- address: polaris17l03ze40e9spskexcj928fuy94yxa4dy0t3vx0 - name: test_key - pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AlvTkLacqevyNZ6hl8ZqhWSzQDppseR07qthbNOsy+nz"}' - type: local -```` - -## Delete a Key - -`keys delete ` - -This will delete the key from your storage. - -```sh -polard keys delete test_key - -Key reference will be deleted. Continue? [y/N]: y -Key deleted forever (uh oh!) -```` - -## Exporting Private keys - -`keys export ` - -This will export the private key for the given key by name. - -```sh -polard keys export test_key - -Enter passphrase to encrypt the exported key: ------BEGIN TENDERMINT PRIVATE KEY----- -kdf: bcrypt -salt: 38ACD8DB969BB1287A2AD27DFAD5BCD2 -type: secp256k1 - - ------END TENDERMINT PRIVATE KEY----- -``` \ No newline at end of file diff --git a/docs/md/opcodes.mdx b/docs/md/opcodes.mdx deleted file mode 100644 index 131e543d49..0000000000 --- a/docs/md/opcodes.mdx +++ /dev/null @@ -1,201 +0,0 @@ -import { Callout } from 'nextra-theme-docs' - -# Opcodes -In Ethereum, opcodes are the fundamental building blocks of smart contracts. -They are essentially instructions that the Ethereum Virtual Machine (EVM) can execute. - -Each opcode has a unique identifier and a specific function. For example, the ADD -opcode is used to add two values together, while the MUL opcode is used to multiply -two values. There are also opcodes for comparing values (EQ, LT, GT, etc.), -manipulating the stack (PUSH, POP, etc.), and interacting with the blockchain -(SLOAD, SSTORE, BALANCE, etc.), among others. - -Ethereum opcodes are designed to be low-level and highly efficient, -allowing smart contracts to execute complex computations and operations -on the blockchain. However, they can also be complex to understand and -use, and incorrect use of opcodes can lead to errors and vulnerabilities -in smart contracts. - - - - - -All Ethereum opcodes are represented however the opcodes in **bold** are altered -from Ethereum. A short description is on the right hand side but a longer one -is denoted below. - - - -The original source of the below chart comes from the [Ethereum docs]. - - -[Ethereum docs]: https://ethereum.org/en/developers/docs/evm/opcodes/ - -| Stack | Name | Gas | Initial Stack | Resulting Stack | Mem / Storage | Notes | -|-------|----------------|-------------------------------------------------------------------------------------------------|--------------------------------------------------|---------------------------------|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| -| 00 | STOP | 0 | | | | alt execution | -| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | -| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | -| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | -| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | -| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | -| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | -| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | -| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | -| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | -| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | -| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | -| 0C-0F | _invalid_ | | | | | | -| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | -| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | -| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | -| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | -| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | -| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | -| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | -| 17 | OR | 3 | `a, b` | `a \ | \ | b` | | bitwise OR | -| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | -| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | -| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | -| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | -| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | -| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | -| 1E-1F | _invalid_ | | | | | | -| 20 | SHA3 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | -| 21-2F | _invalid_ | | | | | | -| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | -| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | -| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | -| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | -| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | -| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | -| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | -| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data | -| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | -| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copy executing contract's bytecode | -| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://github.com/ethereum/EIPs/blob/0341984ff14c8ce398f6d2b3e009c07cd99df8eb/EIPS/eip-1559.md#gasprice) | -| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | -| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from `addr` | -| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | -| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | -| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | -| 40 | **BLOCKHASH** | 20 | `blockNum` | `blockHash(blockNum)` | | hash = `sha256(0x0, chain_id, evm_account_id, block_height)` | -| 41 | **COINBASE** | 2 | `.` | `block.coinbase` | | (2^256-1) `0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff` | -| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp of current block | -| 43 | NUMBER | 2 | `.` | `block.number` | | number of current block | -| 44 | **DIFFICULTY** | 2 | `.` | `block.difficulty` | | returns 0 | -| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | (2^256-1) `0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff` | -| 46 | CHAINID | 2 | `.` | `chain_id` | | push current [chain id](https://eips.ethereum.org/EIPS/eip-155) onto stack | -| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | balance of executing contract, in wei | -| 48 | BASEFEE | 2 | `.` | `block.basefee` | | base fee of current block | -| 49-4F | _invalid_ | | | | | | -| 50 | POP | 2 | `_anon` | `.` | | remove item from top of stack and discard it | -| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | read word from memory at offset `ost` | -| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | write a word to memory | -| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | write a single byte to memory | -| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | read word from storage | -| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | write word to storage | -| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` mark that `pc` is only assigned if `dst` is a valid jumpdest | -| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | -| 58 | PC | 2 | `.` | `$pc` | | program counter | -| 59 | MSIZE | 2 | `.` | `len(mem)` | | size of memory in current execution context, in bytes | -| 5A | GAS | 2 | `.` | `gasRemaining` | | | -| 5B | JUMPDEST | 1 | | | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | -| 5C-5F | _invalid_ | | | | | | -| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | -| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | -| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | -| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | -| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | -| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | -| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | -| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | -| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | -| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | -| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | -| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | -| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | -| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | -| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | -| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | -| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | -| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | -| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | -| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | -| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | -| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | -| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | -| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | -| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | -| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | -| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | -| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | -| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | -| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | -| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | -| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | -| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | -| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | -| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | -| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | -| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | -| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | -| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | -| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | -| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | -| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | -| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | -| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | -| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | -| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | -| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | -| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | -| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | -| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | -| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | -| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | -| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | -| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | -| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | -| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | -| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | -| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | -| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | -| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | -| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG1(memory[ost:ost+len-1], topic0, topic1) | -| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG1(memory[ost:ost+len-1], topic0, topic1, topic2) | -| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG1(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | -| A5-EF | _invalid_ | | | | | | -| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | -| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value | -| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len-1] | -| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | -| F6-F9 | _invalid_ | | | | | | -| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| FB-FC | _invalid_ | | | | | | -| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | -| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | -| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | destroy contract and sends all funds to `addr` | - -## Differences - -### `BLOCKHASH` - -This opcode returns the block hash of the "ethereum" block and not the block hash of the host chain. - -### `COINBASE` - -This opcode returns the address of the "fee collector", which depending on the host chain may be either the block author or the miner. -In the Cosmos-SDK intergration of Polaris Ethereum, it is the ModuleAddress of the FeeCollectorAccount. - -### `DIFFICULTY` - -This opcode always returns 69. diff --git a/docs/md/precompile-cosmos-overview.mdx b/docs/md/precompile-cosmos-overview.mdx deleted file mode 100644 index c80a43a2cd..0000000000 --- a/docs/md/precompile-cosmos-overview.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# Precompiles - -## Stateful Precompile information - -A Stateful Precompile is a precompiled contract that can alter chain state. - -| Precompile Contract | Contract Address | Solidity Interface | Associated Module | -| :----------------------------- | :------------------------------------------- | :------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------- | --- | ------------------------------------------------------- | -| Staking Precompile | `0xd9A998CaC66092748FfEc7cFBD155Aae1737C2fF` | [Staking.sol](https://github.com/berachain/polaris/blob/main/contracts/src/cosmos/precompile/Staking.sol) | [Staking Module](https://docs.cosmos.network/v0.47/modules/staking) | | [Ethereum Multicall](https://github.com/mds1/multicall) | -| Bank Precompile | `0x4381dC2aB14285160c808659aEe005D51255adD7` | [Bank.sol](https://github.com/berachain/polaris/blob/main/contracts/src/cosmos/precompile/Bank.sol) | [Bank Module](https://docs.cosmos.network/v0.47/modules/bank) | -| Governance Module Precompile | `0x7b5Fe22B5446f7C62Ea27B8BD71CeF94e03f3dF2` | [Governance.sol](https://github.com/berachain/polaris/blob/main/contracts/src/cosmos/precompile/Governance.sol) | [Governance Module](https://docs.cosmos.network/v0.47/modules/gov) | -| Distribution Module Precompile | `0x0000000000000000000000000000000000000069` | [Distribution.sol](https://github.com/berachain/polaris/blob/main/contracts/src/cosmos/precompile/Distribution.sol) | [Distribution Module](https://docs.cosmos.network/v0.47/modules/distribution) | -| ERC20 Module Precompile | `0x0000000000000000000000000000000000696969` | [ERC20Module.sol](https://github.com/berachain/polaris/blob/main/contracts/src/cosmos/precompile/ERC20Module.sol) | [ERC20 Module](./erc20-middleware) | - -## Stateful Precompile ABI Generation - -In order to generate the default stateful precompile ABIs -You must first clone the [Polaris Ethereum repository](https://github.com/berachain/polaris). - -You can now run the following command to generate the ABIs: - -`make generate` - -The ABI files can be found in the `precompile/contracts/solidity/out` directory. The generated files -can be found in the `precompile/contracts/solidity/generated` directory. diff --git a/docs/md/precompile-overview.mdx b/docs/md/precompile-overview.mdx deleted file mode 100644 index 6db3601867..0000000000 --- a/docs/md/precompile-overview.mdx +++ /dev/null @@ -1,25 +0,0 @@ -# Precompiles - -This section provides useful information about the default set of precompiles in the Ethereum Virtual Machine (EVM). If you're interested in creating your own custom precompiles, you can check out the -[Creating Custom Precompiles](./building-precompiles/creating-custom-precompiles) section for tutorials and information. It's important to note that a precompile in the EVM doesn't necessarily need to have an associated Cosmos module. Precompiles -can be used to access anything that's implemented on the node, but the most common use case is to use precompiles to access Cosmos modules. - -## Default Ethereum Precompile Information - -Information below is from [evm.codes](https://www.evm.codes/precompiled). - -| Address | Name | Minimum Gas | Input | Output | Description | -|-----------------------------------------------------------------------|--------------------------|-------------|---------------------------------|-----------------|---------------------------------------------------------------------------------| -| [0x01]() | ecRecover | 3000 | `hash, v, r, s` | `publicAddress` | Elliptic curve digital signature algorithm (ECDSA) public key recovery function | -| [0x02]() | SHA2-256 | 60 | `data` | `hash` | Hash function | -| [0x03]() | RIPEMD-160 | 600 | `data` | `hash` | Hash function | -| [0x04]() | identity | 15 | `data` | `data` | Returns the input | -| [0x05]() | modexp | 200 | `Bsize, Esize, Msize, B, E, M` | `value` | Arbitrary-precision exponentiation under modulo | -| [0x06]() | ecAdd | 150 | `x1, y1, x2, y2` | `x, y` | Point addition (ADD) on the elliptic curve `alt_bn128` | -| [0x07]() | ecMul | 6000 | `x1, y1, s` | `x, y` | Scalar multiplication (MUL) on the elliptic curve `alt_bn128` | -| [0x08]() | ecPairing | 45000 | `x1, y1, x2, y2, ..., xk, yk` | `success` | Bilinear function on groups on the elliptic curve `alt_bn128` | -| [0x09]() | blake2f | 0 | `rounds, h, m, t, f` | `h` | Compression function F used in the BLAKE2 cryptographic hashing algorithm | - -## Interacting With Precompile Contracts -To interact with a precompile contract, you must use the Ethereum Virtual Machine (EVM). The EVM is the only way to access precompiles. If you're interested in learning more about how to interact with precompiles, you can check out the [Interacting With Precompiles](./for-solidity-devs/developer-overview#interacting-with-stateful-precompiles) section for more information. - diff --git a/docs/md/running-a-node/_meta.json b/docs/md/running-a-node/_meta.json deleted file mode 100644 index 3faa059b8a..0000000000 --- a/docs/md/running-a-node/_meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "running-locally": "Local Machine", - "running-locally-docker": "Docker", - "running-on-aws": "AWS", - "running-on-azure": "Azure", - "running-on-gcp": "GCP" - -} \ No newline at end of file diff --git a/docs/md/running-a-node/running-locally-docker.mdx b/docs/md/running-a-node/running-locally-docker.mdx deleted file mode 100644 index feaf969a22..0000000000 --- a/docs/md/running-a-node/running-locally-docker.mdx +++ /dev/null @@ -1,53 +0,0 @@ -## Running a Polaris Ethereum Cosmos-SDK with Docker - -
    - -### From docker container artifactory - -The easiest way to run the node in a docker container is to use a pre-built container image. You can find the images in the [container regsitry]() (Coming Soon). - -### From container image - -1. Install Docker on your machine from the [official website](https://docs.docker.com/get-docker/) - - Verify it's installed - - ```sh - docker version - ``` - - If not installed, verify that the path is set correctly and docker daemon is running in background - -2. Pull the docker image - - You can point to the release image. Referring to `latest` in this case - - ```sh - docker image pull /polaris:latest> - ``` - - Note: Might have to use different docker image for different OS - -3. Run the container image - - ```sh - docker run -p 1317:1317 /polaris:latest> - ``` - -Now you have a node running on your machine with a default chain and we have RPC running on port `1317` and path `eth/rpc`. To verify, -you can try `eth_blockNumber` JSON-RPC example below - - -```sh -curl -X POST 127.0.0.1:1317/eth/rpc -H 'Content-Type: application/json' -d '{ "jsonrpc":"2.0", "method":"eth_blockNumber", "params":[], "id":1}' -``` - -A successful JSON RPC query will return in following - - -```sh -{ - "jsonrpc": "2.0", - "id": 1, - "result": "" -} -``` -
    diff --git a/docs/md/running-a-node/running-locally.mdx b/docs/md/running-a-node/running-locally.mdx deleted file mode 100644 index 5770d8c270..0000000000 --- a/docs/md/running-a-node/running-locally.mdx +++ /dev/null @@ -1,98 +0,0 @@ -## Running a Local Polaris Ethereum Cosmos-SDK Chain - -
    -## Running a Local Polaris Ethereum Cosmos-SDK Chain - -### From Binary - -The easiest way to install a Cosmos-SDK Blockchain running Polaris Ethereum is to download a pre-built binary. You can find the latest binaries on the [releases](https://github.com/berachain/polaris/releases) page. - -### From Source - -**Step 1: Install Golang & Foundry** - -Go v1.20+ or higher is required for Polaris Ethereum - -1. Install [go 1.21+ from the official site](https://go.dev/dl/) or the method of your choice. Ensure that your `GOPATH` and `GOBIN` environment variables are properly set up by using the following commands: - - For Ubuntu: - - ```sh - cd $HOME - sudo apt-get install golang -y - export PATH=$PATH:/usr/local/go/bin - export PATH=$PATH:$(go env GOPATH)/bin - ``` - - For Mac: - - ```sh - cd $HOME - brew install go - export PATH=$PATH:/opt/homebrew/bin/go - export PATH=$PATH:$(go env GOPATH)/bin - ``` - -2. Confirm your Go installation by checking the version: - - ```sh - go version - ``` - -[Foundry](https://book.getfoundry.sh/getting-started/installation) is required for Polaris Ethereum - -3. Install Foundry: - - ```sh - curl -L https://foundry.paradigm.xyz | bash - ``` - -**Step 2: Get Polaris Ethereum source code** - -Clone the `polaris` repo from the [official repo](https://github.com/berachain/polaris/) and check -out the `main` branch for the latest stable release. -Build the binary. - -```bash -cd $HOME -git clone https://github.com/berachain/polaris -cd polaris -git checkout main -``` - -**Step 3: Build the Node Software** - -Run the following command to install `polard` to your `GOPATH` and build the node. `polard` is the node daemon and CLI for interacting with a polaris node. - -```bash -make install -``` - -**Step 4: Verify your installation** - -Verify your installation with the following command: - -```bash -polard version --long -``` - -A successful installation will return the following: - -```bash -name: berachain -server_name: polard -version: -commit: -build_tags: netgo,ledger -go: go version go1.21.1 darwin/amd64 -``` - -## Running a Local Network - -After ensuring dependencies are installed correctly, run the following command to start a local development network. - -```bash -make start -``` - -
    diff --git a/docs/md/running-a-node/running-on-aws.mdx b/docs/md/running-a-node/running-on-aws.mdx deleted file mode 100644 index b70edf9c74..0000000000 --- a/docs/md/running-a-node/running-on-aws.mdx +++ /dev/null @@ -1,206 +0,0 @@ -## Running a Polaris Ethereum Cosmos-SDK Chain on AWS - -The recommended way to run fault tolerant nodes that can scale to millions of requests per second would be -with orchestration tool like [Kubernetes](https://kubernetes.io/docs/tutorials/kubernetes-basics/). Another option is to run the node on an [EC2](https://aws.amazon.com/pm/ec2/) instance. - -AWS offers [Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/) which is a managed service to run Kubernetes in the cloud -It allows us to run lightweight pods in which you can deploy container images. On a failure, a new container automatically comes up. Each pod -can also be attached to a volume that can provide elastic disk storage. It also allows us to scale horizontally by adding more nodes/pods/containers on demand to the network. - -
    - -## Example EKS architecture - -Currently, the application runs in 1 container so we can deploy 1 container in each pod. Pod is the smallest resource that -Kubernetes can manage. It can have 1 or more than 1 containers. - -Before we can set up pods, we need to set up our EKS cluster - - -### Install AWS CLI and configure AWS Credentials - -1. Install AWS CLI for your local machine from [docs](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) - -2. Configure CLI credentials from [docs](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) - -3. Verify credentials and installation - - ```sh - aws sts get-caller-identity - ``` - - It should return the following - - - ```sh - { - "Account": "123456789012", - "UserId": "AR#####:#####", - "Arn": "arn:aws:sts::123456789012:assumed-role/role-name/role-session-name" - } - ``` - -### Install eksctl and kubectl - -`eksctl` allows us to manage our EKS cluster and `kubectl` allows us to manage kubernetes resources. - -1. Install `eksctl` from [docs](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html) - -2. Verify installation - - ```sh - eksctl version - ``` - -3. Install `kubectl` from [docs](https://kubernetes.io/docs/tasks/tools/) - -4. Verify installation - - ```sh - kubectl version - ``` - -### Set up EKS cluster - -EKS is a managed Kubernetes cluster and AWS will manage our nodes for us. Clusters can also have controllers/add-ons -that help control and incorporate cloud specific resources - -1. We can create a sample cluster by using following command - - - `eksctl create cluster --name my-cluster --region region-code` - - Note: you need to provide a cluster name and AWS region (Ex. `us-west-2`) - - This will create managed default AWS nodes for you to deploy your workloads. You can change the type of workload as well. ekstcl will also create a kubectl config file at `~/.kube` - -2. Setup AWS load balancer controller from [docs](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html). This will help kubernetes manage our AWS load balancer. - -### View Kubernetes resources - -1. View your cluster nodes (which were deployed by eksctl) - - `kubectl get nodes -o wide` - - The response will be as follows - - - ``` - NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME - ip-192-168-3-224.us-west-2.compute.internal Ready 45h v1.24.10-eks-48e63af 192.168.3.224 192.168.3.224 Amazon Linux 2 5.10.165-143.735.amzn2.x86_64 containerd://1.6.6 - ip-192-168-36-235.us-west-2.compute.internal Ready 45h v1.24.10-eks-48e63af 192.168.36.235 192.168.36.235 Amazon Linux 2 5.10.165-143.735.amzn2.x86_64 containerd://1.6.6 - ``` - -### Create kubernetes resources - - Kubernetes allows us to deploy a few types of `workloads` and `services`. Workloads control the pods and Services control the access to the pod. - For our simple case, we will use workload of type `Deployment` and service of type `LoadBalancer`. Our container is deployed inside the pod. - More information can be found in [docs](https://kubernetes.io/docs/concepts/workloads/) - -1. Setup namespace - - Namespaces ensure that we can use the same cluster to deploy multiple types of applications. We will create a namespace `testnet` for our chain - - ```sh - kubectl create namespace testnet - ``` - -1. Create Deployment - -For our deployment, we would create a `deployment.yaml `file which looks something like this -- - - ```yaml - apiVersion: apps/v1 - kind: Deployment - metadata: - name: node - namespace: testnet - spec: - replicas: 1 - selector: - matchLabels: - app: node - template: - metadata: - labels: - app: node - spec: - containers: - - name: node - image: / - ports: - - name: apphttp - containerPort: 1317 - - name: tendermintgrpc - containerPort: 9090 - - name: tendermintrpc - containerPort: 26657 - - name: tendermintpp - containerPort: 26656 - - ``` - We are creating a pod with 1 replica and it has 1 container. The container is created using the image tag. - - For more information on `deployments`, refer to this [doc](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) - -2. Create Service - -For our service, as we want our node to be accessed from the public internet, we will create it as a `LoadBalancer`. It will create an AWS Network Load Balancer (NLB) - - ```yaml - apiVersion: v1 - kind: Service - metadata: - name: node-nlb - namespace: testnet - annotations: - service.beta.kubernetes.io/aws-load-balancer-type: external - service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip - service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing - spec: - ports: - - name: apphttp - port: 80 - targetPort: 1317 - protocol: TCP - - name: tenderpmintrpc - port: 26657 - targetPort: 26657 - protocol: TCP - - name: tendermintpp - port: 26656 - targetPort: 26656 - protocol: TCP - - name: tendermintgrpc - port: 9090 - targetPort: 9090 - protocol: TCP - type: LoadBalancer - selector: - app: node - ``` - We are creating a service of type `LoadBalancer`. This will create a public load balancer and will route requests received on port `80` - to port `1317` where we are running our JSON RPC server. - -3. Verify workload and service - - We should validate that the resources are set up as expected. You can verify running pods by following - - - ```sh - kubectl get pods -n testnet -o wide - ``` - - The expected status should be `RUNNING` for the pod - - You can verify that the service is running by following - - - ```sh - kubectl get services -n testnet - ``` - - You should also verify in AWS console if the Network Load Balancer has been provisioned - -4. Test RPC endpoints - - You can test the public rpc endpoint by getting the NLB URL - - ```sh - curl -X POST /eth/rpc -H 'Content-Type: application/json' -d '{ "jsonrpc":"2.0", "method":"eth_blockNumber", "params":[], "id":1}' - ``` -
    diff --git a/docs/md/running-a-node/running-on-azure.mdx b/docs/md/running-a-node/running-on-azure.mdx deleted file mode 100644 index 98c61b1a98..0000000000 --- a/docs/md/running-a-node/running-on-azure.mdx +++ /dev/null @@ -1,3 +0,0 @@ -## Running Polaris Ethereum On Azure - -### Coming soon \ No newline at end of file diff --git a/docs/md/running-a-node/running-on-gcp.mdx b/docs/md/running-a-node/running-on-gcp.mdx deleted file mode 100644 index d0a169cfc2..0000000000 --- a/docs/md/running-a-node/running-on-gcp.mdx +++ /dev/null @@ -1,3 +0,0 @@ -## Running Polaris Ethereum On Google Cloud Platform(GCP) - -### Coming soon diff --git a/docs/md/system-config.mdx b/docs/md/system-config.mdx deleted file mode 100644 index b3c6ff794a..0000000000 --- a/docs/md/system-config.mdx +++ /dev/null @@ -1,45 +0,0 @@ -import { Callout } from "nextra-theme-docs"; - -# System Configuration - - -This guide has been tested against MacOS & Linux distributions only. To ensure a successful production environment setup, consider using one of these options. - - - -The hardware requirements for running Polaris Ethereum depend upon the node configuration and can change over time as upgrades to the network are implemented. - -## Hardware Requirements - -This system spec has been tested by many users and validators and found to be comfortable in a public environment: - -- Quad Core or larger amd64 or arm64 CPU. -- 64GB RAM (A lot can be in swap) -- 1TB NVMe Storage -- 100MBPS bidirectional internet connection - -You can run Polaris Ethereum on lower-spec hardware for each component, but you may find that it is not highly performant or prone to crashing. - -## Commonly used ports - -`polard` uses the following TCP ports. Toggle their settings to match your environment. - -Most validators will only need to open the following port: - -- `26656`: The default port for the P2P protocol. This port is used to communicate with other nodes and must be open to join a network. However, it does not have to be open to the public. - -Additional ports: - -- `1317`: The default port for the Lite Client Daemon (LCD). The LCD provides an HTTP RESTful API layer to allow applications and services to interact with your polard instance through RPC. You don't need to open this port unless you have use for it. - -- `8545`: This port hosts the Ethereum JSON-RPC Server. - -- `26660`: The default port for interacting with the [Prometheus](https://prometheus.io) database, which can be used to monitor the environment. In the default configuration, this port is not open. - -- `26657`: The default port for the RPC protocol. Because this port is used for querying and sending transactions, it must be open for serving queries from polard. - - - -Do not open port `26657` to the public unless you plan to run a public node. - - diff --git a/docs/md/tracing.mdx b/docs/md/tracing.mdx deleted file mode 100644 index 0825bb5f35..0000000000 --- a/docs/md/tracing.mdx +++ /dev/null @@ -1,59 +0,0 @@ -import { Callout } from 'nextra-theme-docs' - -# EVM Tracing - -Tracing allows users to examine precisely what was executed by the EVM during some specific event or in the course of a set of transactions. -There are two different types of transactions in the Polaris Ethereum EVM: value transfers and contract executions. A value transfer simply moves -the base token from one account to another. Whereas a contract interaction executes code stored at a contract address which can include altering -stored data and transacting multiple times with other contracts and externally-owned accounts. A contract execution transaction can -therefore be a complicated web of interactions that can be difficult to unpick. The transaction receipt contains a status code that -shows whether the transaction succeeded or failed, but more detailed information is not readily available, meaning it is very difficult -to know what a contract execution actually did, what data was modified and which addresses were touched. This is the problem that EVM -tracing solves. Polaris Ethereum's interface traces transactions by re-running them locally and collecting data about precisely what was executed by the EVM. - -## State Availability - -In its simplest form, tracing a transaction entails requesting the Polaris Ethereum node to reexecute the desired transaction with -varying degrees of data collection and have it return an aggregated summary. In order for a Polaris Ethereum node to reexecute a transaction, -all historical state accessed by the transaction must be available. - -By Default, all Polaris Ethereum nodes are archival nodes. -It is possible to run a Polaris Ethereum light client but for EVM tracing, a full node is required. - - -An archive node retains all historical data back to genesis. It can therefore trace arbitrary transactions at any point in the history of the chain. Tracing a single transaction requires reexecuting all preceding transactions in the same block. - - - -## Types of Tracing - - - -### Basic Traces - -Polaris Ethereum has the ability to produce basic transaction traces in the form of raw EVM opcode traces. These traces contain detailed information about every EVM instruction executed during a transaction, -such as the opcode name, cost, program counter, remaining gas, error (if any), and execution depth. Additionally, the structured logs can -include the content of the execution stack, memory, and contract storage, if desired. Example [Coming Soon](). - -### Built-in Tracers - -The tracing API of Polaris Ethereum allows the user to specify a tracer parameter, -which determines how the data returned from the API call should be processed. -If the tracer parameter is not provided, the default tracer (the struct logger) -is used. While the default tracer produces raw opcode traces, they can be -cumbersome and difficult to read for many use cases, and can also be quite -resource-intensive to process. To address these issues, Polaris Ethereum includes -a set of non-default built-in tracers that can be specified in the API -call to return different types of data. These built-in tracers are Go functions -that perform specific preprocessing on the trace data -before returning it. Example [Coming Soon](). - -### Custom Tracers - -Besides the built-in tracers, Polaris Ethereum also allows users to create custom tracers -that can process and return data from events in the EVM in a more convenient format. -These custom tracers can be written in either Javascript or Go. Javascript tracers are -suitable for quick prototyping, experimentation, and less resource-intensive applications. -In contrast, Go tracers offer better performance, but require compilation with the Geth -source code. Using custom tracers enables developers to collect only the necessary data -and perform any processing directly at the source. Examples [Coming Soon](). diff --git a/docs/md/using-metamask.mdx b/docs/md/using-metamask.mdx deleted file mode 100644 index f94e1ebb8f..0000000000 --- a/docs/md/using-metamask.mdx +++ /dev/null @@ -1,48 +0,0 @@ -import { Callout } from "nextra-theme-docs"; - -# Using Metamask With Polaris Ethereum - -In this section, we will guide you through the process of -downloading Metamask and connecting it to a local Polaris Ethereum node. -Before proceeding, please ensure that you have a local node up and running. -If you need help with this, you can refer to the [Local Machine](./running-a-node/running-locally) section for instructions. - -To begin, you will need to download and install the Metamask browser extension. -Once installed, you can then connect your Injected Metamask to your local Polaris Ethereum -node by following the steps provided in this section. - - - Take note of your private key and keep it somewhere safe. click - [here](https://learn.metamask.io/lessons/what-is-a-self-custody-wallet) to - learn about self custody. - - -## Downloading And Installing Metamask - -You can download and install the Metamask browser extension [here](https://metamask.io/download/). - -## Adding Polaris Ethereum Local Network - -Click on the MetaMask icon on the browser and select the network drop-down menu. Here we should connect to C-Chain. Click to "Custom RPC". - -![](/metamask-add-network.png) - -Now, we need to input the following values/ - -- Network Name: `Polaris Ethereum` -- New RPC URL: `http://localhost:8545` -- Chain ID: `2061` -- Symbol(optional): `BERA` -- Block Explorer URL (optional): `` - -Click `Save` - -The Polaris Ethereum local environment is now available on your Metamask browser wallet. - -## Importing Default Private Keys - -Coming Soon. - -## Using the Faucet - -Coming Soon. From d49ee378fbbc872c18bb98ecc0595b7d0c14d428 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 19 Oct 2023 10:59:40 -0400 Subject: [PATCH 097/122] perf(comet): Eject the comet mempool on `ReCheckTx` to keep it clean (#1237) --- cosmos/lib/ante/eject.go | 53 +++++++++++++++++++++++++++++++++++++++ cosmos/runtime/runtime.go | 3 ++- cosmos/txpool/mempool.go | 2 +- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 cosmos/lib/ante/eject.go diff --git a/cosmos/lib/ante/eject.go b/cosmos/lib/ante/eject.go new file mode 100644 index 0000000000..a1d4affd10 --- /dev/null +++ b/cosmos/lib/ante/eject.go @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package ante + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// NewAnteHandler creates a new instance of AnteHandler with EjectOnRecheckTxDecorator. +func NewAnteHandler() sdk.AnteHandler { + anteDecorators := []sdk.AnteDecorator{ + &EjectOnRecheckTxDecorator{}, + } + + return sdk.ChainAnteDecorators(anteDecorators...) +} + +// EjectOnRecheckTxDecorator will return an error if the context is a recheck tx. +// This is used to forcibly eject transactions from the CometBFT mempool after they +// have been passed down to the application, as we want to prevent the comet mempool +// from growing in size. +type EjectOnRecheckTxDecorator struct{} + +// Antehandle implements sdk.AnteHandler. +func (EjectOnRecheckTxDecorator) AnteHandle( + ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, +) (sdk.Context, error) { + if ctx.ExecMode() == sdk.ExecModeReCheck { + return ctx, fmt.Errorf("recheck tx") + } + + return next(ctx, tx, simulate) +} diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 76f82bbd43..9731c97f23 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" + antelib "pkg.berachain.dev/polaris/cosmos/lib/ante" libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" "pkg.berachain.dev/polaris/cosmos/runtime/comet" @@ -107,7 +108,7 @@ func (p *Polaris) Build(app CosmosApp, ek EVMKeeper) error { } // Set the ante handler to nil, since it is not needed. - app.SetAnteHandler(nil) + app.SetAnteHandler(antelib.NewAnteHandler()) return nil } diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index a0b9e83895..a3039799e5 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -99,7 +99,7 @@ func (m *Mempool) Insert(ctx context.Context, sdkTx sdk.Tx) error { []*coretypes.Transaction{wet.Unwrap()}, false, false, ); len(errs) != 0 { // Handle case where a node broadcasts to itself, we don't want it to fail CheckTx. - if errors.Is(errs[0], legacypool.ErrAlreadyKnown) && sCtx.IsCheckTx() { + if errors.Is(errs[0], legacypool.ErrAlreadyKnown) && sCtx.ExecMode() == sdk.ExecModeCheck { return nil } return errs[0] From 96105b7d97c092303550defd2f068ef517d0209c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 20 Oct 2023 14:03:26 -0400 Subject: [PATCH 098/122] state plugin bug --- eth/core/chain.go | 1 - 1 file changed, 1 deletion(-) diff --git a/eth/core/chain.go b/eth/core/chain.go index c3e6f68078..f768fb0a3c 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -150,7 +150,6 @@ func (bc *blockchain) LoadLastState(ctx context.Context, number uint64) error { } func (bc *blockchain) PreparePlugins(ctx context.Context) { - bc.sp.Prepare(ctx) bc.sp.Reset(ctx) bc.bp.Prepare(ctx) if bc.hp != nil { From 4791ffdce3781c40650abd3a6d35cb447038cbc2 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 20 Oct 2023 14:07:10 -0400 Subject: [PATCH 099/122] fix(mempool): Remove from mempool after a while (#1239) --- cosmos/lib/ante/eject.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/cosmos/lib/ante/eject.go b/cosmos/lib/ante/eject.go index a1d4affd10..1b2f189206 100644 --- a/cosmos/lib/ante/eject.go +++ b/cosmos/lib/ante/eject.go @@ -21,15 +21,21 @@ package ante import ( - "fmt" + "errors" sdk "github.com/cosmos/cosmos-sdk/types" + + "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/common" + "pkg.berachain.dev/polaris/lib/utils" ) // NewAnteHandler creates a new instance of AnteHandler with EjectOnRecheckTxDecorator. func NewAnteHandler() sdk.AnteHandler { anteDecorators := []sdk.AnteDecorator{ - &EjectOnRecheckTxDecorator{}, + &EjectOnRecheckTxDecorator{ + seen: make(map[common.Hash]uint64), + }, } return sdk.ChainAnteDecorators(anteDecorators...) @@ -39,14 +45,22 @@ func NewAnteHandler() sdk.AnteHandler { // This is used to forcibly eject transactions from the CometBFT mempool after they // have been passed down to the application, as we want to prevent the comet mempool // from growing in size. -type EjectOnRecheckTxDecorator struct{} +type EjectOnRecheckTxDecorator struct { + seen map[common.Hash]uint64 +} // Antehandle implements sdk.AnteHandler. -func (EjectOnRecheckTxDecorator) AnteHandle( +func (e *EjectOnRecheckTxDecorator) AnteHandle( ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, ) (sdk.Context, error) { - if ctx.ExecMode() == sdk.ExecModeReCheck { - return ctx, fmt.Errorf("recheck tx") + msgs := tx.GetMsgs() + if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { + hash := wet.Unwrap().Hash() + e.seen[hash]++ + if e.seen[hash] > 50 { //nolint:gomnd // temp fix. + delete(e.seen, hash) // prevent leak + return ctx, errors.New("recheck tx") + } } return next(ctx, tx, simulate) From 63e653f99c805918630cc36b4f9b835c395de36c Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 20 Oct 2023 14:30:11 -0400 Subject: [PATCH 100/122] fix(statedb): fix query regression --- cosmos/x/evm/plugins/state/plugin.go | 6 +++--- eth/core/chain.go | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 8b10912944..a0cc0647dd 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -114,7 +114,7 @@ type plugin struct { mu sync.Mutex - latestState sdk.Context + latestState *sdk.Context } // NewPlugin returns a plugin with the given context and keepers. @@ -141,7 +141,8 @@ func (p *plugin) SetPrecompileLogFactory(plf events.PrecompileLogFactory) { // Prepare sets up the context on the state plugin for use in JSON-RPC calls. // Prepare implements `core.StatePlugin`. func (p *plugin) Prepare(ctx context.Context) { - p.latestState = sdk.UnwrapSDKContext(ctx) + sCtx := sdk.UnwrapSDKContext(ctx) + p.latestState = &sCtx } // Reset sets up the state plugin for execution of a new transaction. It sets up the snapshottable @@ -150,7 +151,6 @@ func (p *plugin) Prepare(ctx context.Context) { // Reset implements `core.StatePlugin`. func (p *plugin) Reset(ctx context.Context) { sdkCtx := sdk.UnwrapSDKContext(ctx) - // We have to build a custom `SnapMulti` to use with the StateDB. This is because the // ethereum utilizes the concept of snapshots, whereas the current implementation of the // Cosmos-SDK `CacheKV` uses "wraps". diff --git a/eth/core/chain.go b/eth/core/chain.go index f768fb0a3c..f419e17ff8 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -145,6 +145,7 @@ func NewChain( func (bc *blockchain) LoadLastState(ctx context.Context, number uint64) error { // ctx here is the one created from app.CommitMultistore(). bc.PreparePlugins(ctx) + bc.sp.Prepare(ctx) return bc.loadLastState(number) } From 7d6dcdc933a3118cdfdfb02f832993a2925b3c6a Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 20 Oct 2023 14:30:58 -0400 Subject: [PATCH 101/122] fix(statedb): fix query regression --- cosmos/x/evm/plugins/state/plugin.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index a0cc0647dd..40b92858a0 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -527,7 +527,9 @@ func (p *plugin) IterateBalances(fn func(common.Address, *big.Int) bool) { // StateAtBlockNumber implements `core.StatePlugin`. func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { var ctx sdk.Context - + if p.latestState == nil { + p.latestState = &ctx + } // Ensure the query context function is set. if p.qfn == nil { return nil, errors.New("no query context function set in host chain") From b049e08de77924f9a30f8b65b7b3eb5bb77f1e21 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 20 Oct 2023 14:32:28 -0400 Subject: [PATCH 102/122] fix(statedb): fix query regression --- cosmos/x/evm/plugins/state/plugin.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 40b92858a0..5e7ca09a2f 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -114,7 +114,7 @@ type plugin struct { mu sync.Mutex - latestState *sdk.Context + latestState sdk.Context } // NewPlugin returns a plugin with the given context and keepers. @@ -141,8 +141,7 @@ func (p *plugin) SetPrecompileLogFactory(plf events.PrecompileLogFactory) { // Prepare sets up the context on the state plugin for use in JSON-RPC calls. // Prepare implements `core.StatePlugin`. func (p *plugin) Prepare(ctx context.Context) { - sCtx := sdk.UnwrapSDKContext(ctx) - p.latestState = &sCtx + p.latestState = sdk.UnwrapSDKContext(ctx) } // Reset sets up the state plugin for execution of a new transaction. It sets up the snapshottable @@ -527,9 +526,6 @@ func (p *plugin) IterateBalances(fn func(common.Address, *big.Int) bool) { // StateAtBlockNumber implements `core.StatePlugin`. func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { var ctx sdk.Context - if p.latestState == nil { - p.latestState = &ctx - } // Ensure the query context function is set. if p.qfn == nil { return nil, errors.New("no query context function set in host chain") From 4066dfb6a99f770a67978ecb1caf25e14f1494fa Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Fri, 20 Oct 2023 15:36:46 -0400 Subject: [PATCH 103/122] fix(gossip): setup context in ante handler --- cosmos/lib/ante/eject.go | 4 +++- e2e/testapp/polard/cmd/root.go | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cosmos/lib/ante/eject.go b/cosmos/lib/ante/eject.go index 1b2f189206..708c375168 100644 --- a/cosmos/lib/ante/eject.go +++ b/cosmos/lib/ante/eject.go @@ -24,6 +24,7 @@ import ( "errors" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/ante" "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth/common" @@ -33,6 +34,7 @@ import ( // NewAnteHandler creates a new instance of AnteHandler with EjectOnRecheckTxDecorator. func NewAnteHandler() sdk.AnteHandler { anteDecorators := []sdk.AnteDecorator{ + ante.NewSetUpContextDecorator(), &EjectOnRecheckTxDecorator{ seen: make(map[common.Hash]uint64), }, @@ -57,7 +59,7 @@ func (e *EjectOnRecheckTxDecorator) AnteHandle( if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { hash := wet.Unwrap().Hash() e.seen[hash]++ - if e.seen[hash] > 50 { //nolint:gomnd // temp fix. + if e.seen[hash] > 25 { //nolint:gomnd // temp fix. delete(e.seen, hash) // prevent leak return ctx, errors.New("recheck tx") } diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index 44e7a1fc88..d508e78d2c 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -175,8 +175,6 @@ func initCometBFTConfig() *cmtcfg.Config { consensus.TimeoutPrecommit = time.Second * 2 consensus.TimeoutCommit = time.Second * 2 - // Disable the indexer - cfg.TxIndex.Indexer = "null" return cfg } From 8a2aff3d91e8c40b07368c2734322a6a766a917a Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sat, 21 Oct 2023 03:03:20 -0400 Subject: [PATCH 104/122] fix(localnet): Fix race condition in test (#1241) --- e2e/localnet/network/fixture_test.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/e2e/localnet/network/fixture_test.go b/e2e/localnet/network/fixture_test.go index e5976e6796..8421c18b85 100644 --- a/e2e/localnet/network/fixture_test.go +++ b/e2e/localnet/network/fixture_test.go @@ -190,19 +190,29 @@ var _ = Describe("JSON RPC tests", func() { Expect(tf.WaitForNextBlock()).To(Succeed()) // send a transaction and make sure pending nonce is incremented - _, err = contract.ConsumeGas(tf.GenerateTransactOpts("alice"), big.NewInt(10000)) + var tx *coretypes.Transaction + tx, err = contract.ConsumeGas(tf.GenerateTransactOpts("alice"), big.NewInt(10000)) Expect(err).NotTo(HaveOccurred()) + + // Pending nonce should be 1 more than the current nonce alicePendingNonce, err := client.PendingNonceAt(context.Background(), tf.Address("alice")) Expect(err).NotTo(HaveOccurred()) Expect(alicePendingNonce).To(Equal(aliceCurrNonce + 1)) + + // The nonce on disk should still be equal to the nonce prior to the consume gas txn + // being included in a block. acn, err := client.NonceAt(context.Background(), tf.Address("alice"), nil) Expect(err).NotTo(HaveOccurred()) Expect(acn).To(Equal(aliceCurrNonce)) - Expect(tf.WaitForNextBlock()).To(Succeed()) + // Wait for block inclusion. + ExpectSuccessReceipt(client, tx) + // NonceAt and PendingNonce should be equal after inclusion aliceCurrNonce, err = client.NonceAt(context.Background(), tf.Address("alice"), nil) Expect(err).NotTo(HaveOccurred()) + alicePendingNonce, err = client.PendingNonceAt(context.Background(), tf.Address("alice")) + Expect(err).NotTo(HaveOccurred()) Expect(aliceCurrNonce).To(Equal(alicePendingNonce)) }) From 216cf48c4787748d3e60b77aeee097272edb094b Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Sun, 22 Oct 2023 17:06:35 -0400 Subject: [PATCH 105/122] fix(sdb): CreateAccount should check for existence before creating. (#1243) --- cosmos/x/evm/plugins/state/plugin.go | 5 ++++- e2e/testapp/docker/docker-compose.yml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 5e7ca09a2f..d82921440c 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -206,7 +206,10 @@ func (p *plugin) Finalize() { // CreateAccount implements the `StatePlugin` interface by creating a new account // in the account keeper. It will allow accounts to be overridden. func (p *plugin) CreateAccount(addr common.Address) { - acc := p.ak.NewAccountWithAddress(p.ctx, addr[:]) + acc := p.ak.GetAccount(p.ctx, addr[:]) + if acc == nil { + acc = p.ak.NewAccountWithAddress(p.ctx, addr[:]) + } // save the new account in the account keeper p.ak.SetAccount(p.ctx, acc) diff --git a/e2e/testapp/docker/docker-compose.yml b/e2e/testapp/docker/docker-compose.yml index 20c8d4be1e..7441b20e45 100644 --- a/e2e/testapp/docker/docker-compose.yml +++ b/e2e/testapp/docker/docker-compose.yml @@ -94,6 +94,7 @@ services: ipv4_address: 192.168.10.13 nginx: + depends_on: [ node0, node1, node2, node3 ] container_name: nginx image: nginx:latest ports: From 12f300b9fd39fdb8698d9bcd1fb7842f50e73559 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 23 Oct 2023 12:39:07 -0400 Subject: [PATCH 106/122] perf(handler): add retry logic to broadcasting to cometbft mempool (#1242) --- cosmos/txpool/handler.go | 82 ++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index 8c1c25dd21..916667f0c9 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -23,6 +23,7 @@ package txpool import ( "errors" "sync/atomic" + "time" "cosmossdk.io/log" @@ -36,7 +37,11 @@ import ( // txChanSize is the size of channel listening to NewTxsEvent. The number is referenced from the // size of tx pool. -const txChanSize = 4096 +const ( + txChanSize = 4096 + maxRetries = 5 + retryDelay = 50 * time.Millisecond +) // SdkTx is used to generate mocks. type SdkTx interface { @@ -64,6 +69,12 @@ type Subscription interface { event.Subscription } +// failedTx represents a transaction that failed to broadcast. +type failedTx struct { + tx *coretypes.Transaction + retries int +} + // handler listens for new insertions into the geth txpool and broadcasts them to the CometBFT // layer for p2p and ABCI. type handler struct { @@ -78,6 +89,9 @@ type handler struct { stopCh chan struct{} txsSub Subscription running atomic.Bool + + // Queue for failed transactions + failedTxs chan *failedTx } // newHandler creates a new handler. @@ -91,6 +105,7 @@ func newHandler( txPool: txPool, txsCh: make(chan core.NewTxsEvent, txChanSize), stopCh: make(chan struct{}), + failedTxs: make(chan *failedTx, txChanSize), } return h } @@ -100,7 +115,8 @@ func (h *handler) Start() error { if h.running.Load() { return errors.New("handler already started") } - go h.eventLoop() + go h.mainLoop() + go h.failedLoop() // Start the retry policy return nil } @@ -109,17 +125,19 @@ func (h *handler) Stop() error { if !h.Running() { return errors.New("handler already stopped") } + + // Push two stop signals to the stop channel to ensure that both loops stop. + h.stopCh <- struct{}{} h.stopCh <- struct{}{} return nil } // start handles the subscription to the txpool and broadcasts transactions. -func (h *handler) eventLoop() { +func (h *handler) mainLoop() { // Connect to the subscription. h.txsSub = h.txPool.SubscribeNewTxsEvent(h.txsCh) h.logger.With("module", "txpool-handler").Info("starting txpool handler") h.running.Store(true) - // Handle events. var err error for { @@ -135,6 +153,25 @@ func (h *handler) eventLoop() { } } +// failedLoop will periodically attempt to re-broadcast failed transactions. +func (h *handler) failedLoop() { + for { + select { + case <-h.stopCh: + return + case failed := <-h.failedTxs: + if failed.retries == 0 { + h.logger.Error("failed to broadcast transaction after max retries", "tx", maxRetries) + continue + } + h.broadcastTransaction(failed.tx, failed.retries-1) + } + + // We slightly space out the retries in order to prioritize new transactions. + time.Sleep(retryDelay) + } +} + // Running returns true if the handler is running. func (h *handler) Running() bool { return h.running.Load() @@ -156,28 +193,35 @@ func (h *handler) stop(err error) { // Close channels. close(h.txsCh) close(h.stopCh) + close(h.failedTxs) } // broadcastTransactions will propagate a batch of transactions to the CometBFT mempool. func (h *handler) broadcastTransactions(txs coretypes.Transactions) { h.logger.Debug("broadcasting transactions", "num_txs", len(txs)) for _, signedEthTx := range txs { - // Serialize the transaction to Bytes - txBytes, err := h.serializer.ToSdkTxBytes(signedEthTx, signedEthTx.Gas()) - if err != nil { - h.logger.Error("failed to serialize transaction", "err", err) - continue - } + h.broadcastTransaction(signedEthTx, maxRetries) + } +} - // Send the transaction to the CometBFT mempool, which will gossip it to peers via - // CometBFT's p2p layer. - rsp, err := h.clientCtx.BroadcastTxSync(txBytes) +// broadcastTransaction will propagate a transaction to the CometBFT mempool. +func (h *handler) broadcastTransaction(tx *coretypes.Transaction, retries int) { + txBytes, err := h.serializer.ToSdkTxBytes(tx, tx.Gas()) + if err != nil { + h.logger.Error("failed to serialize transaction", "err", err) + return + } - // If we see an ABCI response error. - if rsp != nil && rsp.Code != 0 { - h.logger.Error("failed to broadcast transaction", "rsp", rsp, "err", err) - } else if err != nil { - h.logger.Error("error on transactions broadcast", "err", err) - } + // Send the transaction to the CometBFT mempool, which will gossip it to peers via + // CometBFT's p2p layer. + rsp, err := h.clientCtx.BroadcastTxSync(txBytes) + + // If we see an ABCI response error. + if rsp != nil && rsp.Code != 0 { + h.logger.Error("failed to broadcast transaction", "rsp", rsp, "err", err) + h.failedTxs <- &failedTx{tx: tx, retries: retries} + } else if err != nil { + h.logger.Error("error on transactions broadcast", "err", err) + h.failedTxs <- &failedTx{tx: tx, retries: retries} } } From ccc21f7eac137779fa98b8515fc27be9883136af Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 23 Oct 2023 12:40:06 -0400 Subject: [PATCH 107/122] feat(handler): improve logging --- cosmos/txpool/handler.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index 916667f0c9..188a8b4795 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -28,6 +28,7 @@ import ( "cosmossdk.io/log" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/event" @@ -216,12 +217,17 @@ func (h *handler) broadcastTransaction(tx *coretypes.Transaction, retries int) { // CometBFT's p2p layer. rsp, err := h.clientCtx.BroadcastTxSync(txBytes) - // If we see an ABCI response error. - if rsp != nil && rsp.Code != 0 { - h.logger.Error("failed to broadcast transaction", "rsp", rsp, "err", err) - h.failedTxs <- &failedTx{tx: tx, retries: retries} - } else if err != nil { + if err != nil { h.logger.Error("error on transactions broadcast", "err", err) h.failedTxs <- &failedTx{tx: tx, retries: retries} + } else if rsp != nil && rsp.Code != 0 { + if sdkerrors.ErrMempoolIsFull.Codespace() == rsp.Codespace && + rsp.Code == sdkerrors.ErrMempoolIsFull.ABCICode() { + h.logger.Error("failed to broadcast: comet-bft mempool is full", "tx_hash", tx.Hash()) + } else { + h.logger.Error("failed to broadcast transaction", + "codespace", rsp.Codespace, "code", rsp.Code, "info", rsp.Info, "tx_hash", tx.Hash()) + } + h.failedTxs <- &failedTx{tx: tx, retries: retries} } } From bf146d519cd3c19ec1e3bcfb76e57fd0fa9affbc Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 23 Oct 2023 13:46:26 -0400 Subject: [PATCH 108/122] fix(sdb): only set account keeper if nil --- cosmos/x/evm/plugins/state/plugin.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index d82921440c..254170f8d7 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -206,14 +206,10 @@ func (p *plugin) Finalize() { // CreateAccount implements the `StatePlugin` interface by creating a new account // in the account keeper. It will allow accounts to be overridden. func (p *plugin) CreateAccount(addr common.Address) { - acc := p.ak.GetAccount(p.ctx, addr[:]) - if acc == nil { - acc = p.ak.NewAccountWithAddress(p.ctx, addr[:]) + if p.ak.GetAccount(p.ctx, addr[:]) == nil { + p.ak.SetAccount(p.ctx, p.ak.NewAccountWithAddress(p.ctx, addr[:])) } - // save the new account in the account keeper - p.ak.SetAccount(p.ctx, acc) - // initialize the code hash to empty p.cms.GetKVStore(p.storeKey).Set(CodeHashKeyFor(addr), emptyCodeHashBytes) } From 9c4e32cedfa8b4e6bff0c490fa4ffac95a943195 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 24 Oct 2023 11:06:24 -0400 Subject: [PATCH 109/122] fix(miner): Fix non-deterministic gas consumption. (#1247) --- contracts/go.mod | 4 +- contracts/go.sum | 8 +- contracts/scripts/DeployAndCallERC20.sol | 22 +- cosmos/go.mod | 53 +- cosmos/go.sum | 72 +- cosmos/lib/ante/eject.go | 4 +- .../precompile/governance/governance_test.go | 5 + cosmos/runtime/runtime.go | 11 +- cosmos/txpool/handler.go | 27 +- cosmos/x/evm/plugins/block/header.go | 12 +- cosmos/x/evm/plugins/block/header_test.go | 4 +- .../evm/plugins/historical/historical_data.go | 16 +- cosmos/x/evm/plugins/state/genesis.go | 3 + cosmos/x/evm/plugins/state/plugin.go | 88 +- e2e/localnet/go.mod | 11 +- e2e/localnet/go.sum | 24 +- e2e/precompile/go.mod | 34 +- e2e/precompile/go.sum | 68 +- e2e/testapp/export.go | 2 +- e2e/testapp/go.mod | 86 +- e2e/testapp/go.sum | 87 +- eth/go.mod | 12 +- eth/go.sum | 24 +- go.work.sum | 937 +++++++++++------- lib/go.mod | 4 +- lib/go.sum | 8 +- tools/go.mod | 10 +- tools/go.sum | 23 +- 28 files changed, 935 insertions(+), 724 deletions(-) diff --git a/contracts/go.mod b/contracts/go.mod index 26c30ff5ac..6323d843c9 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -43,11 +43,11 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.13.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/contracts/go.sum b/contracts/go.sum index 6d1c978faf..2b48a846be 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -175,8 +175,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -228,8 +228,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= diff --git a/contracts/scripts/DeployAndCallERC20.sol b/contracts/scripts/DeployAndCallERC20.sol index c648692a56..bdc6385108 100644 --- a/contracts/scripts/DeployAndCallERC20.sol +++ b/contracts/scripts/DeployAndCallERC20.sol @@ -29,18 +29,18 @@ import "../lib/forge-std/src/Script.sol"; import "../src/testing/SolmateERC20.sol"; contract DeployAndCallERC20 is Script { - function run() public { - address dropAddress = address(12); - uint256 quantity = 50000; + function run() public { + address dropAddress = address(12); + uint256 quantity = 50000; - vm.startBroadcast(); - SolmateERC20 drop = new SolmateERC20(); + vm.startBroadcast(); + SolmateERC20 drop = new SolmateERC20(); - for (uint256 i = 0; i < 66; i++) { - quantity += 50000; - drop.mint(dropAddress, quantity); - } + for (uint256 i = 0; i < 10066; i++) { + quantity += 50000; + drop.mint(dropAddress, quantity); + } - vm.stopBroadcast(); - } + vm.stopBroadcast(); + } } diff --git a/cosmos/go.mod b/cosmos/go.mod index 8da0f0e3a9..a1a613ee90 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -4,52 +4,43 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 - + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) require ( - cosmossdk.io/api v0.7.1 - cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/api v0.7.2 cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 - cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 cosmossdk.io/math v1.1.3-rc.1 cosmossdk.io/store v1.0.0-rc.0 - cosmossdk.io/x/tx v0.10.0 + cosmossdk.io/x/tx v0.11.0 github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.50.0-rc.1 - github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.13.1 github.com/golang/mock v1.6.0 - github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/holiman/uint256 v1.2.3 // indirect - github.com/huandu/skiplist v1.2.0 // indirect github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 - github.com/spf13/viper v1.16.0 // indirect github.com/stretchr/testify v1.8.4 - github.com/tidwall/btree v1.7.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/grpc v1.58.1 + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 - pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 - pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4 + pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 ) require ( + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/errors v1.0.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect @@ -76,10 +67,11 @@ require ( github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.13.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/danieljoos/wincred v1.2.0 // indirect @@ -121,9 +113,10 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/glog v1.1.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect @@ -145,6 +138,8 @@ require ( github.com/hdevalence/ed25519consensus v0.1.0 // indirect github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/huandu/skiplist v1.2.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect @@ -206,12 +201,14 @@ require ( github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.16.0 // indirect github.com/status-im/keycard-go v0.2.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect @@ -222,8 +219,8 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.14.0 // indirect @@ -234,13 +231,15 @@ require ( golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.0 // indirect + gotest.tools/v3 v3.5.1 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 299b78f4bd..1f6df18251 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -35,8 +35,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= -cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= +cosmossdk.io/api v0.7.2 h1:BO3i5fvKMKvfaUiMkCznxViuBEfyWA/k6w2eAF6q1C4= +cosmossdk.io/api v0.7.2/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= @@ -51,8 +51,8 @@ cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= -cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= -cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= +cosmossdk.io/x/tx v0.11.0 h1:Ak2LIC06bXqPbpMIEorkQbwVddRvRys1sL3Cjm+KPfs= +cosmossdk.io/x/tx v0.11.0/go.mod h1:tzuC7JlfGivYuIO32JbvvY3Ft9s6FK1+r0/nGHiHwtM= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= @@ -110,8 +110,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb h1:4oWKO5gaauAaOqAuVFz1J0/5+raBtr+SZuFNOU9HQn0= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -211,8 +211,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 h1:T93aYHYLw+bgN+1/tmjmbO2j8bKm/xlGd4hquU+TjRE= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087/go.mod h1:FxbXMhS/Fz47QeviJ3yi1JgB0qCzgclMQ8s7MjD/I88= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -224,8 +224,8 @@ github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCp github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cosmos/ledger-cosmos-go v0.13.2 h1:aY0KZSmUwNKbBm9OvbIjvf7Ozz2YzzpAbgvN2C8x2T0= +github.com/cosmos/ledger-cosmos-go v0.13.2/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= @@ -451,8 +451,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -959,10 +959,10 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -1018,8 +1018,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1285,8 +1285,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -1361,12 +1361,12 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1393,8 +1393,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1444,8 +1444,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1459,12 +1459,12 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 h1:q9gSJk2kQQbz/3cPcXGCW+JdQvxAm+7ukcDqzZiUcmw= -pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= -pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 h1:gOqKP7ZCzIU1NZrwdISnxswAatut/6Xi7JjdSpHbZk8= -pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= -pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4 h1:3zGPs5JJpBtysLMNWa5wKEhwC+j3p5AAK0gZ1fWuEc8= -pkg.berachain.dev/polaris/lib v0.0.0-20231010191645-a5ed99983be4/go.mod h1:OcMl9wH8872Q4++ikKXIm1FC4FbuGUWHxrjb6LCzvIY= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= +pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= +pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 h1:HDy1RniHe/9mLhrQrTcjHvshmj64vO+QZvVbRiXnhjc= +pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3/go.mod h1:Wo7D3qNsCaBcibLwCmSY2O7Rzc94sslbk+qBMA8KSl8= +pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 h1:JO4hSX+qcyijVqDEHt3RXmXPV0XCbjjjlpBj0xHotcc= +pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3/go.mod h1:TQCmHbKEk6xF/9tG8m770ocVYXSdrxXcPyR22KJv60g= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/cosmos/lib/ante/eject.go b/cosmos/lib/ante/eject.go index 708c375168..a8ed64abd2 100644 --- a/cosmos/lib/ante/eject.go +++ b/cosmos/lib/ante/eject.go @@ -31,6 +31,8 @@ import ( "pkg.berachain.dev/polaris/lib/utils" ) +const numBlocksWait = 10 + // NewAnteHandler creates a new instance of AnteHandler with EjectOnRecheckTxDecorator. func NewAnteHandler() sdk.AnteHandler { anteDecorators := []sdk.AnteDecorator{ @@ -59,7 +61,7 @@ func (e *EjectOnRecheckTxDecorator) AnteHandle( if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { hash := wet.Unwrap().Hash() e.seen[hash]++ - if e.seen[hash] > 25 { //nolint:gomnd // temp fix. + if e.seen[hash] > numBlocksWait { delete(e.seen, hash) // prevent leak return ctx, errors.New("recheck tx") } diff --git a/cosmos/precompile/governance/governance_test.go b/cosmos/precompile/governance/governance_test.go index 262fbd10df..baccf22740 100644 --- a/cosmos/precompile/governance/governance_test.go +++ b/cosmos/precompile/governance/governance_test.go @@ -92,6 +92,11 @@ var _ = Describe("Governance Precompile", func() { common.BytesToAddress(caller), big.NewInt(0), ) + params, err := gk.Params.Get(ctx) + Expect(err).ToNot(HaveOccurred()) + params.MinDeposit = sdk.NewCoins(sdk.NewInt64Coin("abera", 100)) + err = gk.Params.Set(ctx, params) + Expect(err).ToNot(HaveOccurred()) }) AfterEach(func() { diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 9731c97f23..8ed6635e2e 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -85,11 +85,17 @@ func New( logger: logger, } - p.ExecutionLayer, err = eth.New("geth", cfg, host, engine, LoggerFuncHandler(logger)) + p.ExecutionLayer, err = eth.New( + "geth", cfg, host, engine, LoggerFuncHandler(logger), + ) if err != nil { panic(err) } + // Wrap the geth miner and txpool with the cosmos miner and txpool. + p.WrappedTxPool = txpool.New(p.TxPool()) + p.WrappedMiner = miner.New(p.Miner()) + return p } @@ -97,10 +103,7 @@ func New( // It takes a BaseApp and an EVMKeeper as arguments. // It returns an error if the setup fails. func (p *Polaris) Build(app CosmosApp, ek EVMKeeper) error { - p.WrappedTxPool = txpool.New(p.TxPool()) app.SetMempool(p.WrappedTxPool) - - p.WrappedMiner = miner.New(p.Miner()) app.SetPrepareProposal(p.WrappedMiner.PrepareProposal) if err := ek.Setup(p.Blockchain()); err != nil { diff --git a/cosmos/txpool/handler.go b/cosmos/txpool/handler.go index 188a8b4795..1715b9b5d5 100644 --- a/cosmos/txpool/handler.go +++ b/cosmos/txpool/handler.go @@ -220,14 +220,23 @@ func (h *handler) broadcastTransaction(tx *coretypes.Transaction, retries int) { if err != nil { h.logger.Error("error on transactions broadcast", "err", err) h.failedTxs <- &failedTx{tx: tx, retries: retries} - } else if rsp != nil && rsp.Code != 0 { - if sdkerrors.ErrMempoolIsFull.Codespace() == rsp.Codespace && - rsp.Code == sdkerrors.ErrMempoolIsFull.ABCICode() { - h.logger.Error("failed to broadcast: comet-bft mempool is full", "tx_hash", tx.Hash()) - } else { - h.logger.Error("failed to broadcast transaction", - "codespace", rsp.Codespace, "code", rsp.Code, "info", rsp.Info, "tx_hash", tx.Hash()) - } - h.failedTxs <- &failedTx{tx: tx, retries: retries} + return + } + + if rsp == nil || rsp.Code == 0 { + return } + + switch rsp.Code { + case sdkerrors.ErrMempoolIsFull.ABCICode(): + h.logger.Error("failed to broadcast: comet-bft mempool is full", "tx_hash", tx.Hash()) + case + sdkerrors.ErrTxInMempoolCache.ABCICode(): + return + default: + h.logger.Error("failed to broadcast transaction", + "codespace", rsp.Codespace, "code", rsp.Code, "info", rsp.Info, "tx_hash", tx.Hash()) + } + + h.failedTxs <- &failedTx{tx: tx, retries: retries} } diff --git a/cosmos/x/evm/plugins/block/header.go b/cosmos/x/evm/plugins/block/header.go index 5a21b31e04..2c92b8cf73 100644 --- a/cosmos/x/evm/plugins/block/header.go +++ b/cosmos/x/evm/plugins/block/header.go @@ -67,7 +67,7 @@ func (p *plugin) GetHeaderByNumber(number uint64) (*coretypes.Header, error) { // // GetHeaderByHash implements core.BlockPlugin. func (p *plugin) GetHeaderByHash(hash common.Hash) (*coretypes.Header, error) { - numBz := p.ctx.KVStore(p.storekey).Get(hash.Bytes()) + numBz := p.ctx.MultiStore().GetKVStore(p.storekey).Get(hash.Bytes()) if numBz == nil { return nil, core.ErrHeaderNotFound } @@ -95,7 +95,7 @@ func (p *plugin) StoreHeader(header *coretypes.Header) error { return p.writeGenesisHeaderBytes(headerHash, headerBz) } - kvstore := p.ctx.KVStore(p.storekey) + kvstore := p.ctx.MultiStore().GetKVStore(p.storekey) // set header key kvstore.Set([]byte{types.HeaderKey}, headerBz) @@ -139,7 +139,7 @@ func (p *plugin) readHeaderBytes(number uint64) ([]byte, error) { } // Unmarshal the header at IAVL height from its context kv store. - return ctx.KVStore(p.storekey).Get([]byte{types.HeaderKey}), nil + return ctx.MultiStore().GetKVStore(p.storekey).Get([]byte{types.HeaderKey}), nil } // writeGenesisHeaderBytes writes the genesis header to the kvstore. @@ -147,12 +147,12 @@ func (p *plugin) readHeaderBytes(number uint64) ([]byte, error) { // GenesisHeaderKey --> Header bytes // Header Hash --> 0 func (p *plugin) writeGenesisHeaderBytes(headerHash common.Hash, headerBz []byte) error { - p.ctx.KVStore(p.storekey).Set([]byte{types.GenesisHeaderKey}, headerBz) - p.ctx.KVStore(p.storekey).Set(headerHash.Bytes(), new(big.Int).Bytes()) + p.ctx.MultiStore().GetKVStore(p.storekey).Set([]byte{types.GenesisHeaderKey}, headerBz) + p.ctx.MultiStore().GetKVStore(p.storekey).Set(headerHash.Bytes(), new(big.Int).Bytes()) return nil } // readGenesisHeaderBytes returns the header bytes at the genesis key. func (p *plugin) readGenesisHeaderBytes() []byte { - return p.ctx.KVStore(p.storekey).Get([]byte{types.GenesisHeaderKey}) + return p.ctx.MultiStore().GetKVStore(p.storekey).Get([]byte{types.GenesisHeaderKey}) } diff --git a/cosmos/x/evm/plugins/block/header_test.go b/cosmos/x/evm/plugins/block/header_test.go index 6ea4cc17b1..38df63b293 100644 --- a/cosmos/x/evm/plugins/block/header_test.go +++ b/cosmos/x/evm/plugins/block/header_test.go @@ -141,8 +141,8 @@ func mockQueryContext(height int64, _ bool) (sdk.Context, error) { if err != nil { return sdk.Context{}, err } - ctx.KVStore(testutil.EvmKey).Set([]byte{evmtypes.HeaderKey}, headerBz) - ctx.KVStore(testutil.EvmKey).Set(header.Hash().Bytes(), header.Number.Bytes()) + ctx.MultiStore().GetKVStore(testutil.EvmKey).Set([]byte{evmtypes.HeaderKey}, headerBz) + ctx.MultiStore().GetKVStore(testutil.EvmKey).Set(header.Hash().Bytes(), header.Number.Bytes()) return ctx, nil } diff --git a/cosmos/x/evm/plugins/historical/historical_data.go b/cosmos/x/evm/plugins/historical/historical_data.go index 5854f2fe5a..e84afc42be 100644 --- a/cosmos/x/evm/plugins/historical/historical_data.go +++ b/cosmos/x/evm/plugins/historical/historical_data.go @@ -44,7 +44,7 @@ func (p *plugin) StoreBlock(block *coretypes.Block) error { // store block hash to block number. numBz := sdk.Uint64ToBigEndian(blockNum) - store := p.ctx.KVStore(p.storeKey) + store := p.ctx.MultiStore().GetKVStore(p.storeKey) // store block num to block blockBz, err := rlp.EncodeToBytes(block) @@ -83,7 +83,7 @@ func (p *plugin) StoreReceipts(blockHash common.Hash, receipts coretypes.Receipt ) return err } - prefix.NewStore(p.ctx.KVStore(p.storeKey), + prefix.NewStore(p.ctx.MultiStore().GetKVStore(p.storeKey), []byte{types.BlockHashKeyToReceiptsPrefix}).Set(blockHash.Bytes(), receiptsBz) return nil @@ -94,7 +94,9 @@ func (p *plugin) StoreTransactions( blockNum uint64, blockHash common.Hash, txs coretypes.Transactions, ) error { // store all txns in the block. - txStore := prefix.NewStore(p.ctx.KVStore(p.storeKey), []byte{types.TxHashKeyToTxPrefix}) + txStore := prefix.NewStore( + p.ctx.MultiStore().GetKVStore(p.storeKey), []byte{types.TxHashKeyToTxPrefix}, + ) for txIndex, tx := range txs { txLookupEntry := &coretypes.TxLookupEntry{ Tx: tx, @@ -119,7 +121,7 @@ func (p *plugin) StoreTransactions( // GetBlockByNumber returns the block at the given height. func (p *plugin) GetBlockByNumber(number uint64) (*coretypes.Block, error) { - store := p.ctx.KVStore(p.storeKey) + store := p.ctx.MultiStore().GetKVStore(p.storeKey) numBz := sdk.Uint64ToBigEndian(number) blockBz := prefix.NewStore(store, []byte{types.BlockNumKeyToBlockPrefix}).Get(numBz) block := &coretypes.Block{} @@ -132,7 +134,7 @@ func (p *plugin) GetBlockByNumber(number uint64) (*coretypes.Block, error) { // GetBlockByHash returns the block at the given hash. func (p *plugin) GetBlockByHash(blockHash common.Hash) (*coretypes.Block, error) { - store := p.ctx.KVStore(p.storeKey) + store := p.ctx.MultiStore().GetKVStore(p.storeKey) numBz := prefix.NewStore( store, []byte{types.BlockHashKeyToNumPrefix}).Get(blockHash.Bytes()) if numBz == nil { @@ -153,7 +155,7 @@ func (p *plugin) GetBlockByHash(blockHash common.Hash) (*coretypes.Block, error) func (p *plugin) GetTransactionByHash(txHash common.Hash) (*coretypes.TxLookupEntry, error) { // get tx from off chain. tleBz := prefix.NewStore( - p.ctx.KVStore(p.storeKey), []byte{types.TxHashKeyToTxPrefix}).Get(txHash.Bytes()) + p.ctx.MultiStore().GetKVStore(p.storeKey), []byte{types.TxHashKeyToTxPrefix}).Get(txHash.Bytes()) if tleBz == nil { return nil, core.ErrTxNotFound } @@ -168,7 +170,7 @@ func (p *plugin) GetTransactionByHash(txHash common.Hash) (*coretypes.TxLookupEn // GetReceiptsByHash returns the receipts with the given block hash. func (p *plugin) GetReceiptsByHash(blockHash common.Hash) (coretypes.Receipts, error) { // get receipts from off chain. - receiptsBz := prefix.NewStore(p.ctx.KVStore(p.storeKey), + receiptsBz := prefix.NewStore(p.ctx.MultiStore().GetKVStore(p.storeKey), []byte{types.BlockHashKeyToReceiptsPrefix}).Get(blockHash.Bytes()) if receiptsBz == nil { return nil, fmt.Errorf("failed to find receipts for block hash %s", blockHash.Hex()) diff --git a/cosmos/x/evm/plugins/state/genesis.go b/cosmos/x/evm/plugins/state/genesis.go index d1f0a6606f..e25152ba3e 100644 --- a/cosmos/x/evm/plugins/state/genesis.go +++ b/cosmos/x/evm/plugins/state/genesis.go @@ -58,6 +58,7 @@ func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { ) } } else { + p.CreateAccount(address) p.SetNonce(address, account.Nonce) } @@ -65,12 +66,14 @@ func (p *plugin) InitGenesis(ctx sdk.Context, ethGen *core.Genesis) error { if account.Balance != nil { p.SetBalance(address, account.Balance) } + if account.Code != nil { p.SetCode(address, account.Code) } else { // Initialize the code hash to be empty by default. p.cms.GetKVStore(p.storeKey).Set(CodeHashKeyFor(address), emptyCodeHashBytes) } + if account.Storage != nil { p.SetStorage(address, account.Storage) } diff --git a/cosmos/x/evm/plugins/state/plugin.go b/cosmos/x/evm/plugins/state/plugin.go index 254170f8d7..ab4c9b4701 100644 --- a/cosmos/x/evm/plugins/state/plugin.go +++ b/cosmos/x/evm/plugins/state/plugin.go @@ -106,15 +106,14 @@ type plugin struct { ak AccountKeeper // qfn allows for querying state a historical height. - qfn func() func(height int64, prove bool) (sdk.Context, error) + latestQueryContext sdk.Context + qfn func() func(height int64, prove bool) (sdk.Context, error) // dbErr stores any error that is returned from state modifications on the underlying // keepers. dbErr error mu sync.Mutex - - latestState sdk.Context } // NewPlugin returns a plugin with the given context and keepers. @@ -141,7 +140,7 @@ func (p *plugin) SetPrecompileLogFactory(plf events.PrecompileLogFactory) { // Prepare sets up the context on the state plugin for use in JSON-RPC calls. // Prepare implements `core.StatePlugin`. func (p *plugin) Prepare(ctx context.Context) { - p.latestState = sdk.UnwrapSDKContext(ctx) + p.latestQueryContext = sdk.UnwrapSDKContext(ctx) } // Reset sets up the state plugin for execution of a new transaction. It sets up the snapshottable @@ -206,6 +205,8 @@ func (p *plugin) Finalize() { // CreateAccount implements the `StatePlugin` interface by creating a new account // in the account keeper. It will allow accounts to be overridden. func (p *plugin) CreateAccount(addr common.Address) { + p.mu.Lock() + defer p.mu.Unlock() if p.ak.GetAccount(p.ctx, addr[:]) == nil { p.ak.SetAccount(p.ctx, p.ak.NewAccountWithAddress(p.ctx, addr[:])) } @@ -214,6 +215,37 @@ func (p *plugin) CreateAccount(addr common.Address) { p.cms.GetKVStore(p.storeKey).Set(CodeHashKeyFor(addr), emptyCodeHashBytes) } +// GetNonce implements the `StatePlugin` interface by returning the nonce +// of an account. +func (p *plugin) GetNonce(addr common.Address) uint64 { + p.mu.Lock() + defer p.mu.Unlock() + acc := p.ak.GetAccount(p.ctx, addr[:]) + if acc == nil { + return 0 + } + return acc.GetSequence() +} + +// SetNonce implements the `StatePlugin` interface by setting the nonce +// of an account. +func (p *plugin) SetNonce(addr common.Address, nonce uint64) { + p.mu.Lock() + defer p.mu.Unlock() + + // get the account or create a new one if doesn't exist + acc := p.ak.GetAccount(p.ctx, addr[:]) + if acc == nil { + acc = p.ak.NewAccountWithAddress(p.ctx, addr[:]) + } + + if err := acc.SetSequence(nonce); err != nil { + p.dbErr = err + } + + p.ak.SetAccount(p.ctx, acc) +} + // Exist implements the `StatePlugin` interface by reporting whether the given account address // exists in the state. Notably this also returns true for suicided accounts, which is accounted // for since, `RemoveAccount()` is not called until Commit. @@ -262,12 +294,12 @@ func (p *plugin) DeleteAccounts(accounts []common.Address) { // GetBalance implements `StatePlugin` interface. func (p *plugin) GetBalance(addr common.Address) *big.Int { - return new(big.Int).SetBytes(p.ctx.KVStore(p.storeKey).Get(BalanceKeyFor(addr))) + return new(big.Int).SetBytes(p.cms.GetKVStore(p.storeKey).Get(BalanceKeyFor(addr))) } // SetBalance implements `StatePlugin` interface. func (p *plugin) SetBalance(addr common.Address, amount *big.Int) { - p.ctx.KVStore(p.storeKey).Set(BalanceKeyFor(addr), amount.Bytes()) + p.cms.GetKVStore(p.storeKey).Set(BalanceKeyFor(addr), amount.Bytes()) } // AddBalance implements the `StatePlugin` interface by adding the given amount @@ -289,40 +321,6 @@ func (p *plugin) SubBalance(addr common.Address, amount *big.Int) { p.SetBalance(addr, new(big.Int).Sub(p.GetBalance(addr), amount)) } -// ============================================================================= -// Nonce -// ============================================================================= - -// GetNonce implements the `StatePlugin` interface by returning the nonce -// of an account. -func (p *plugin) GetNonce(addr common.Address) uint64 { - p.mu.Lock() - defer p.mu.Unlock() - acc := p.ak.GetAccount(p.ctx, addr[:]) - if acc == nil { - return 0 - } - return acc.GetSequence() -} - -// SetNonce implements the `StatePlugin` interface by setting the nonce -// of an account. -func (p *plugin) SetNonce(addr common.Address, nonce uint64) { - p.mu.Lock() - defer p.mu.Unlock() - // get the account or create a new one if doesn't exist - acc := p.ak.GetAccount(p.ctx, addr[:]) - if acc == nil { - acc = p.ak.NewAccountWithAddress(p.ctx, addr[:]) - } - - if err := acc.SetSequence(nonce); err != nil { - p.dbErr = err - } - - p.ak.SetAccount(p.ctx, acc) -} - // ============================================================================= // Code // ============================================================================= @@ -533,12 +531,12 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { int64Number := int64(number) // TODO: the GTE may be hiding a larger issue with the timing of the NewHead channel stuff. // Investigate and hopefully remove this GTE. - if int64Number >= p.latestState.BlockHeight() { + if int64Number >= p.latestQueryContext.BlockHeight() { // TODO: Manager properly - if p.latestState.MultiStore() == nil { - ctx = p.latestState.WithEventManager(sdk.NewEventManager()) + if p.latestQueryContext.MultiStore() == nil { + ctx = p.latestQueryContext.WithEventManager(sdk.NewEventManager()) } else { - ctx, _ = p.latestState.CacheContext() + ctx, _ = p.latestQueryContext.CacheContext() } } else { // Get the query context at the given height. @@ -552,7 +550,7 @@ func (p *plugin) StateAtBlockNumber(number uint64) (core.StatePlugin, error) { // Create a State Plugin with the requested chain height. sp := NewPlugin(p.ak, p.storeKey, p.qfn, p.plf) // TODO: Manager properly - if p.latestState.MultiStore() != nil { + if p.latestQueryContext.MultiStore() != nil { sp.Reset(ctx) } return sp, nil diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 4b0a8591a0..ecfc8dee9d 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -8,8 +8,8 @@ require ( github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible - pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 - pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 ) require ( @@ -35,7 +35,7 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -56,14 +56,15 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + golang.org/x/tools v0.13.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools v2.2.0+incompatible // indirect + gotest.tools/v3 v3.5.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index d9b8985359..00b7ecf9ed 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -102,8 +102,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -244,8 +244,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= @@ -293,8 +293,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -316,11 +316,11 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= -pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 h1:f3q5VqypSV1a2UijGbRbzFyqYmz37lISmjWXPwD3wEE= -pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= +pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 h1:HDy1RniHe/9mLhrQrTcjHvshmj64vO+QZvVbRiXnhjc= +pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3/go.mod h1:Wo7D3qNsCaBcibLwCmSY2O7Rzc94sslbk+qBMA8KSl8= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 0018981f29..022552e315 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -6,17 +6,17 @@ go 1.21 replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 require ( - github.com/cosmos/cosmos-sdk v0.50.0-rc.1 + github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 github.com/cosmos/gogoproto v1.4.11 github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 - pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 - pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231011003341-63d98bc34da2 - pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 ) require ( - cosmossdk.io/api v0.7.1 // indirect + cosmossdk.io/api v0.7.2 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect @@ -24,7 +24,7 @@ require ( cosmossdk.io/log v1.2.1 // indirect cosmossdk.io/math v1.1.3-rc.1 // indirect cosmossdk.io/store v1.0.0-rc.0 // indirect - cosmossdk.io/x/tx v0.10.0 // indirect + cosmossdk.io/x/tx v0.11.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect @@ -56,7 +56,7 @@ require ( github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.13.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -93,7 +93,7 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -167,27 +167,27 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect - google.golang.org/grpc v1.58.1 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/grpc v1.58.3 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.0 // indirect + gotest.tools/v3 v3.5.1 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index b2f44a331e..afa08f388d 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -35,8 +35,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= -cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= +cosmossdk.io/api v0.7.2 h1:BO3i5fvKMKvfaUiMkCznxViuBEfyWA/k6w2eAF6q1C4= +cosmossdk.io/api v0.7.2/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= @@ -51,8 +51,8 @@ cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= -cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= -cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= +cosmossdk.io/x/tx v0.11.0 h1:Ak2LIC06bXqPbpMIEorkQbwVddRvRys1sL3Cjm+KPfs= +cosmossdk.io/x/tx v0.11.0/go.mod h1:tzuC7JlfGivYuIO32JbvvY3Ft9s6FK1+r0/nGHiHwtM= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= @@ -190,8 +190,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 h1:T93aYHYLw+bgN+1/tmjmbO2j8bKm/xlGd4hquU+TjRE= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087/go.mod h1:FxbXMhS/Fz47QeviJ3yi1JgB0qCzgclMQ8s7MjD/I88= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -203,8 +203,8 @@ github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCp github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cosmos/ledger-cosmos-go v0.13.2 h1:aY0KZSmUwNKbBm9OvbIjvf7Ozz2YzzpAbgvN2C8x2T0= +github.com/cosmos/ledger-cosmos-go v0.13.2/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -427,8 +427,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -911,10 +911,10 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -967,8 +967,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1227,8 +1227,8 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -1303,12 +1303,12 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1335,8 +1335,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1388,8 +1388,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1402,12 +1402,12 @@ nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231011003341-63d98bc34da2 h1:cmJUWo6DqtLUEZ1vo0dfb/QNfertRLFPkTesY9KNhJI= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231011003341-63d98bc34da2/go.mod h1:6IhsZjEMihGyxVvTUiE7coWiCJq7DRBEdbTnMo7bOnc= -pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2 h1:f3q5VqypSV1a2UijGbRbzFyqYmz37lISmjWXPwD3wEE= -pkg.berachain.dev/polaris/eth v0.0.0-20231011003341-63d98bc34da2/go.mod h1:HuT/i4PZCz3ItXAvDWHA31z4OZ10we6RH6xz+Fq0Nlw= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231023174626-bf146d519cd3 h1:BHc3Q5w2U6AKCDgfZpSz3dKj1+L3rSnNnpgw5G9UAxo= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231023174626-bf146d519cd3/go.mod h1:mV/YhYDconEy3q0q7xXcDS5kMsXx5iROBFriHHz7r/M= +pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 h1:HDy1RniHe/9mLhrQrTcjHvshmj64vO+QZvVbRiXnhjc= +pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3/go.mod h1:Wo7D3qNsCaBcibLwCmSY2O7Rzc94sslbk+qBMA8KSl8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/e2e/testapp/export.go b/e2e/testapp/export.go index 881d31a25e..6b337054ab 100644 --- a/e2e/testapp/export.go +++ b/e2e/testapp/export.go @@ -222,7 +222,7 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // Iterate through validators by power descending, reset bond heights, and // update bond intra-tx counters. - store := ctx.KVStore(app.UnsafeFindStoreKey(stakingtypes.StoreKey)) + store := ctx.MultiStore().GetKVStore(app.UnsafeFindStoreKey(stakingtypes.StoreKey)) iter := storetypes.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) counter := int16(0) diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 23b888f687..8b215a9f97 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -4,60 +4,42 @@ go 1.21 replace ( // We replace `go-ethereum` with `polaris-geth` in order include our required changes. - github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 - + github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb // Required at the moment until a bug in the comsos-sdk is fixed. github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) require ( + cosmossdk.io/api v0.7.2 cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 - cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 - cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 - cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d - pkg.berachain.dev/polaris/cosmos v0.0.0-20231012162131-c1edabdcf30e - pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 -) - -require ( - cosmossdk.io/api v0.7.1 - cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 cosmossdk.io/depinject v1.0.0-alpha.4 - cosmossdk.io/errors v1.0.0 // indirect cosmossdk.io/log v1.2.1 - cosmossdk.io/math v1.1.3-rc.1 // indirect cosmossdk.io/store v1.0.0-rc.0 - cosmossdk.io/x/tx v0.10.0 // indirect + cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 + cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 + cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 - github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/cosmos-sdk v0.50.0-rc.1 - github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gogoproto v1.4.11 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect - github.com/huandu/skiplist v1.2.0 // indirect + github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 - github.com/tidwall/btree v1.7.0 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect - google.golang.org/grpc v1.58.1 // indirect - google.golang.org/protobuf v1.31.0 // indirect + pkg.berachain.dev/polaris/cosmos v0.0.0-20231012162131-c1edabdcf30e + pkg.berachain.dev/polaris/eth v0.0.0-20231010191645-a5ed99983be4 ) require ( - cloud.google.com/go v0.110.6 // indirect + cloud.google.com/go v0.110.8 // indirect cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect - cloud.google.com/go/storage v1.31.0 // indirect + cloud.google.com/go/iam v1.1.2 // indirect + cloud.google.com/go/storage v1.30.1 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/errors v1.0.0 // indirect + cosmossdk.io/math v1.1.3-rc.1 // indirect + cosmossdk.io/x/tx v0.11.0 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect @@ -65,7 +47,7 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect - github.com/aws/aws-sdk-go v1.44.312 // indirect + github.com/aws/aws-sdk-go v1.44.224 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect @@ -87,10 +69,13 @@ require ( github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.4.11 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.13.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/creachadair/atomicfile v0.3.1 // indirect @@ -108,6 +93,7 @@ require ( github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fjl/memsize v0.0.1 // indirect @@ -135,24 +121,27 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/s2a-go v0.1.4 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/go-bexpr v0.1.12 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.2 // indirect + github.com/hashicorp/go-getter v1.7.1 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.1 // indirect @@ -165,6 +154,8 @@ require ( github.com/hdevalence/ed25519consensus v0.1.0 // indirect github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/huandu/skiplist v1.2.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect @@ -231,6 +222,7 @@ require ( github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect @@ -242,13 +234,13 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect @@ -257,16 +249,20 @@ require ( golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + golang.org/x/tools v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.134.0 // indirect + google.golang.org/api v0.128.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/grpc v1.58.3 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.0 // indirect + gotest.tools/v3 v3.5.1 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect pkg.berachain.dev/polaris/contracts v0.0.0-20231010191645-a5ed99983be4 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index 30c8108945..fe92b27de3 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -111,8 +111,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -174,8 +174,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI= -cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -187,8 +187,8 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= -cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= +cosmossdk.io/api v0.7.2 h1:BO3i5fvKMKvfaUiMkCznxViuBEfyWA/k6w2eAF6q1C4= +cosmossdk.io/api v0.7.2/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= @@ -209,8 +209,8 @@ cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508 h1:axKhxRa3M9QW2GdK cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508/go.mod h1:qcJ1zwLIMefpDHZuYSa73yBe/k5HyQ5H1Jg9PWv30Ts= cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6IDE38o0Wp8xE/+BAxocb0oyX4I= cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= -cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= -cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= +cosmossdk.io/x/tx v0.11.0 h1:Ak2LIC06bXqPbpMIEorkQbwVddRvRys1sL3Cjm+KPfs= +cosmossdk.io/x/tx v0.11.0/go.mod h1:tzuC7JlfGivYuIO32JbvvY3Ft9s6FK1+r0/nGHiHwtM= cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d h1:LH8NPa2+yoMFdCTxCFyQUX5zVDip4YDgtg7e0EecDqo= cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d/go.mod h1:+5jCm6Lk/CrQhQvtJFy/tmuLfhQKNMn/U0vwrRz/dxQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -265,16 +265,16 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.312 h1:llrElfzeqG/YOLFFKjg1xNpZCFJ2xraIi3PqSuP+95k= -github.com/aws/aws-sdk-go v1.44.312/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.224 h1:09CiaaF35nRmxrzWZ2uRq5v6Ghg/d2RiPjZnSgtt+RQ= +github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb h1:4oWKO5gaauAaOqAuVFz1J0/5+raBtr+SZuFNOU9HQn0= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -374,8 +374,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 h1:T93aYHYLw+bgN+1/tmjmbO2j8bKm/xlGd4hquU+TjRE= +github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087/go.mod h1:FxbXMhS/Fz47QeviJ3yi1JgB0qCzgclMQ8s7MjD/I88= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -387,8 +387,8 @@ github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCp github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cosmos/ledger-cosmos-go v0.13.2 h1:aY0KZSmUwNKbBm9OvbIjvf7Ozz2YzzpAbgvN2C8x2T0= +github.com/cosmos/ledger-cosmos-go v0.13.2/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 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.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= @@ -621,8 +621,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -664,8 +665,8 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -712,8 +713,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= -github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= +github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -1164,10 +1165,10 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -1228,8 +1229,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1557,8 +1558,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -1617,8 +1618,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1736,12 +1737,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1783,8 +1784,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1837,8 +1838,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/eth/go.mod b/eth/go.mod index afe77d4f66..61bf0bf3d4 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/eth go 1.21 // We replace `go-ethereum` with `polaris-geth` in order include our required changes. -replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 +replace github.com/ethereum/go-ethereum => github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb require ( github.com/ethereum/go-ethereum v1.13.1 @@ -12,8 +12,8 @@ require ( github.com/onsi/gomega v1.27.10 github.com/stretchr/testify v1.8.4 golang.org/x/text v0.13.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 - pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2 + pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 ) require ( @@ -62,7 +62,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -122,13 +122,13 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/eth/go.sum b/eth/go.sum index 7f4ca58dc0..f06c239527 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -12,8 +12,8 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb h1:4oWKO5gaauAaOqAuVFz1J0/5+raBtr+SZuFNOU9HQn0= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= @@ -139,8 +139,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= @@ -331,8 +331,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= @@ -401,8 +401,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -436,10 +436,10 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= -pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2 h1:XV+f50FxTAbJcQCIXPV6CzDiHsRj5YX+qlPjk+Hg1IA= -pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2/go.mod h1:OcMl9wH8872Q4++ikKXIm1FC4FbuGUWHxrjb6LCzvIY= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= +pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 h1:JO4hSX+qcyijVqDEHt3RXmXPV0XCbjjjlpBj0xHotcc= +pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3/go.mod h1:TQCmHbKEk6xF/9tG8m770ocVYXSdrxXcPyR22KJv60g= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/go.work.sum b/go.work.sum index ea5a88fb38..434c59b6e7 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,29 +1,15 @@ -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/aiplatform v1.51.0 h1:OEYe9gBca6ydogM2G0mQRMHE+aUhEV4cyaqxbk3+M1o= +cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= @@ -32,128 +18,129 @@ cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.5.0 h1:+77+/BhFuU476/s78kYiWHObxaYBHsC6Us+Gd7W9pJ4= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/artifactregistry v1.14.2 h1:xJIxeBs9ZYH2j8Wg/K/aCkroNUnDXgIhSHgz5FUE/Q4= +cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/asset v1.15.0 h1:4SdWreholqB0ZOHjBO+K+RSsW9TcZBbfpfXtFir23R0= +cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/baremetalsolution v1.2.0 h1:3zztyuQHjfU0C0qEsI9LkC3kf5/TQQ3jUJhbmetUoRA= +cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/batch v1.5.0 h1:xjhQeEcBXJDxW2cBZEQgCKlGeXRlVJildU67rtoBY6A= +cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/bigquery v1.56.0 h1:LHIc9E7Kw+ftFpQFKzZYBB88IAFz7qONawXXx0F3QBo= +cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/billing v1.17.1 h1:YSu8a17uJ6sOnlrnJVOBWkimmHZGtSpSkyElv9+JjRM= +cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/binaryauthorization v1.7.0 h1:7L6uUWo/xNCfdVNnnzh2M4x5YA732YPgqRdCG8aKVAU= +cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/channel v1.17.0 h1:Hy2EaOiOB7BS1IJmg2lLilEo8uMfFWTy7RgjTzbUqjM= +cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqmfddPA= cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.14.0 h1:YTMxmFra7eIjKFgnyQUxOwWNseNqeO38kGh7thy7v4s= +cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/clouddms v1.7.0 h1:vTcaFaFZTZZ11gXB6aZHdAx+zn30P8YJw4X/S3NC+VQ= +cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.11.0 h1:u3GlrTrchHF91z58TBSdQ80G6UbVvF6Egb4utrjSvtI= +cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/container v1.26.0 h1:SszQdI0qlyKsImz8/l26rpTZMyqvaH9yfua7rirDZvY= +cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/containeranalysis v0.11.0 h1:/EsoP+UTIjvl4yqrLA4WgUG83kwQhqZmbXEfqirT2LM= +cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/datacatalog v1.18.0 h1:AZHHhoSEK4n3yMsHFLibUjMX5jQz/0FcKKD4T1vxyGM= +cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.1 h1:wqPAP1vRskOoWwNka1yey2wxxCrxRrcxJf78MyFvrbs= +cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataproc/v2 v2.2.0 h1:jKijbdsERm2hy/5dFl/LeQN+7CNssLdGXQYBMvMH/M4= +cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.44.0 h1:F/fSUxRD/fAfjqjClwSzg1OsQGdDG7SbO1i4x5SHuUI= +cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/documentai v1.23.0 h1:Gxrx8dgCjEPsJGjsI6wPdaURNG9tniQv7xDGQmLPNw0= +cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= @@ -164,180 +151,175 @@ cloud.google.com/go/eventarc v1.13.0 h1:xIP3XZi0Xawx8DEfh++mE2lrIi5kQmCr/KcWhJ1q cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= +cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0 h1:PKggmegChZulPW8yvtziF8P9UOuVFwbvylbEucTNups= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkebackup v1.3.1 h1:Kfha8SOF2tqsu4O4jVle66mk7qNdlJ2KhL3E2YyiNZc= +cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/iap v1.9.0 h1:RNhVq/6OMI99/wjPVhqFxjlBxYOBRdaG6rLpBvyaqYY= +cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/kms v1.15.2 h1:lh6qra6oC4AyWe5fUUUBe/S27k12OHAleOOOw6KakdE= +cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/language v1.11.0 h1:KnYolG0T5Oex722ZW/sP5QErhVAVNcqpJ16tVJd9RTw= +cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.13.0 h1:iMMU4DY4yojvKatMfv1q9WqBHi3ZrcwAIYQ+ZrlXM2o= +cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/monitoring v1.16.0 h1:rlndy4K8yknMY9JuGe2aK4SbCh21FXoCdX7SAGHmRgI= +cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkconnectivity v1.14.0 h1:NBuIU8e/kBNAJE7Rgij+wyXZMcybnlxVTpoZEyQppHc= +cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networkmanagement v1.9.0 h1:aA6L8aioyM4S6nlPYzp2SvB88lBcByZmqMJM6ReafzU= +cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/notebooks v1.10.0 h1:6x2K1JAWv6RW2yQO6oa+xtKUGOpGQseCmT94vpOt1vc= +cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/optimization v1.5.0 h1:sGvPVtBJUKNYAwldhJvFmnM+EEdOXjDzjcly3g0n0Xg= +cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/oslogin v1.11.0 h1:7OA/BHWna8s+8k1sjTLHs0zRttoktR8a36qjWIvzTco= +cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/policytroubleshooter v1.9.0 h1:pT4qSiL5o0hBSWHDiOcmes/s301PeLLWEhAr/eMQB/g= +cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.0 h1:4qPn0UZ1LUZje+JcmJcVRtsR2qbCMwCFU+MmsCRzDbk= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/recommender v1.11.0 h1:SuzbMJhDAiPro7tR9QP7EX97+TI31urjsIgNh9XQHl8= +cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/run v1.3.0 h1:NR3ibstYygrvNZQ+7+rSWmD+oKvbjB/B9Ve9mqhkj6s= +cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicecontrol v1.10.0 h1:P1OiVugNQtWVM3hVJSzaAmye48pExx1VPX2SKT8Z4Yg= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.6.0 h1:flWoX0eJy21+34I/7HPUbpr6xTHPVzws1xnecLFlUm0= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.5.0 h1:fl1AGgOx7E2eyBmH5ofDXT9w8xGvEaEnHYyNYGkxaqg= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/spanner v1.50.0 h1:QrJFOpaxCXdXF+GkiruLz642PHxkdj68PbbnLw3O2Zw= +cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.14.0 h1:6RRlFMv1omScs6iq2hfE3IvgE+l6RfJPampq8UZc5TU= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= @@ -348,16 +330,15 @@ cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zXrU0= cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.9.0 h1:0na4gC54Lu05ir00dmUSuMkLAojDe1ALq4hBTUkhwjE= +cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/video v1.20.0 h1:AkjXyJfQ7DtPyDOAbTMeiGcuKsO8/iKSb3fAmTUHYSg= +cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= @@ -366,37 +347,44 @@ cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmX cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= -cosmossdk.io/tools/confix v0.0.0-20230818115413-c402c51a1508/go.mod h1:qcJ1zwLIMefpDHZuYSa73yBe/k5HyQ5H1Jg9PWv30Ts= -cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= -cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d/go.mod h1:+5jCm6Lk/CrQhQvtJFy/tmuLfhQKNMn/U0vwrRz/dxQ= +cloud.google.com/go/workflows v1.12.0 h1:cSUlx4PVV9O0vYCl+pHAUmu0996A7eN602d4wjjVHRs= +cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible h1:rZgFj+Gtf3NMi/U5FvCvhzaxzW/TaPYgUYx3bAPz9DE= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf h1:8F6fjL5iQP6sArGtPuXh0l6hggdcIpAm4ChjVJE4oTs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= @@ -413,70 +401,129 @@ github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0 h1:E5Dzlk3akC+T2Zj1LBHgfPK1y8YWgLDnNDRmG+tpSKw= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527 h1:NImof/JkF93OVWZY+PINgl6fPtQyF6f+hNUtZ0QZA1c= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= +github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.312/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= +github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= +github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= github.com/aws/aws-sdk-go-v2/credentials v1.1.1 h1:NbvWIM1Mx6sNPTxowHgS2ewXCRp+NGTzUYb/96FZJbY= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 h1:EtEU7WRaWliitZh2nmuxEXrN0Cb8EgPUFGIoTMeqbzI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1 h1:w/fPGB0t5rWwA43mux4e9ozFSH5zF1moQemlA131PWc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 h1:cKr6St+CtC3/dl/rEBJvlk7A/IN5D5F02GNkGzfbtVU= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2 h1:/RPQNjh1sDIezpXaFIkZb7MlXnSyAqjVdAwcJuGYTqg= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 h1:TJoIfnIFubCX0ACVeJ0w46HEH5MwjwYN4iFhuYIhfIY= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= +github.com/aws/smithy-go v1.1.0 h1:D6CSsM3gdxaGaqXnPgOBCeL6Mophqzu7KJOu7zW78sU= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= -github.com/berachain/polaris-geth v0.0.0-20231012174642-6e1d46cd32f5/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= +github.com/berachain/polaris-geth 88eca5365ecc96474ca94bd4f0d8d9d99bed2a09 h1:qqyoNcIlOSnIuCmofS6HRSrEXcAupPlqgEFtQij35E0= +github.com/berachain/polaris-geth 88eca5365ecc96474ca94bd4f0d8d9d99bed2a09/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231024032003-b94ca5da2234/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231024032731-4fdd2b9deba9/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/berachain/polaris-geth v0.0.0-20231024043959-88eca5365ecc/go.mod h1:I0U5VewuuTzvBtVzKo7b3hJzDhXOUtn9mJW7SsIPB0Q= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb h1:4oWKO5gaauAaOqAuVFz1J0/5+raBtr+SZuFNOU9HQn0= +github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= +github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= @@ -488,11 +535,16 @@ github.com/cloudflare/circl v1.3.1 h1:4OVCZRL62ijwEwxnF6I7hLwxvIYi3VaZt8Tflkqtrt github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cloudflare/cloudflare-go v0.79.0 h1:ErwCYDjFCYppDJlDJ/5WhsSmzegAUe2+K9qgFyQDg3M= +github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -501,23 +553,39 @@ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= -github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6 h1:uKuolOJonQOb/2+z/wFSJeVREP6fSoigr/X4Wlfhwwg= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= -github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= +github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/djherbis/atime v1.1.0 h1:rgwVbP/5by8BvvjBNrbh64Qz33idKT3pSnMSJsxhi0g= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= @@ -530,35 +598,56 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaI github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad h1:EmNYJhPYy0pOFjCx2PrgtaBXmee0iUX9hLlxE1xHOJE= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64SYnQjw/w99HMYvQ0A8/JoUkxVmc= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db h1:gb2Z18BhTPJPpLQWj4T+rfKHYCHxRHCtRxhKKjRidVw= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= +github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.118.0 h1:z43njxPmJ7TaPpMSCQb7PN0dEYno4tyBPQcrFdHoLuM= github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= @@ -567,18 +656,38 @@ github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHs github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-pdf/fpdf v0.5.0 h1:GHpcYsiDV2hdo77VTOuTF9k1sN8F8IY7NjnCo9x+NPY= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0= github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8= @@ -588,67 +697,89 @@ github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38 h1:y0Wmhvml7cGnzPa9nocn/fMraMH/lMDdeG+rkx4VgYY= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 h1:7qnwS9+oeSiOIsiUMajT+0R7HR6hw5NegnKPmn/94oI= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 h1:V2IgdyerlBa/MxaEFRbV5juy/C3MGdj4ePi+g6ePIp4= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-pkcs11 v0.2.0 h1:5meDPB26aJ98f+K9G21f0AqZwo/S5BJMJh8nuhMbdsI= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/safehtml v0.0.2 h1:ZOt2VXg4x24bW0m2jtzAOkhoXV0iM8vNKc0paByCZqM= +github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e h1:CYRpN206UTHUinz3VJoLaBdy1gEGeJNsqT0mvswDcMw= +github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= +github.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0= +github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= +github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= +github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= @@ -660,10 +791,19 @@ github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/informalsystems/tm-load-test v1.3.0 h1:FGjKy7vBw6mXNakt+wmNWKggQZRsKkEYpaFk/zR64VA= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= +github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= +github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= +github.com/iris-contrib/httpexpect/v2 v2.12.1 h1:3cTZSyBBen/kfjCtgNFoUKi1u0FVXNaAjyRJOo6AVS4= +github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3ZuUUYB3u61KCqeSgZ88= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 h1:Kyp9KiXwsyZRTeoNjgVCrWks7D8ht9+kg6yCjh8K97o= +github.com/iris-contrib/jade v1.1.4 h1:WoYdfyJFfZIUgqNAeOyRfTNQZOksSlZ6+FnXR3AEpX0= +github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -674,8 +814,6 @@ github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= @@ -684,9 +822,16 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= +github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= @@ -695,6 +840,10 @@ github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.2.0 h1:WzDY5nGuW/LgVaFS5BtTkW3crdSKJ/FEgWnxPnIVVLI= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/jwt v0.1.8 h1:u71baOsYD22HWeSOg32tCHbczPjdCk7V4MMeJqTtmGk= +github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= +github.com/kataras/neffos v0.0.21 h1:UwN/F44jlqdtgFI29y3VhA7IlJ4JbK3UjCbTDg1pYoo= +github.com/kataras/neffos v0.0.21/go.mod h1:FeGka8lu8cjD2H+0OpBvW8c6xXawy3fj5VX6xcIJ1Fg= github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= @@ -705,12 +854,24 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= @@ -721,12 +882,15 @@ github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzlt github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB0= github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= @@ -734,22 +898,44 @@ github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqA github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2 h1:JAEbJn3j/FrhdWA9jW8B5ajsLIjeuEHLi8xE4fk997o= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ= +github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= +github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed h1:3dQJqqDouawQgl3gBE1PNHKFkJYGEuFb1DbSlaxdosE= +github.com/mediocregopher/radix/v3 v3.8.1 h1:rOkHflVuulFKlwsLY01/M2cM2tWCjDoETcMqKbAWu1M= +github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= +github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= @@ -761,15 +947,24 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= +github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nats.go v1.23.0 h1:lR28r7IX44WjYgdiKz9GmUeW0uh/m33uD3yEjLZ2cOE= +github.com/nats-io/nats.go v1.23.0/go.mod h1:ki/Scsa23edbh8IRZbCuNXR9TDcbvfaSijKtaqQgw+Q= github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= @@ -779,20 +974,34 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= @@ -804,8 +1013,22 @@ github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR github.com/pointlander/peg v1.0.1 h1:mgA/GQE8TeS9MdkU6Xn6iEzBmQUQCNuWD7rHCK6Mjs0= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= @@ -819,16 +1042,25 @@ github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e h1:eTWZyPUnHcuGRDiryS/l2I7FfKjbU3IBx3IjqHPxuKU= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= +github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sclevine/agouti v3.0.0+incompatible h1:8IBJS6PWz3uTlMP3YBIR5f+KAldcGuOeFkFbUWfBgK4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= @@ -848,25 +1080,37 @@ github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeX github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7 h1:8Vs0142DmPFW/bQeHRP3MV19m1gvndjUb1sn8yy74LM= +github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasthttp v1.48.0 h1:oJWvHb9BIZToTQS3MuQ2R3bJZiNSa2KiNdeI8A+79Tc= github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM= @@ -887,13 +1131,22 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= @@ -905,207 +1158,147 @@ go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +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.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.0 h1:ymLukg4XJlQnYUJCp+coQq5M7BsUJFk6XQE4HPflwdw= +gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= +google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc h1:g3hIDl0jRNd9PPTs2uBzYuaD5mQuwOkZY0vSc0LR32o= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771 h1:gm8vsVR64Jx1GxHY8M+p8YA2bxU/H/lymcutB2l7l9s= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230720185612-659f7aaaa771/go.mod h1:3QoBVwTHkXbY1oRGzlhwhOykfcATQN43LJ6iT8Wy8kE= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= pkg.berachain.dev/polaris/contracts v0.0.0-20230928142528-23cc5f141354/go.mod h1:aM6e6GYmu5YPNUWGs0Qy3pL8N5MsRHO3QvcUruwF2Rc= pkg.berachain.dev/polaris/cosmos v0.0.0-20231007233125-8af23216be65/go.mod h1:pdtZOZgwQTMcs04WLEWVrsg/Y0SVAqCZftIQ6cWVkgo= pkg.berachain.dev/polaris/eth v0.0.0-20230928142528-23cc5f141354/go.mod h1:eI+YNq3Nc4J9Di6RyZNOif5ejWGHmWfxRi/dS8gSE6A= pkg.berachain.dev/polaris/lib v0.0.0-20230928142528-23cc5f141354/go.mod h1:PyX74/6+6XhSJ9gXmE/xFYp1gZCcQ36suVk8hh4s36M= +pkg.berachain.dev/polaris/lib v0.0.0-20231011003341-63d98bc34da2/go.mod h1:OcMl9wH8872Q4++ikKXIm1FC4FbuGUWHxrjb6LCzvIY= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= diff --git a/lib/go.mod b/lib/go.mod index 9ffa11a06a..ff1791eb07 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -10,7 +10,7 @@ require ( require ( github.com/go-logr/logr v1.2.4 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/lib/go.sum b/lib/go.sum index 29c5edbac2..69175b40d4 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -10,8 +10,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -43,8 +43,8 @@ golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= diff --git a/tools/go.mod b/tools/go.mod index a68fca383d..4bb3abd29b 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -41,7 +41,7 @@ require ( github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/bkielbasa/cyclop v1.2.1 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.0 // indirect + github.com/bmatcuk/doublestar/v4 v4.0.2 // indirect github.com/bombsimon/wsl/v3 v3.4.0 // indirect github.com/breml/bidichk v0.2.4 // indirect github.com/breml/errchkjson v0.3.1 // indirect @@ -131,7 +131,7 @@ require ( github.com/golangci/misspell v0.4.1 // indirect github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-containerregistry v0.15.2 // indirect github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect github.com/google/uuid v1.3.0 // indirect @@ -293,12 +293,11 @@ require ( go.opentelemetry.io/otel/trace v1.16.0 // indirect go.tmz.dev/musttag v0.7.2 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/goleak v1.1.12 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect @@ -307,12 +306,13 @@ require ( golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect honnef.co/go/tools v0.4.5 // indirect mvdan.cc/gofumpt v0.5.0 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect diff --git a/tools/go.sum b/tools/go.sum index e7a112e9c6..cb210caf6e 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -103,9 +103,8 @@ github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlM github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/bmatcuk/doublestar/v4 v4.0.2 h1:X0krlUVAVmtr2cRoTqR8aDMrDqnB36ht8wpWTiQ3jsA= github.com/bmatcuk/doublestar/v4 v4.0.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc= -github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= @@ -399,8 +398,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.15.2 h1:MMkSh+tjSdnmJZO7ljvEqV1DjfekB6VUEAZgy3a+TQE= github.com/google/go-containerregistry v0.15.2/go.mod h1:wWK+LnOv4jXMM23IT/F1wdYftGWGr47Is8CG+pmHK1Q= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -903,8 +902,8 @@ go.tmz.dev/musttag v0.7.2 h1:1J6S9ipDbalBSODNT5jCep8dhZyMr4ttnjQagmGYR5s= go.tmz.dev/musttag v0.7.2/go.mod h1:m6q5NiiSKMnQYokefa2xGoyoXnrswCbJ0AWYzf4Zs28= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= @@ -934,8 +933,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 h1:jWGQJV4niP+CCmFW9ekjA9Zx8vYORzOUH2/Nl5WPuLQ= @@ -1222,8 +1221,8 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961 h1:QmgpI5T0BWoYLKWtpEWHZlEdNz5jhoGqK7taBoUv4Gw= -golang.org/x/tools v0.12.1-0.20230818141832-9425c2e70961/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -1347,8 +1346,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From febc5a6f7063568925c727a74ed2b24d3f1bb635 Mon Sep 17 00:00:00 2001 From: shuoer86 <129674997+shuoer86@users.noreply.github.com> Date: Thu, 26 Oct 2023 02:16:33 +0800 Subject: [PATCH 110/122] fix: typos (#1250) --- e2e/hive/simulators/rpc-compat/README.md | 4 ++-- e2e/hive/simulators/rpc/README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/hive/simulators/rpc-compat/README.md b/e2e/hive/simulators/rpc-compat/README.md index 7e4a88237f..17706030f9 100644 --- a/e2e/hive/simulators/rpc-compat/README.md +++ b/e2e/hive/simulators/rpc-compat/README.md @@ -1,11 +1,11 @@ # RPC-Compat Hive -The RPC-Compat Hive directory runs the tests specified by the `ethereum/rpc-compat` simluation test spec. +The RPC-Compat Hive directory runs the tests specified by the `ethereum/rpc-compat` simulation test spec. The rpc-compat simulation is automatically run as a part of the rpc simulation test, thus its exclusion from the CI. However, they can also be run in isolation if desired. ## Files Changed -`Dockerfile`: The tests are normally cloned into the repo at runtime by `ethereum/rpc-compat` in the docker image setup, but since we are running our own test cases, the dockerfile has been modified to accomodate for that. +`Dockerfile`: The tests are normally cloned into the repo at runtime by `ethereum/rpc-compat` in the docker image setup, but since we are running our own test cases, the dockerfile has been modified to accommodate for that. `tests`: These tests come from `https://github.com/ethereum/execution-apis`, but since Polaris does not support `chain.rlp`, some tests have been modified locally. \ No newline at end of file diff --git a/e2e/hive/simulators/rpc/README.md b/e2e/hive/simulators/rpc/README.md index 57524bcfe7..68167b10ea 100644 --- a/e2e/hive/simulators/rpc/README.md +++ b/e2e/hive/simulators/rpc/README.md @@ -1,6 +1,6 @@ # RPC Hive -The RPC Hive directory runs the tests specified by the `ethereum/rpc` simluation test spec. +The RPC Hive directory runs the tests specified by the `ethereum/rpc` simulation test spec. These tests are run as go functions, and required a few changes to comply with Polaris logic. From e0dc7debeb33343d5be057af23308ca379119259 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 26 Oct 2023 12:16:58 -0400 Subject: [PATCH 111/122] chore(config): reduce default miner gas-price default --- e2e/testapp/docker/local/config/app.toml | 2 +- eth/polar/config.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/testapp/docker/local/config/app.toml b/e2e/testapp/docker/local/config/app.toml index cc91de3f25..12b3d33ec4 100644 --- a/e2e/testapp/docker/local/config/app.toml +++ b/e2e/testapp/docker/local/config/app.toml @@ -323,7 +323,7 @@ etherbase = "0x0000000000000000000000000000000000000000" extra-data = "0x" # Gas price for transactions included in blocks -gas-price = "1000000000" +gas-price = "10000000" # Minimum gas limit for transactions included in blocks gas-floor = "0" diff --git a/eth/polar/config.go b/eth/polar/config.go index a5e0c9e81e..cd59152650 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -50,6 +50,7 @@ func DefaultConfig() *Config { gpoConfig := ethconfig.FullNodeGPO gpoConfig.Default = big.NewInt(gpoDefault) minerCfg := miner.DefaultConfig + minerCfg.GasPrice = big.NewInt(1e7) minerCfg.Etherbase = common.HexToAddress(developmentCoinbase) // TODO: setup proper command line flags return &Config{ From d34a7323f5f5d37a866d3b4fc01b9e5b58ee2a8f Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Thu, 26 Oct 2023 15:46:50 -0400 Subject: [PATCH 112/122] Revert "chore(config): reduce default miner gas-price default" This reverts commit e0dc7debeb33343d5be057af23308ca379119259. --- e2e/testapp/docker/local/config/app.toml | 2 +- eth/polar/config.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/e2e/testapp/docker/local/config/app.toml b/e2e/testapp/docker/local/config/app.toml index 12b3d33ec4..cc91de3f25 100644 --- a/e2e/testapp/docker/local/config/app.toml +++ b/e2e/testapp/docker/local/config/app.toml @@ -323,7 +323,7 @@ etherbase = "0x0000000000000000000000000000000000000000" extra-data = "0x" # Gas price for transactions included in blocks -gas-price = "10000000" +gas-price = "1000000000" # Minimum gas limit for transactions included in blocks gas-floor = "0" diff --git a/eth/polar/config.go b/eth/polar/config.go index cd59152650..a5e0c9e81e 100644 --- a/eth/polar/config.go +++ b/eth/polar/config.go @@ -50,7 +50,6 @@ func DefaultConfig() *Config { gpoConfig := ethconfig.FullNodeGPO gpoConfig.Default = big.NewInt(gpoDefault) minerCfg := miner.DefaultConfig - minerCfg.GasPrice = big.NewInt(1e7) minerCfg.Etherbase = common.HexToAddress(developmentCoinbase) // TODO: setup proper command line flags return &Config{ From 7dd6df9de91292a3da56e7e7aae819f6d749bcab Mon Sep 17 00:00:00 2001 From: xiaolou86 <20718693+xiaolou86@users.noreply.github.com> Date: Sat, 28 Oct 2023 03:07:39 +0800 Subject: [PATCH 113/122] chore(test): fix typo in contracts/src/testing/DistributionWrapper.sol (#1253) --- contracts/src/testing/DistributionWrapper.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/src/testing/DistributionWrapper.sol b/contracts/src/testing/DistributionWrapper.sol index 20a3c44a52..d2a0f7b6d3 100644 --- a/contracts/src/testing/DistributionWrapper.sol +++ b/contracts/src/testing/DistributionWrapper.sol @@ -60,7 +60,7 @@ contract DistributionWrapper { } /** - * @dev Withdraw the rewrads accumilated by the caller(msg.sender). + * @dev Withdraw the rewrads accumulated by the caller(msg.sender). * @param _withdrawAddress The address of the delegator. */ function setWithdrawAddress(address _withdrawAddress) external returns (bool) { @@ -68,7 +68,7 @@ contract DistributionWrapper { } /** - * @dev Withdraw the rewrads accumilated by the caller(msg.sender). + * @dev Withdraw the rewrads accumulated by the caller(msg.sender). * @param _delegatorAddress The address of the delegator. * @param _validatorAddress The address of the validator. */ @@ -77,7 +77,7 @@ contract DistributionWrapper { } /** - * @dev Withdraw the rewrads accumilated by the caller(msg.sender). + * @dev Withdraw the rewrads accumulated by the caller(msg.sender). * @param _validator The address of the validator. */ function delegate(address _validator) external payable { From 9c25a75572f5b7220e55104a7c72652c109f040b Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Mon, 30 Oct 2023 12:11:01 -0400 Subject: [PATCH 114/122] fix(miner): Do not use pending block for now (#1255) --- eth/polar/api_backend.go | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go index b810b98d73..22f86b4359 100644 --- a/eth/polar/api_backend.go +++ b/eth/polar/api_backend.go @@ -243,8 +243,10 @@ func (b *backend) BlockByNumber(_ context.Context, number rpc.BlockNumber) (*typ // Pending block is only known by the miner switch number { case rpc.PendingBlockNumber: - block := b.polar.miner.PendingBlock() - return block, nil + header := b.polar.blockchain.CurrentBlock() + return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil + // block := b.polar.miner.PendingBlock() + // return block, nil // Otherwise resolve and return the block case rpc.LatestBlockNumber: header := b.polar.blockchain.CurrentBlock() @@ -307,16 +309,25 @@ func (b *backend) StateAndHeaderByNumber( ctx context.Context, number rpc.BlockNumber, ) (state.StateDB, *types.Header, error) { + var header *types.Header // Pending state is only known by the miner if number == rpc.PendingBlockNumber { - block, state := b.polar.miner.Pending() - return state, block.Header(), nil - } - // Otherwise resolve the block number and return its state - header, err := b.HeaderByNumber(ctx, number) - if err != nil { - return nil, nil, err + header = b.polar.blockchain.CurrentBlock() + // The above code is returning a block from the blockchain based on the given header + // hash and block + // number. + // return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil + // block, state := b.polar.miner.Pending() + // return state, block.Header(), nil + } else { + // Otherwise resolve the block number and return its state + var err error + header, err = b.HeaderByNumber(ctx, number) + if err != nil { + return nil, nil, err + } } + if header == nil { // to match Geth return nil, nil, core.ErrBlockNotFound From 9e9c64fc9eabfd51ce3adb1d62f7fe3b7c864c05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 23:23:59 -0400 Subject: [PATCH 115/122] chore(deps): bump github.com/docker/docker from 24.0.5+incompatible to 24.0.7+incompatible in /e2e/precompile (#1260) Bumps [github.com/docker/docker](https://github.com/docker/docker) from 24.0.5+incompatible to 24.0.7+incompatible.
    Commits
    • 311b9ff Merge pull request #46697 from thaJeztah/24.0_backport_restart_nocancel
    • af60804 Merge pull request from GHSA-jq35-85cj-fj4p
    • 3cf363e Merge pull request #46709 from thaJeztah/24.0_backport_bump_compress
    • 05d7386 daemon: daemon.containerRestart: don't cancel restart on context cancel
    • 649c944 Merge pull request #46703 from thaJeztah/24.0_backport_atomic-layer-data-write
    • 9b20b1a Merge pull request #46702 from thaJeztah/24.0_backport_releaseNetwork_Network...
    • dd37b0b vendor: github.com/klauspost/compress v1.17.2
    • 7058c0d vendor: github.com/klauspost/compress v1.16.5
    • 57bd388 daemon: overlay2: Write layer metadata atomically
    • 05d95fd daemon: release sandbox even when NetworkDisabled
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/docker/docker&package-manager=go_modules&previous-version=24.0.5+incompatible&new-version=24.0.7+incompatible)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/berachain/polaris/network/alerts).
    Signed-off-by: dependabot[bot] Signed-off-by: Devon Bear Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Devon Bear --- e2e/precompile/go.mod | 2 +- e2e/precompile/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 022552e315..0844fc2aa5 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -67,7 +67,7 @@ require ( github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.5+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index afa08f388d..2160cf60b7 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -239,8 +239,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= From e2202a15874dbd3174749246234315ec73110ff7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:33:01 -0400 Subject: [PATCH 116/122] chore(deps): bump github.com/docker/docker from 24.0.5+incompatible to 24.0.7+incompatible in /e2e/localnet (#1259) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Devon Bear --- e2e/localnet/go.mod | 2 +- e2e/localnet/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index ecfc8dee9d..89f26a9f0d 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -3,7 +3,7 @@ module pkg.berachain.dev/polaris/e2e/localnet go 1.21 require ( - github.com/docker/docker v24.0.5+incompatible + github.com/docker/docker v24.0.7+incompatible github.com/ethereum/go-ethereum v1.13.1 github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index 00b7ecf9ed..d94818ba2b 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -58,8 +58,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etly github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= From 4742e24545c6003bd22cffa70c41df47e1da07aa Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 14:21:45 -0400 Subject: [PATCH 117/122] fix(miner): Use pending block and add nil check. (#1262) --- Makefile | 422 +----------------- {scripts => build/scripts}/constants.mk | 0 {scripts => build/scripts}/cosmos.mk | 2 +- build/scripts/main.mk | 422 ++++++++++++++++++ {scripts => build/scripts}/proto_generate.sh | 4 +- .../scripts}/proto_generate_pulsar.sh | 0 {tools => build/tools}/LICENSE | 0 {tools => build/tools}/LICENSE.header | 0 {tools => build/tools}/go.mod | 4 +- {tools => build/tools}/go.sum | 4 +- {tools => build/tools}/tools.go | 0 .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- contracts/foundry.toml | 2 +- contracts/hardhat.config.js | 2 +- contracts/src/cosmos/CosmosTypes.sol | 5 +- contracts/src/cosmos/precompile/Bank.sol | 2 +- .../src/cosmos/precompile/Distribution.sol | 2 +- .../src/cosmos/precompile/Governance.sol | 2 +- contracts/src/cosmos/precompile/Staking.sol | 2 +- .../cosmos/precompile/examples/Deploy.s.sol | 2 +- .../precompile/examples/LiquidStaking.sol | 2 +- contracts/src/testing/ConsumeGas.sol | 2 +- contracts/src/testing/SolmateERC20.sol | 2 +- cosmos/config/mocks/app_options.go | 2 +- cosmos/go.mod | 1 + cosmos/go.sum | 4 +- .../ante/eject.go => runtime/ante/ante.go} | 39 +- cosmos/runtime/runtime.go | 7 +- cosmos/txpool/ante.go | 81 ++++ cosmos/txpool/mempool.go | 10 +- cosmos/txpool/mocks/geth_tx_pool.go | 90 +++- cosmos/txpool/mocks/lifecycle.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_broadcaster.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- e2e/precompile/polard/start-node.sh | 10 +- e2e/testapp/docker/local/docker-init.sh | 10 +- e2e/testapp/entrypoint.sh | 30 +- e2e/testapp/go.mod | 1 + e2e/testapp/go.sum | 4 +- eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/polar_state_db.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- eth/eth.go | 3 + eth/go.mod | 1 + eth/go.sum | 4 +- eth/polar/api_backend.go | 40 +- go.work | 2 +- 62 files changed, 706 insertions(+), 560 deletions(-) rename {scripts => build/scripts}/constants.mk (100%) rename {scripts => build/scripts}/cosmos.mk (98%) create mode 100644 build/scripts/main.mk rename {scripts => build/scripts}/proto_generate.sh (95%) rename {scripts => build/scripts}/proto_generate_pulsar.sh (100%) rename {tools => build/tools}/LICENSE (100%) rename {tools => build/tools}/LICENSE.header (100%) rename {tools => build/tools}/go.mod (99%) rename {tools => build/tools}/go.sum (99%) rename {tools => build/tools}/tools.go (100%) rename cosmos/{lib/ante/eject.go => runtime/ante/ante.go} (53%) create mode 100644 cosmos/txpool/ante.go diff --git a/Makefile b/Makefile index d1fba61dff..6126604eb0 100644 --- a/Makefile +++ b/Makefile @@ -1,422 +1,2 @@ #!/usr/bin/make -f -include scripts/cosmos.mk scripts/constants.mk - - -# Specify the default target if none is provided -.DEFAULT_GOAL := build - -############################################################################### -### Build ### -############################################################################### - -BUILD_TARGETS := build install - -build: BUILD_ARGS=-o $(OUT_DIR)/ - -build-linux-amd64: - GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build - -build-linux-arm64: - GOOS=linux GOARCH=arm64 LEDGER_ENABLED=false $(MAKE) build - -$(BUILD_TARGETS): forge-build sync $(OUT_DIR)/ - @echo "Building ${TESTAPP_DIR}" - @cd ${CURRENT_DIR}/$(TESTAPP_DIR) && go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... - -$(OUT_DIR)/: - mkdir -p $(OUT_DIR)/ - -build-clean: - @$(MAKE) clean build - -clean: - @rm -rf .tmp/ - @rm -rf $(OUT_DIR) - @$(MAKE) forge-clean - -################# -# forge # -################# - -forge-build: | - @forge build --extra-output-files bin --extra-output-files abi --root $(CONTRACTS_DIR) - -forge-clean: | - @forge clean --root $(CONTRACTS_DIR) - - -################# -# proto # -################# - -protoImageName := "ghcr.io/cosmos/proto-builder" -protoImageVersion := "0.14.0" - -proto: - @$(MAKE) buf-lint-fix buf-lint proto-build - -proto-build: - @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./scripts/proto_generate.sh - -############################################################################### -### Docker ### -############################################################################### - -# Variables -DOCKER_TYPE ?= base -ARCH ?= arm64 -GO_VERSION ?= 1.21.3 -IMAGE_NAME ?= polard -IMAGE_VERSION ?= v0.0.0 -BASE_IMAGE ?= polard/base:$(IMAGE_VERSION) - -# Docker Paths -BASE_DOCKER_PATH = ./e2e/testapp/docker -EXEC_DOCKER_PATH = $(BASE_DOCKER_PATH)/base.Dockerfile -LOCAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/local/Dockerfile -SEED_DOCKER_PATH = $(BASE_DOCKER_PATH)/seed/Dockerfile -VAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/validator/Dockerfile -LOCALNET_CLIENT_PATH = ./e2e/precompile/polard -LOCALNET_DOCKER_PATH = $(LOCALNET_CLIENT_PATH)/Dockerfile - -# Image Build -docker-build: - @echo "Build a release docker image for the Cosmos SDK chain..." - @$(MAKE) docker-build-$(DOCKER_TYPE) - -# Docker Build Types -docker-build-base: - $(call docker-build-helper,$(EXEC_DOCKER_PATH),base) - -docker-build-local: - $(call docker-build-helper,$(LOCAL_DOCKER_PATH),local,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -docker-build-seed: - $(call docker-build-helper,$(SEED_DOCKER_PATH),seed,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -docker-build-validator: - $(call docker-build-helper,$(VAL_DOCKER_PATH),validator,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -docker-build-localnet: - $(call docker-build-helper,$(LOCALNET_DOCKER_PATH),localnet,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -# Docker Build Function -define docker-build-helper - docker build \ - --build-arg GO_VERSION=$(GO_VERSION) \ - --platform linux/$(ARCH) \ - --build-arg PRECOMPILE_CONTRACTS_DIR=$(CONTRACTS_DIR) \ - --build-arg GOOS=linux \ - --build-arg GOARCH=$(ARCH) \ - -f $(1) \ - -t $(IMAGE_NAME)/$(2):$(IMAGE_VERSION) \ - $(if $(3),$(3)) \ - . - -endef - -.PHONY: docker-build-localnet - -############################################################################### -### CodeGen ### -############################################################################### - -generate: - @$(MAKE) abigen-install moq-install mockery - @for module in $(MODULES); do \ - echo "Running go generate in $$module"; \ - (cd $$module && go generate ./...) || exit 1; \ - done - -abigen-install: - @echo "--> Installing abigen" - @go install github.com/ethereum/go-ethereum/cmd/abigen@latest - -moq-install: - @echo "--> Installing moq" - @go install github.com/matryer/moq@latest - -mockery-install: - @echo "--> Installing mockery" - @go install github.com/vektra/mockery/v2@latest - -mockery: - @$(MAKE) mockery-install - @echo "Running mockery..." - @mockery - - -############################################################################### -### Tests & Simulation ### -############################################################################### - -################# -# polard # -################# - -start: - @./e2e/testapp/entrypoint.sh - -################# -# unit # -################# - -install-ginkgo: - @echo "Installing ginkgo..." - @go install github.com/onsi/ginkgo/v2/ginkgo@latest - -test-unit: - @$(MAKE) install-ginkgo forge-test - @echo "Running unit tests..." - @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... - -test-unit-race: - @$(MAKE) install-ginkgo forge-test - @echo "Running unit tests with race detection..." - @ginkgo --race -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... - -test-unit-cover: - @$(MAKE) install-ginkgo forge-test - @echo "Running unit tests with coverage..." - @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* \ - --junit-report out.xml --cover --coverprofile "coverage-test-unit-cover.txt" --covermode atomic \ - ./... - -################# -# forge # -################# - -forge-test: - @echo "Running forge test..." - @forge test --root $(CONTRACTS_DIR) - -################# -# e2e # -################# - -test-e2e: - @$(MAKE) test-e2e-no-build - -test-e2e-no-build: - @$(MAKE) install-ginkgo - @echo "Running e2e tests..." - @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/precompile/... - - -################# -# hive # -################# - -ifndef $(GOPATH) - GOPATH=$(shell go env GOPATH) - export GOPATH -endif - -HIVE_CLONE := $(GOPATH)/src -CLONE_PATH := $(HIVE_CLONE)/.hive-e2e -SIMULATORS_ROOT := $(CLONE_PATH)/simulators -SIMULATORS_PATH := $(SIMULATORS_ROOT)/polaris/ -BASE_HIVE_DOCKER_PATH := ./e2e/hive -CLIENTS_PATH := $(CLONE_PATH)/clients/polard/ -SIMULATIONS := \ - rpc:init/genesis.json:ethclient.hive \ - rpc-compat:Dockerfile:tests \ - -# .PHONY: setup test testv view - -hive-setup: - @echo $(HIVE_CLONE) - @echo "--> Setting up Hive testing environment..." - @test ! -d $(HIVE_CLONE) && mkdir $(HIVE_CLONE) || true - @rm -rf $(CLONE_PATH) - @git clone https://github.com/ethereum/hive $(CLONE_PATH) --depth=1 - @mkdir $(SIMULATORS_PATH) - @cp -rf $(BASE_HIVE_DOCKER_PATH)/clients/polard $(CLIENTS_PATH) - @echo "Copying files..."; - @$(foreach sim,$(SIMULATIONS), \ - $(eval SIM_NAME = $(word 1, $(subst :, ,$(sim)))) \ - $(eval FILES = $(wordlist 2, $(words $(subst :, ,$(sim))), $(subst :, ,$(sim)))) \ - cp -rf $(SIMULATORS_ROOT)/ethereum/$(SIM_NAME) $(SIMULATORS_PATH); \ - $(foreach file,$(FILES), \ - cp -rf $(BASE_HIVE_DOCKER_PATH)/simulators/$(SIM_NAME)/$(file) \ - $(SIMULATORS_PATH)/$(SIM_NAME)/$(file); \ - if [ "$(file)" = "ethclient.hive" ]; then \ - cp -rf $(SIMULATORS_PATH)/$(SIM_NAME)/$(file) $(SIMULATORS_PATH)/$(SIM_NAME)/ethclient.go; \ - fi; \ - ) \ - ) - @cd $(CLONE_PATH) && go install ./... - -hive-view: - @cd $(CLONE_PATH) && \ - go build ./cmd/hiveview && \ - hiveview --serve - -# SHELL := /bin/zsh # Explicitly set to zsh as that is what you are using - -test-hive: - @cd $(CLONE_PATH) && \ - hive --sim polaris/rpc -client polard - -test-hive-v: - @cd $(CLONE_PATH) && \ - hive --sim polaris/rpc -client polard --docker.output - - - -################# -# localnet # -################# - -test-localnet: - @$(MAKE) test-localnet-no-build - -test-localnet-no-build: - @$(MAKE) install-ginkgo - @echo "Running localnet tests..." - @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/localnet/... - - -############################################################################### -### Formatting ### -############################################################################### - -############################################################################### -### Linting ### -############################################################################### - -format: - @$(MAKE) license-fix buf-lint-fix forge-lint-fix golangci-fix - -lint: - @$(MAKE) license buf-lint forge-lint golangci gosec - - -################# -# forge # -################# - -forge-lint-fix: - @echo "--> Running forge fmt" - @cd $(CONTRACTS_DIR) && forge fmt - -forge-lint: - @echo "--> Running forge lint" - @cd $(CONTRACTS_DIR) && forge fmt --check - -################# -# golangci-lint # -################# - -golangci_version=v1.54.2 - -golangci-install: - @echo "--> Installing golangci-lint $(golangci_version)" - @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version) - -golangci: - @$(MAKE) golangci-install - @echo "--> Running linter" - @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --concurrency 8 -v - -golangci-fix: - @$(MAKE) golangci-install - @echo "--> Running linter" - @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --fix --concurrency 8 -v - - -################# -# license # -################# - -license-install: - @echo "--> Installing google/addlicense" - @go install github.com/google/addlicense - -license: - @$(MAKE) license-install - @echo "--> Running addlicense with -check" - @for module in $(MODULES); do \ - (cd $$module && addlicense -check -v -f ./LICENSE.header ./.) || exit 1; \ - done - -license-fix: - @$(MAKE) license-install - @echo "--> Running addlicense" - @for module in $(MODULES); do \ - (cd $$module && addlicense -v -f ./LICENSE.header ./.) || exit 1; \ - done - - -################# -# gosec # -################# - -gosec-install: - @echo "--> Installing gosec" - @go install github.com/securego/gosec/v2/cmd/gosec - -gosec: - @$(MAKE) gosec-install - @echo "--> Running gosec" - @gosec -exclude-generated ./... - - -################# -# proto # -################# - -protoDir := "proto" - -buf-install: - @echo "--> Installing buf" - @go install github.com/bufbuild/buf/cmd/buf - -buf-lint-fix: - @$(MAKE) buf-install - @echo "--> Running buf format" - @buf format -w --error-format=json $(protoDir) - -buf-lint: - @$(MAKE) buf-install - @echo "--> Running buf lint" - @buf lint --error-format=json $(protoDir) - - -############################################################################### -### Dependencies ### -############################################################################### - -sync: | - @for module in $(MODULES); do \ - echo "Running go mod download in $$module"; \ - (cd $$module && go mod download) || exit 1; \ - done - @echo "Running go mod sync" - @go work sync - -tidy: | - @for module in $(MODULES); do \ - echo "Running go mod tidy in $$module"; \ - (cd $$module && go mod tidy) || exit 1; \ - done - -repo-rinse: | - git clean -xfd - git submodule foreach --recursive git clean -xfd - git submodule foreach --recursive git reset --hard - git submodule update --init --recursive - - -.PHONY: build build-linux-amd64 build-linux-arm64 \ - $(BUILD_TARGETS) $(OUT_DIR)/ build-clean clean \ - forge-build forge-clean proto proto-build docker-build \ - docker-build-base docker-build-local docker-build-seed \ - docker-build-validator docker-build-localnet generate \ - abigen-install moq-install mockery-install mockery \ - start test-unit test-unit-race test-unit-cover forge-test \ - test-e2e test-e2e-no-build hive-setup hive-view test-hive \ - test-hive-v test-localnet test-localnet-no-build format lint \ - forge-lint-fix forge-lint golangci-install golangci golangci-fix \ - license-install license license-fix \ - gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse +include build/scripts/main.mk diff --git a/scripts/constants.mk b/build/scripts/constants.mk similarity index 100% rename from scripts/constants.mk rename to build/scripts/constants.mk diff --git a/scripts/cosmos.mk b/build/scripts/cosmos.mk similarity index 98% rename from scripts/cosmos.mk rename to build/scripts/cosmos.mk index cdb2e41d62..1e12fa75ae 100644 --- a/scripts/cosmos.mk +++ b/build/scripts/cosmos.mk @@ -8,7 +8,7 @@ export VERSION := $(shell echo $(shell git describe --tags --always --match "v*") | sed 's/^v//') export COMMIT := $(shell git log -1 --format='%H') CURRENT_DIR = $(shell pwd) -OUT_DIR ?= $(CURDIR)/bin +OUT_DIR ?= $(CURDIR)/build/bin BINDIR ?= $(GOPATH)/bin TESTAPP_DIR = ./e2e/testapp PROJECT_NAME = $(shell git remote get-url origin | xargs basename -s .git) diff --git a/build/scripts/main.mk b/build/scripts/main.mk new file mode 100644 index 0000000000..3e531d4554 --- /dev/null +++ b/build/scripts/main.mk @@ -0,0 +1,422 @@ +#!/usr/bin/make -f +include build/scripts/cosmos.mk build/scripts/constants.mk + + +# Specify the default target if none is provided +.DEFAULT_GOAL := build + +############################################################################### +### Build ### +############################################################################### + +BUILD_TARGETS := build install + +build: BUILD_ARGS=-o $(OUT_DIR)/ + +build-linux-amd64: + GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build + +build-linux-arm64: + GOOS=linux GOARCH=arm64 LEDGER_ENABLED=false $(MAKE) build + +$(BUILD_TARGETS): forge-build sync $(OUT_DIR)/ + @echo "Building ${TESTAPP_DIR}" + @cd ${CURRENT_DIR}/$(TESTAPP_DIR) && go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... + +$(OUT_DIR)/: + mkdir -p $(OUT_DIR)/ + +build-clean: + @$(MAKE) clean build + +clean: + @rm -rf .tmp/ + @rm -rf $(OUT_DIR) + @$(MAKE) forge-clean + +################# +# forge # +################# + +forge-build: | + @forge build --extra-output-files bin --extra-output-files abi --root $(CONTRACTS_DIR) + +forge-clean: | + @forge clean --root $(CONTRACTS_DIR) + + +################# +# proto # +################# + +protoImageName := "ghcr.io/cosmos/proto-builder" +protoImageVersion := "0.14.0" + +proto: + @$(MAKE) buf-lint-fix buf-lint proto-build + +proto-build: + @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./build/scripts/proto_generate.sh + +############################################################################### +### Docker ### +############################################################################### + +# Variables +DOCKER_TYPE ?= base +ARCH ?= arm64 +GO_VERSION ?= 1.21.3 +IMAGE_NAME ?= polard +IMAGE_VERSION ?= v0.0.0 +BASE_IMAGE ?= polard/base:$(IMAGE_VERSION) + +# Docker Paths +BASE_DOCKER_PATH = ./e2e/testapp/docker +EXEC_DOCKER_PATH = $(BASE_DOCKER_PATH)/base.Dockerfile +LOCAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/local/Dockerfile +SEED_DOCKER_PATH = $(BASE_DOCKER_PATH)/seed/Dockerfile +VAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/validator/Dockerfile +LOCALNET_CLIENT_PATH = ./e2e/precompile/polard +LOCALNET_DOCKER_PATH = $(LOCALNET_CLIENT_PATH)/Dockerfile + +# Image Build +docker-build: + @echo "Build a release docker image for the Cosmos SDK chain..." + @$(MAKE) docker-build-$(DOCKER_TYPE) + +# Docker Build Types +docker-build-base: + $(call docker-build-helper,$(EXEC_DOCKER_PATH),base) + +docker-build-local: + $(call docker-build-helper,$(LOCAL_DOCKER_PATH),local,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-seed: + $(call docker-build-helper,$(SEED_DOCKER_PATH),seed,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-validator: + $(call docker-build-helper,$(VAL_DOCKER_PATH),validator,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-localnet: + $(call docker-build-helper,$(LOCALNET_DOCKER_PATH),localnet,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +# Docker Build Function +define docker-build-helper + docker build \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --platform linux/$(ARCH) \ + --build-arg PRECOMPILE_CONTRACTS_DIR=$(CONTRACTS_DIR) \ + --build-arg GOOS=linux \ + --build-arg GOARCH=$(ARCH) \ + -f $(1) \ + -t $(IMAGE_NAME)/$(2):$(IMAGE_VERSION) \ + $(if $(3),$(3)) \ + . + +endef + +.PHONY: docker-build-localnet + +############################################################################### +### CodeGen ### +############################################################################### + +generate: + @$(MAKE) abigen-install moq-install mockery + @for module in $(MODULES); do \ + echo "Running go generate in $$module"; \ + (cd $$module && go generate ./...) || exit 1; \ + done + +abigen-install: + @echo "--> Installing abigen" + @go install github.com/ethereum/go-ethereum/cmd/abigen@latest + +moq-install: + @echo "--> Installing moq" + @go install github.com/matryer/moq@latest + +mockery-install: + @echo "--> Installing mockery" + @go install github.com/vektra/mockery/v2@latest + +mockery: + @$(MAKE) mockery-install + @echo "Running mockery..." + @mockery + + +############################################################################### +### Tests & Simulation ### +############################################################################### + +################# +# polard # +################# + +start: + @./e2e/testapp/entrypoint.sh + +################# +# unit # +################# + +install-ginkgo: + @echo "Installing ginkgo..." + @go install github.com/onsi/ginkgo/v2/ginkgo@latest + +test-unit: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... + +test-unit-race: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests with race detection..." + @ginkgo --race -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... + +test-unit-cover: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests with coverage..." + @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* \ + --junit-report out.xml --cover --coverprofile "coverage-test-unit-cover.txt" --covermode atomic \ + ./... + +################# +# forge # +################# + +forge-test: + @echo "Running forge test..." + @forge test --root $(CONTRACTS_DIR) + +################# +# e2e # +################# + +test-e2e: + @$(MAKE) test-e2e-no-build + +test-e2e-no-build: + @$(MAKE) install-ginkgo + @echo "Running e2e tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/precompile/... + + +################# +# hive # +################# + +ifndef $(GOPATH) + GOPATH=$(shell go env GOPATH) + export GOPATH +endif + +HIVE_CLONE := $(GOPATH)/src +CLONE_PATH := $(HIVE_CLONE)/.hive-e2e +SIMULATORS_ROOT := $(CLONE_PATH)/simulators +SIMULATORS_PATH := $(SIMULATORS_ROOT)/polaris/ +BASE_HIVE_DOCKER_PATH := ./e2e/hive +CLIENTS_PATH := $(CLONE_PATH)/clients/polard/ +SIMULATIONS := \ + rpc:init/genesis.json:ethclient.hive \ + rpc-compat:Dockerfile:tests \ + +# .PHONY: setup test testv view + +hive-setup: + @echo $(HIVE_CLONE) + @echo "--> Setting up Hive testing environment..." + @test ! -d $(HIVE_CLONE) && mkdir $(HIVE_CLONE) || true + @rm -rf $(CLONE_PATH) + @git clone https://github.com/ethereum/hive $(CLONE_PATH) --depth=1 + @mkdir $(SIMULATORS_PATH) + @cp -rf $(BASE_HIVE_DOCKER_PATH)/clients/polard $(CLIENTS_PATH) + @echo "Copying files..."; + @$(foreach sim,$(SIMULATIONS), \ + $(eval SIM_NAME = $(word 1, $(subst :, ,$(sim)))) \ + $(eval FILES = $(wordlist 2, $(words $(subst :, ,$(sim))), $(subst :, ,$(sim)))) \ + cp -rf $(SIMULATORS_ROOT)/ethereum/$(SIM_NAME) $(SIMULATORS_PATH); \ + $(foreach file,$(FILES), \ + cp -rf $(BASE_HIVE_DOCKER_PATH)/simulators/$(SIM_NAME)/$(file) \ + $(SIMULATORS_PATH)/$(SIM_NAME)/$(file); \ + if [ "$(file)" = "ethclient.hive" ]; then \ + cp -rf $(SIMULATORS_PATH)/$(SIM_NAME)/$(file) $(SIMULATORS_PATH)/$(SIM_NAME)/ethclient.go; \ + fi; \ + ) \ + ) + @cd $(CLONE_PATH) && go install ./... + +hive-view: + @cd $(CLONE_PATH) && \ + go build ./cmd/hiveview && \ + hiveview --serve + +# SHELL := /bin/zsh # Explicitly set to zsh as that is what you are using + +test-hive: + @cd $(CLONE_PATH) && \ + hive --sim polaris/rpc -client polard + +test-hive-v: + @cd $(CLONE_PATH) && \ + hive --sim polaris/rpc -client polard --docker.output + + + +################# +# localnet # +################# + +test-localnet: + @$(MAKE) test-localnet-no-build + +test-localnet-no-build: + @$(MAKE) install-ginkgo + @echo "Running localnet tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/localnet/... + + +############################################################################### +### Formatting ### +############################################################################### + +############################################################################### +### Linting ### +############################################################################### + +format: + @$(MAKE) license-fix buf-lint-fix forge-lint-fix golangci-fix + +lint: + @$(MAKE) license buf-lint forge-lint golangci gosec + + +################# +# forge # +################# + +forge-lint-fix: + @echo "--> Running forge fmt" + @cd $(CONTRACTS_DIR) && forge fmt + +forge-lint: + @echo "--> Running forge lint" + @cd $(CONTRACTS_DIR) && forge fmt --check + +################# +# golangci-lint # +################# + +golangci_version=v1.54.2 + +golangci-install: + @echo "--> Installing golangci-lint $(golangci_version)" + @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version) + +golangci: + @$(MAKE) golangci-install + @echo "--> Running linter" + @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --concurrency 8 -v + +golangci-fix: + @$(MAKE) golangci-install + @echo "--> Running linter" + @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --fix --concurrency 8 -v + + +################# +# license # +################# + +license-install: + @echo "--> Installing google/addlicense" + @go install github.com/google/addlicense + +license: + @$(MAKE) license-install + @echo "--> Running addlicense with -check" + @for module in $(MODULES); do \ + (cd $$module && addlicense -check -v -f ./LICENSE.header ./.) || exit 1; \ + done + +license-fix: + @$(MAKE) license-install + @echo "--> Running addlicense" + @for module in $(MODULES); do \ + (cd $$module && addlicense -v -f ./LICENSE.header ./.) || exit 1; \ + done + + +################# +# gosec # +################# + +gosec-install: + @echo "--> Installing gosec" + @go install github.com/securego/gosec/v2/cmd/gosec + +gosec: + @$(MAKE) gosec-install + @echo "--> Running gosec" + @gosec -exclude-generated ./... + + +################# +# proto # +################# + +protoDir := "proto" + +buf-install: + @echo "--> Installing buf" + @go install github.com/bufbuild/buf/cmd/buf + +buf-lint-fix: + @$(MAKE) buf-install + @echo "--> Running buf format" + @buf format -w --error-format=json $(protoDir) + +buf-lint: + @$(MAKE) buf-install + @echo "--> Running buf lint" + @buf lint --error-format=json $(protoDir) + + +############################################################################### +### Dependencies ### +############################################################################### + +sync: | + @for module in $(MODULES); do \ + echo "Running go mod download in $$module"; \ + (cd $$module && go mod download) || exit 1; \ + done + @echo "Running go mod sync" + @go work sync + +tidy: | + @for module in $(MODULES); do \ + echo "Running go mod tidy in $$module"; \ + (cd $$module && go mod tidy) || exit 1; \ + done + +repo-rinse: | + git clean -xfd + git submodule foreach --recursive git clean -xfd + git submodule foreach --recursive git reset --hard + git submodule update --init --recursive + + +.PHONY: build build-linux-amd64 build-linux-arm64 \ + $(BUILD_TARGETS) $(OUT_DIR)/ build-clean clean \ + forge-build forge-clean proto proto-build docker-build \ + docker-build-base docker-build-local docker-build-seed \ + docker-build-validator docker-build-localnet generate \ + abigen-install moq-install mockery-install mockery \ + start test-unit test-unit-race test-unit-cover forge-test \ + test-e2e test-e2e-no-build hive-setup hive-view test-hive \ + test-hive-v test-localnet test-localnet-no-build format lint \ + forge-lint-fix forge-lint golangci-install golangci golangci-fix \ + license-install license license-fix \ + gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse diff --git a/scripts/proto_generate.sh b/build/scripts/proto_generate.sh similarity index 95% rename from scripts/proto_generate.sh rename to build/scripts/proto_generate.sh index 3a91413c58..e6bedc2956 100755 --- a/scripts/proto_generate.sh +++ b/build/scripts/proto_generate.sh @@ -24,7 +24,7 @@ # How to run manually: # docker build --pull --rm -f "contrib/devtools/Dockerfile" -t cosmossdk-proto:latest "contrib/devtools" -# docker run --rm -v $(pwd):/workspace --workdir /workspace cosmossdk-proto sh ./scripts/protocgen.sh +# docker run --rm -v $(pwd):/workspace --workdir /workspace cosmossdk-proto sh ./build/scripts/protocgen.sh set -e @@ -49,4 +49,4 @@ rm -rf pkg.berachain.dev cd ../ -./scripts/proto_generate_pulsar.sh \ No newline at end of file +./build/scripts/proto_generate_pulsar.sh \ No newline at end of file diff --git a/scripts/proto_generate_pulsar.sh b/build/scripts/proto_generate_pulsar.sh similarity index 100% rename from scripts/proto_generate_pulsar.sh rename to build/scripts/proto_generate_pulsar.sh diff --git a/tools/LICENSE b/build/tools/LICENSE similarity index 100% rename from tools/LICENSE rename to build/tools/LICENSE diff --git a/tools/LICENSE.header b/build/tools/LICENSE.header similarity index 100% rename from tools/LICENSE.header rename to build/tools/LICENSE.header diff --git a/tools/go.mod b/build/tools/go.mod similarity index 99% rename from tools/go.mod rename to build/tools/go.mod index 4bb3abd29b..5a3ea35987 100644 --- a/tools/go.mod +++ b/build/tools/go.mod @@ -1,4 +1,4 @@ -module pkg.berachain.dev/polaris/tools +module pkg.berachain.dev/polaris/build/tools go 1.21 @@ -77,7 +77,7 @@ require ( github.com/denis-tingaikin/go-header v0.4.3 // indirect github.com/docker/cli v24.0.4+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.5+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect diff --git a/tools/go.sum b/build/tools/go.sum similarity index 99% rename from tools/go.sum rename to build/tools/go.sum index cb210caf6e..ff3fd2ad3c 100644 --- a/tools/go.sum +++ b/build/tools/go.sum @@ -206,8 +206,8 @@ github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAA github.com/docker/cli v24.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= diff --git a/tools/tools.go b/build/tools/tools.go similarity index 100% rename from tools/tools.go rename to build/tools/tools.go diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index 5bcb39485f..5d2b38f621 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -59,7 +59,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea26469706673582212204851c65929628c6917f205d63c2ed1fe53414a6ef5256c40efcb934edb9babd164736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea264697066735822122036ff336a24a8816f73b0a48f1a4c677706bb73e1a2f03943beba1f2f2136722b64736f6c63430008160033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index 7f38d198c2..db10938834 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220369599000ac20c2dd34275978159c17a582d97c37ca7e592840b87f6f018478864736f6c63430008160033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index 1534feef92..1a632423ec 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea264697066735822122043654432997c95922bfcf12c9cded90160bd69b0223f1939299c88cc6eb9f4c664736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212205cc17fb7a79262b76c789b44c67146ad8043809a0aa57a12a63e0eacb3a87ef364736f6c63430008160033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index c571e43323..b2e4b68be0 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -80,7 +80,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea26469706673582212203a7ddd435312b1bb86536949e71389633ba2796df3994b5da3a8ce07417a5b4264736f6c63430008150033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea2646970667358221220474767dcc81f6675e7195bf1321ab8fa53f81d082262705c435f0a6f41e55c0264736f6c63430008160033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 74deba0f5b..9be0e8a75c 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220e1befea2f1d88361e22fa46de66a0946314b8d5bf3a55903625d53ee040c04d264736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b506040516200318a3803806200318a83398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612923620008675f395f8181610907015281816109ec01528181610ba601528181610c66015261116f01525f6108e001525f6108ac01525f61088701526129235ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d91906114fb565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115b9565b6104cd565b6040516101699190611611565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b6040516101939190611639565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611652565b6105c0565b6040516101cf9190611611565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a2565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116e8565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b9190611719565b60405180910390f35b34801561025f575f80fd5b50610268610905565b604051610275919061178d565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117a6565b610929565b6040516102b19190611639565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117a6565b61093e565b6040516102ed9190611639565b60405180910390f35b348015610301575f80fd5b5061030a610953565b60405161031791906114fb565b60405180910390f35b34801561032b575f80fd5b506103346109df565b6040516103419190611888565b60405180910390f35b610364600480360381019061035f91906116a2565b610b62565b005b348015610371575f80fd5b5061038c600480360381019061038791906115b9565b610d52565b6040516103999190611611565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c391906118fc565b610e5f565b005b3480156103d5575f80fd5b506103f060048036038101906103eb9190611999565b61114c565b6040516103fd9190611639565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117a6565b61116c565b6040516104399190611639565b60405180910390f35b5f805461044e90611a04565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a04565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a89190611639565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a61565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a61565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e79190611639565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e338261120e565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112d9565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a04565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a04565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e961142e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b80565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123dd565b5090505f815167ffffffffffffffff811115610aa457610aa3611ba4565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5857828181518110610af357610af2612453565b5b60200260200101515f0151828281518110610b1157610b10612453565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610ad7565b5080935050505090565b5f8103610b9b576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba361142e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610bfd9190611b80565b5f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c3f91906123dd565b5090505f815f81518110610c5657610c55612453565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cbf92919061248f565b6020604051808303815f875af1158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff91906124b6565b905080610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d389061252b565b60405180910390fd5b610d4b3386611363565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d9f9190611a61565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e4d9190611639565b60405180910390a36001905092915050565b42841015610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990612593565b60405180910390fd5b5f6001610ead6108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f32969594939291906125b1565b60405160208183030381529060405280519060200120604051602001610f59929190612684565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f8e94939291906126ba565b6020604051602081039080840390855afa158015610fae573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102157508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612747565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161113b9190611639565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111c8929190612765565b602060405180830381865afa1580156111e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611207919061278c565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461125a9190611a61565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112cd9190611639565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516113099190612853565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001611348959493929190612869565b60405160208183030381529060405280519060200120905090565b8060025f82825461137491906128ba565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114229190611639565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114a857808201518184015260208101905061148d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114cd82611471565b6114d7818561147b565b93506114e781856020860161148b565b6114f0816114b3565b840191505092915050565b5f6020820190508181035f83015261151381846114c3565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115558261152c565b9050919050565b6115658161154b565b811461156f575f80fd5b50565b5f813590506115808161155c565b92915050565b5f819050919050565b61159881611586565b81146115a2575f80fd5b50565b5f813590506115b38161158f565b92915050565b5f80604083850312156115cf576115ce611524565b5b5f6115dc85828601611572565b92505060206115ed858286016115a5565b9150509250929050565b5f8115159050919050565b61160b816115f7565b82525050565b5f6020820190506116245f830184611602565b92915050565b61163381611586565b82525050565b5f60208201905061164c5f83018461162a565b92915050565b5f805f6060848603121561166957611668611524565b5b5f61167686828701611572565b935050602061168786828701611572565b9250506040611698868287016115a5565b9150509250925092565b5f602082840312156116b7576116b6611524565b5b5f6116c4848285016115a5565b91505092915050565b5f60ff82169050919050565b6116e2816116cd565b82525050565b5f6020820190506116fb5f8301846116d9565b92915050565b5f819050919050565b61171381611701565b82525050565b5f60208201905061172c5f83018461170a565b92915050565b5f819050919050565b5f61175561175061174b8461152c565b611732565b61152c565b9050919050565b5f6117668261173b565b9050919050565b5f6117778261175c565b9050919050565b6117878161176d565b82525050565b5f6020820190506117a05f83018461177e565b92915050565b5f602082840312156117bb576117ba611524565b5b5f6117c884828501611572565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6118038161154b565b82525050565b5f61181483836117fa565b60208301905092915050565b5f602082019050919050565b5f611836826117d1565b61184081856117db565b935061184b836117eb565b805f5b8381101561187b5781516118628882611809565b975061186d83611820565b92505060018101905061184e565b5085935050505092915050565b5f6020820190508181035f8301526118a0818461182c565b905092915050565b6118b1816116cd565b81146118bb575f80fd5b50565b5f813590506118cc816118a8565b92915050565b6118db81611701565b81146118e5575f80fd5b50565b5f813590506118f6816118d2565b92915050565b5f805f805f805f60e0888a03121561191757611916611524565b5b5f6119248a828b01611572565b97505060206119358a828b01611572565b96505060406119468a828b016115a5565b95505060606119578a828b016115a5565b94505060806119688a828b016118be565b93505060a06119798a828b016118e8565b92505060c061198a8a828b016118e8565b91505092959891949750929550565b5f80604083850312156119af576119ae611524565b5b5f6119bc85828601611572565b92505060206119cd85828601611572565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a1b57607f821691505b602082108103611a2e57611a2d6119d7565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a6b82611586565b9150611a7683611586565b9250828203905081811115611a8e57611a8d611a34565b5b92915050565b5f82825260208201905092915050565b5f611aae82611471565b611ab88185611a94565b9350611ac881856020860161148b565b611ad1816114b3565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611af881611adc565b82525050565b611b07816115f7565b82525050565b5f60a083015f8301518482035f860152611b278282611aa4565b9150506020830151611b3c6020860182611aef565b506040830151611b4f6040860182611aef565b506060830151611b626060860182611afe565b506080830151611b756080860182611afe565b508091505092915050565b5f6020820190508181035f830152611b988184611b0d565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611bda826114b3565b810181811067ffffffffffffffff82111715611bf957611bf8611ba4565b5b80604052505050565b5f611c0b61151b565b9050611c178282611bd1565b919050565b5f67ffffffffffffffff821115611c3657611c35611ba4565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c618161155c565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8557611c84611ba4565b5b611c8e826114b3565b9050602081019050919050565b5f611cad611ca884611c6b565b611c02565b905082815260208101848484011115611cc957611cc8611c67565b5b611cd484828561148b565b509392505050565b5f82601f830112611cf057611cef611ba0565b5b8151611d00848260208601611c9b565b91505092915050565b611d12816115f7565b8114611d1c575f80fd5b50565b5f81519050611d2d81611d09565b92915050565b5f67ffffffffffffffff821115611d4d57611d4c611ba4565b5b611d56826114b3565b9050602081019050919050565b5f611d75611d7084611d33565b611c02565b905082815260208101848484011115611d9157611d90611c67565b5b611d9c84828561148b565b509392505050565b5f82601f830112611db857611db7611ba0565b5b8151611dc8848260208601611d63565b91505092915050565b5f81519050611ddf8161158f565b92915050565b5f60a08284031215611dfa57611df9611c4b565b5b611e0460a0611c02565b90505f82015167ffffffffffffffff811115611e2357611e22611c4f565b5b611e2f84828501611da4565b5f83015250602082015167ffffffffffffffff811115611e5257611e51611c4f565b5b611e5e84828501611da4565b602083015250604082015167ffffffffffffffff811115611e8257611e81611c4f565b5b611e8e84828501611da4565b604083015250606082015167ffffffffffffffff811115611eb257611eb1611c4f565b5b611ebe84828501611da4565b606083015250608082015167ffffffffffffffff811115611ee257611ee1611c4f565b5b611eee84828501611da4565b60808301525092915050565b5f8160070b9050919050565b611f0f81611efa565b8114611f19575f80fd5b50565b5f81519050611f2a81611f06565b92915050565b5f60608284031215611f4557611f44611c4b565b5b611f4f6060611c02565b90505f611f5e84828501611dd1565b5f830152506020611f7184828501611dd1565b6020830152506040611f8584828501611dd1565b60408301525092915050565b5f60808284031215611fa657611fa5611c4b565b5b611fb06040611c02565b90505f611fbf84828501611f30565b5f83015250606082015167ffffffffffffffff811115611fe257611fe1611c4f565b5b611fee84828501611da4565b60208301525092915050565b5f67ffffffffffffffff82111561201457612013611ba4565b5b602082029050602081019050919050565b61202e81611adc565b8114612038575f80fd5b50565b5f8151905061204981612025565b92915050565b5f61206161205c84611ffa565b611c02565b9050808382526020820190506020840283018581111561208457612083611c47565b5b835b818110156120ad5780612099888261203b565b845260208401935050602081019050612086565b5050509392505050565b5f82601f8301126120cb576120ca611ba0565b5b81516120db84826020860161204f565b91505092915050565b5f6101a082840312156120fa576120f9611c4b565b5b6121056101a0611c02565b90505f61211484828501611c53565b5f83015250602082015167ffffffffffffffff81111561213757612136611c4f565b5b61214384828501611cdc565b602083015250604061215784828501611d1f565b604083015250606082015167ffffffffffffffff81111561217b5761217a611c4f565b5b61218784828501611da4565b606083015250608061219b84828501611dd1565b60808301525060a06121af84828501611dd1565b60a08301525060c082015167ffffffffffffffff8111156121d3576121d2611c4f565b5b6121df84828501611de5565b60c08301525060e06121f384828501611f1c565b60e08301525061010082015167ffffffffffffffff81111561221857612217611c4f565b5b61222484828501611da4565b6101008301525061012082015167ffffffffffffffff81111561224a57612249611c4f565b5b61225684828501611f91565b6101208301525061014061226c84828501611dd1565b6101408301525061016061228284828501611f1c565b6101608301525061018082015167ffffffffffffffff8111156122a8576122a7611c4f565b5b6122b4848285016120b7565b6101808301525092915050565b5f6122d36122ce84611c1c565b611c02565b905080838252602082019050602084028301858111156122f6576122f5611c47565b5b835b8181101561233d57805167ffffffffffffffff81111561231b5761231a611ba0565b5b80860161232889826120e4565b855260208501945050506020810190506122f8565b5050509392505050565b5f82601f83011261235b5761235a611ba0565b5b815161236b8482602086016122c1565b91505092915050565b5f6040828403121561238957612388611c4b565b5b6123936040611c02565b90505f82015167ffffffffffffffff8111156123b2576123b1611c4f565b5b6123be84828501611da4565b5f8301525060206123d18482850161203b565b60208301525092915050565b5f80604083850312156123f3576123f2611524565b5b5f83015167ffffffffffffffff8111156124105761240f611528565b5b61241c85828601612347565b925050602083015167ffffffffffffffff81111561243d5761243c611528565b5b61244985828601612374565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6124898161154b565b82525050565b5f6040820190506124a25f830185612480565b6124af602083018461162a565b9392505050565b5f602082840312156124cb576124ca611524565b5b5f6124d884828501611d1f565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f61251560128361147b565b9150612520826124e1565b602082019050919050565b5f6020820190508181035f83015261254281612509565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61257d60178361147b565b915061258882612549565b602082019050919050565b5f6020820190508181035f8301526125aa81612571565b9050919050565b5f60c0820190506125c45f83018961170a565b6125d16020830188612480565b6125de6040830187612480565b6125eb606083018661162a565b6125f8608083018561162a565b61260560a083018461162a565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61264e600283612610565b91506126598261261a565b600282019050919050565b5f819050919050565b61267e61267982611701565b612664565b82525050565b5f61268e82612642565b915061269a828561266d565b6020820191506126aa828461266d565b6020820191508190509392505050565b5f6080820190506126cd5f83018761170a565b6126da60208301866116d9565b6126e7604083018561170a565b6126f4606083018461170a565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f612731600e8361147b565b915061273c826126fd565b602082019050919050565b5f6020820190508181035f83015261275e81612725565b9050919050565b5f6040820190506127785f830185612480565b6127856020830184612480565b9392505050565b5f602082840312156127a1576127a0611524565b5b5f6127ae84828501611dd1565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f81546127df81611a04565b6127e981866127b7565b9450600182165f811461280357600181146128185761284a565b60ff198316865281151582028601935061284a565b612821856127c1565b5f5b8381101561284257815481890152600182019150602081019050612823565b838801955050505b50505092915050565b5f61285e82846127d3565b915081905092915050565b5f60a08201905061287c5f83018861170a565b612889602083018761170a565b612896604083018661170a565b6128a3606083018561162a565b6128b06080830184612480565b9695505050505050565b5f6128c482611586565b91506128cf83611586565b92508282019050808211156128e7576128e6611a34565b5b9291505056fea26469706673582212204181e33327d3b449da71947774c4d087ef74cd7b352e93f17a7074365cbc412664736f6c63430008160033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index d90f5ec8c9..94dc29a0cb 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122032de415702619c2679a6596f73b8062fb27ef9e79eecaa57e39997b2e4430c3864736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220ece9db4f829fb1e02e42eb683059b0e791be368d87d36b1be8ab1696fa7a797164736f6c63430008160033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index ee50028de0..264f1c1d27 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea264697066735822122088b82cac4f015144f3e0155de8794578983afeab3f8e52677bc38859aea688e064736f6c63430008160033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/foundry.toml b/contracts/foundry.toml index aaa72f417c..d26fb4b959 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -2,7 +2,7 @@ fuzz_runs = 1024 ignored_error_codes = [1878, 5574] evm_version = 'shanghai' -solc_version = '0.8.21' +solc_version = '0.8.22' cache = true force = false optimizer = false diff --git a/contracts/hardhat.config.js b/contracts/hardhat.config.js index 91a374be75..f5bebd7ecc 100644 --- a/contracts/hardhat.config.js +++ b/contracts/hardhat.config.js @@ -27,7 +27,7 @@ /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.18", + solidity: "0.8.22", defaultNetwork: "localhost", networks: { hardhat: {}, diff --git a/contracts/src/cosmos/CosmosTypes.sol b/contracts/src/cosmos/CosmosTypes.sol index 559bd213f8..d081d06ecb 100644 --- a/contracts/src/cosmos/CosmosTypes.sol +++ b/contracts/src/cosmos/CosmosTypes.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; /** * @dev This library contains types used by the Cosmos module. @@ -64,7 +64,10 @@ library Cosmos { */ contract CosmosTypes { function coin(Cosmos.Coin calldata) public pure {} + function pageRequest(Cosmos.PageRequest calldata) public pure {} + function pageResponse(Cosmos.PageResponse calldata) public pure {} + function codecAny(Cosmos.CodecAny calldata) public pure {} } diff --git a/contracts/src/cosmos/precompile/Bank.sol b/contracts/src/cosmos/precompile/Bank.sol index 6a618cc455..e9f997c5c6 100644 --- a/contracts/src/cosmos/precompile/Bank.sol +++ b/contracts/src/cosmos/precompile/Bank.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/Distribution.sol b/contracts/src/cosmos/precompile/Distribution.sol index e959fe8a3c..b1570610e8 100644 --- a/contracts/src/cosmos/precompile/Distribution.sol +++ b/contracts/src/cosmos/precompile/Distribution.sol @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/Governance.sol b/contracts/src/cosmos/precompile/Governance.sol index 009872a5b9..e52efee5cb 100644 --- a/contracts/src/cosmos/precompile/Governance.sol +++ b/contracts/src/cosmos/precompile/Governance.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/Staking.sol b/contracts/src/cosmos/precompile/Staking.sol index 26750e829a..4af2eadbd3 100644 --- a/contracts/src/cosmos/precompile/Staking.sol +++ b/contracts/src/cosmos/precompile/Staking.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/examples/Deploy.s.sol b/contracts/src/cosmos/precompile/examples/Deploy.s.sol index 112fc0621e..b84fb7a455 100644 --- a/contracts/src/cosmos/precompile/examples/Deploy.s.sol +++ b/contracts/src/cosmos/precompile/examples/Deploy.s.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import "../../../../lib/forge-std/src/Script.sol"; import "../../../../lib/forge-std/src/console2.sol"; diff --git a/contracts/src/cosmos/precompile/examples/LiquidStaking.sol b/contracts/src/cosmos/precompile/examples/LiquidStaking.sol index bd41b67dd9..60c34f3d2a 100644 --- a/contracts/src/cosmos/precompile/examples/LiquidStaking.sol +++ b/contracts/src/cosmos/precompile/examples/LiquidStaking.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.17; +pragma solidity 0.8.22; import {IStakingModule} from "../Staking.sol"; import {ERC20} from "../../../../lib/ERC20.sol"; diff --git a/contracts/src/testing/ConsumeGas.sol b/contracts/src/testing/ConsumeGas.sol index 6cf3d822b5..7430584c93 100644 --- a/contracts/src/testing/ConsumeGas.sol +++ b/contracts/src/testing/ConsumeGas.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; contract ConsumeGas { event GasConsumed(uint256 gasUsed); diff --git a/contracts/src/testing/SolmateERC20.sol b/contracts/src/testing/SolmateERC20.sol index 7069f8398c..0ba13ed565 100644 --- a/contracts/src/testing/SolmateERC20.sol +++ b/contracts/src/testing/SolmateERC20.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {ERC20} from "../../lib/ERC20.sol"; diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go index 75bd3c1a4d..9c73a94b2b 100644 --- a/cosmos/config/mocks/app_options.go +++ b/cosmos/config/mocks/app_options.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/go.mod b/cosmos/go.mod index a1a613ee90..1bf630da1f 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -83,6 +83,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 1f6df18251..0032989a33 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -259,8 +259,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= diff --git a/cosmos/lib/ante/eject.go b/cosmos/runtime/ante/ante.go similarity index 53% rename from cosmos/lib/ante/eject.go rename to cosmos/runtime/ante/ante.go index a8ed64abd2..367127ab9c 100644 --- a/cosmos/lib/ante/eject.go +++ b/cosmos/runtime/ante/ante.go @@ -21,51 +21,18 @@ package ante import ( - "errors" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/lib/utils" + "pkg.berachain.dev/polaris/cosmos/txpool" ) -const numBlocksWait = 10 - // NewAnteHandler creates a new instance of AnteHandler with EjectOnRecheckTxDecorator. -func NewAnteHandler() sdk.AnteHandler { +func NewAnteHandler(mempool *txpool.Mempool) sdk.AnteHandler { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), - &EjectOnRecheckTxDecorator{ - seen: make(map[common.Hash]uint64), - }, + mempool, } return sdk.ChainAnteDecorators(anteDecorators...) } - -// EjectOnRecheckTxDecorator will return an error if the context is a recheck tx. -// This is used to forcibly eject transactions from the CometBFT mempool after they -// have been passed down to the application, as we want to prevent the comet mempool -// from growing in size. -type EjectOnRecheckTxDecorator struct { - seen map[common.Hash]uint64 -} - -// Antehandle implements sdk.AnteHandler. -func (e *EjectOnRecheckTxDecorator) AnteHandle( - ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, -) (sdk.Context, error) { - msgs := tx.GetMsgs() - if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { - hash := wet.Unwrap().Hash() - e.seen[hash]++ - if e.seen[hash] > numBlocksWait { - delete(e.seen, hash) // prevent leak - return ctx, errors.New("recheck tx") - } - } - - return next(ctx, tx, simulate) -} diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 8ed6635e2e..324386800d 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -32,9 +32,9 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" - antelib "pkg.berachain.dev/polaris/cosmos/lib/ante" libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" + antelib "pkg.berachain.dev/polaris/cosmos/runtime/ante" "pkg.berachain.dev/polaris/cosmos/runtime/comet" "pkg.berachain.dev/polaris/cosmos/txpool" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -93,7 +93,7 @@ func New( } // Wrap the geth miner and txpool with the cosmos miner and txpool. - p.WrappedTxPool = txpool.New(p.TxPool()) + p.WrappedTxPool = txpool.New(p.Blockchain(), p.TxPool()) p.WrappedMiner = miner.New(p.Miner()) return p @@ -110,8 +110,7 @@ func (p *Polaris) Build(app CosmosApp, ek EVMKeeper) error { return err } - // Set the ante handler to nil, since it is not needed. - app.SetAnteHandler(antelib.NewAnteHandler()) + app.SetAnteHandler(antelib.NewAnteHandler(p.WrappedTxPool)) return nil } diff --git a/cosmos/txpool/ante.go b/cosmos/txpool/ante.go new file mode 100644 index 0000000000..346d6c1988 --- /dev/null +++ b/cosmos/txpool/ante.go @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/core/txpool" + + "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/common" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/lib/utils" +) + +// AnteHandle implements sdk.AnteHandler. +// It is used to determine whether transactions should be ejected +// from the comet mempool. +func (m *Mempool) AnteHandle( + ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, +) (sdk.Context, error) { + msgs := tx.GetMsgs() + + // We only want to eject transactions from comet on recheck. + if ctx.ExecMode() == sdk.ExecModeReCheck { + if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { + if m.shouldEject(wet.Unwrap()) { + return ctx, errors.New("eject from comet mempool") + } + } + } + return next(ctx, tx, simulate) +} + +// shouldEject returns true if the transaction should be ejected from the CometBFT mempool. +func (m *Mempool) shouldEject(tx *coretypes.Transaction) bool { + if tx == nil { + return false + } + txStatus := m.txStatus(tx.Hash()) + + // Ejection conditions + // 1. If the transaction has been included in a block. + // 2. If the transaction is unknown to the node. + return txStatus == txpool.TxStatusIncluded || txStatus == txpool.TxStatusUnknown +} + +// txStatus returns the status of the transaction. +func (m *Mempool) txStatus(hash common.Hash) txpool.TxStatus { + // Looking for the transaction in txpool first. + status := m.txpool.Status(hash) + + // If the transaction is unknown to the pool, try looking it up locally. + if status == txpool.TxStatusUnknown { + lookup := m.chain.GetTransactionLookup(hash) + if lookup != nil { + status = txpool.TxStatusIncluded + } + } + return status +} diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index a3039799e5..db1df4166e 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -33,6 +33,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth" + "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/lib/utils" ) @@ -49,19 +50,26 @@ type Lifecycle interface { Stop() error } +// GethTxPool is used for generating mocks. +type GethTxPool interface { + eth.TxPool +} + // Mempool is a mempool that adheres to the cosmos mempool interface. // It purposefully does not implement `Select` or `Remove` as the purpose of this mempool // is to allow for transactions coming in from CometBFT's gossip to be added to the underlying // geth txpool during `CheckTx`, that is the only purpose of `Mempool“. type Mempool struct { txpool eth.TxPool + chain core.ChainReader handler Lifecycle } // NewMempool creates a new Mempool. -func New(txpool eth.TxPool) *Mempool { +func New(chain core.ChainReader, txpool eth.TxPool) *Mempool { return &Mempool{ txpool: txpool, + chain: chain, } } diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index 13e8837024..1134b2a4b0 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,9 +1,13 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks import ( + common "github.com/ethereum/go-ethereum/common" core "github.com/ethereum/go-ethereum/core" + + coretxpool "github.com/ethereum/go-ethereum/core/txpool" + event "github.com/ethereum/go-ethereum/event" mock "github.com/stretchr/testify/mock" @@ -70,6 +74,48 @@ func (_c *GethTxPool_Add_Call) RunAndReturn(run func([]*types.Transaction, bool, return _c } +// Has provides a mock function with given fields: hash +func (_m *GethTxPool) Has(hash common.Hash) bool { + ret := _m.Called(hash) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Hash) bool); ok { + r0 = rf(hash) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// GethTxPool_Has_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Has' +type GethTxPool_Has_Call struct { + *mock.Call +} + +// Has is a helper method to define mock.On call +// - hash common.Hash +func (_e *GethTxPool_Expecter) Has(hash interface{}) *GethTxPool_Has_Call { + return &GethTxPool_Has_Call{Call: _e.mock.On("Has", hash)} +} + +func (_c *GethTxPool_Has_Call) Run(run func(hash common.Hash)) *GethTxPool_Has_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *GethTxPool_Has_Call) Return(_a0 bool) *GethTxPool_Has_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GethTxPool_Has_Call) RunAndReturn(run func(common.Hash) bool) *GethTxPool_Has_Call { + _c.Call.Return(run) + return _c +} + // Stats provides a mock function with given fields: func (_m *GethTxPool) Stats() (int, int) { ret := _m.Called() @@ -121,6 +167,48 @@ func (_c *GethTxPool_Stats_Call) RunAndReturn(run func() (int, int)) *GethTxPool return _c } +// Status provides a mock function with given fields: hash +func (_m *GethTxPool) Status(hash common.Hash) coretxpool.TxStatus { + ret := _m.Called(hash) + + var r0 coretxpool.TxStatus + if rf, ok := ret.Get(0).(func(common.Hash) coretxpool.TxStatus); ok { + r0 = rf(hash) + } else { + r0 = ret.Get(0).(coretxpool.TxStatus) + } + + return r0 +} + +// GethTxPool_Status_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Status' +type GethTxPool_Status_Call struct { + *mock.Call +} + +// Status is a helper method to define mock.On call +// - hash common.Hash +func (_e *GethTxPool_Expecter) Status(hash interface{}) *GethTxPool_Status_Call { + return &GethTxPool_Status_Call{Call: _e.mock.On("Status", hash)} +} + +func (_c *GethTxPool_Status_Call) Run(run func(hash common.Hash)) *GethTxPool_Status_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *GethTxPool_Status_Call) Return(_a0 coretxpool.TxStatus) *GethTxPool_Status_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GethTxPool_Status_Call) RunAndReturn(run func(common.Hash) coretxpool.TxStatus) *GethTxPool_Status_Call { + _c.Call.Return(run) + return _c +} + // SubscribeNewTxsEvent provides a mock function with given fields: _a0 func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Subscription { ret := _m.Called(_a0) diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index 10149b6675..ea092e3e29 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index 7dada2b96b..ae28d4c089 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index ce56bd8777..4f9f4703b8 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index ad301bbf86..c85399b9ac 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 5cf02ba74f..d15bece59d 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index 92f0989765..d7a69f443e 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/e2e/precompile/polard/start-node.sh b/e2e/precompile/polard/start-node.sh index 2bb37aa1ed..3ece948c62 100755 --- a/e2e/precompile/polard/start-node.sh +++ b/e2e/precompile/polard/start-node.sh @@ -30,7 +30,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance +# Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="/" # to trace evm #TRACE="--trace" @@ -99,11 +99,11 @@ jq '.app_state["evm"]["alloc"]["acc1319Fe722A198F395F0164066ED4E309439Bf"]["bala # Sign genesis transaction polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis -## 1. Back to `./bin/polard keys add` step, init more keys -## 2. Back to `./bin/polard add-genesis-account` step, add balance for those -## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` +## 1. Back to `./build/bin/polard keys add` step, init more keys +## 2. Back to `./build/bin/polard add-genesis-account` step, add balance for those +## 3. Clone this ~/../build/bin/polard home directory into some others, let's say `~/.cloned./build/bin/polard` ## 4. Run `gentx` in each of those folders -## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` +## 5. Copy the `gentx-*` folders under `~/.cloned./build/bin/polard/config/gentx/` folders into the original `~/../build/bin/polard/config/gentx` # Collect genesis tx polard genesis collect-gentxs --home "$HOMEDIR" diff --git a/e2e/testapp/docker/local/docker-init.sh b/e2e/testapp/docker/local/docker-init.sh index e79ee85d89..f0e43f9759 100644 --- a/e2e/testapp/docker/local/docker-init.sh +++ b/e2e/testapp/docker/local/docker-init.sh @@ -31,7 +31,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance +# Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="/" # to trace evm #TRACE="--trace" @@ -82,11 +82,11 @@ polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl # Sign genesis transaction polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis -## 1. Back to `./bin/polard keys add` step, init more keys -## 2. Back to `./bin/polard add-genesis-account` step, add balance for those -## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` +## 1. Back to `./build/bin/polard keys add` step, init more keys +## 2. Back to `./build/bin/polard add-genesis-account` step, add balance for those +## 3. Clone this ~/../build/bin/polard home directory into some others, let's say `~/.cloned./build/bin/polard` ## 4. Run `gentx` in each of those folders -## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` +## 5. Copy the `gentx-*` folders under `~/.cloned./build/bin/polard/config/gentx/` folders into the original `~/../build/bin/polard/config/gentx` # Collect genesis tx polard genesis collect-gentxs --home "$HOMEDIR" diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index f447a7eba1..a5a4eea0aa 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -30,7 +30,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance +# Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="./.tmp/polard" # to trace evm #TRACE="--trace" @@ -64,15 +64,15 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then rm -rf "$HOMEDIR" # # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) - ./bin/polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" + ./build/bin/polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" # Set client config - ./bin/polard config set client keyring-backend $KEYRING --home "$HOMEDIR" - ./bin/polard config set client chain-id "$CHAINID" --home "$HOMEDIR" + ./build/bin/polard config set client keyring-backend $KEYRING --home "$HOMEDIR" + ./build/bin/polard config set client chain-id "$CHAINID" --home "$HOMEDIR" # If keys exist they should be deleted for KEY in "${KEYS[@]}"; do - ./bin/polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" + ./build/bin/polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" done # Change parameter token denominations to abera @@ -84,28 +84,28 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Allocate genesis accounts (cosmos formatted addresses) for KEY in "${KEYS[@]}"; do - ./bin/polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + ./build/bin/polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" done # Test Account # absurd surge gather author blanket acquire proof struggle runway attract cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite verb tank # 0xfffdbb37105441e14b0ee6330d855d8504ff39e705c3afa8f859ac9865f99306 - ./bin/polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + ./build/bin/polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" # Sign genesis transaction - ./bin/polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" + ./build/bin/polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis - ## 1. Back to `./bin/polard keys add` step, init more keys - ## 2. Back to `./bin/polard add-genesis-account` step, add balance for those - ## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` + ## 1. Back to `./build/bin/polard keys add` step, init more keys + ## 2. Back to `./build/bin/polard add-genesis-account` step, add balance for those + ## 3. Clone this ~/../build/bin/polard home directory into some others, let's say `~/.cloned./build/bin/polard` ## 4. Run `gentx` in each of those folders - ## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` + ## 5. Copy the `gentx-*` folders under `~/.cloned./build/bin/polard/config/gentx/` folders into the original `~/../build/bin/polard/config/gentx` # Collect genesis tx - ./bin/polard genesis collect-gentxs --home "$HOMEDIR" + ./build/bin/polard genesis collect-gentxs --home "$HOMEDIR" # Run this to ensure everything worked and that the genesis file is setup correctly - ./bin/polard genesis validate-genesis --home "$HOMEDIR" + ./build/bin/polard genesis validate-genesis --home "$HOMEDIR" if [[ $1 == "pending" ]]; then echo "pending mode is on, please wait for the first block committed." @@ -113,4 +113,4 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then fi # Start the node (remove the --pruning=nothing flag if historical queries are not needed)m -./bin/polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" +./build/bin/polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 8b215a9f97..aa34d4249e 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -89,6 +89,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index fe92b27de3..889a8f6f8f 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -425,8 +425,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 7ed5837f94..a847df8552 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index 7096396505..706346a32c 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index d8cb61ad81..8a41601a3a 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 59d14f165c..92757402dd 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index b38c383a87..c611cce415 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index c3e3bda1ec..cb80ff5941 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index c624b3d00b..bf7fd72d0c 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/polar_state_db.go b/eth/core/state/mocks/polar_state_db.go index 8383e6889e..d08ee01ea3 100644 --- a/eth/core/state/mocks/polar_state_db.go +++ b/eth/core/state/mocks/polar_state_db.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index b066d04221..9ad9ea4e21 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/eth.go b/eth/eth.go index 39eb5868ef..8455fabb5b 100644 --- a/eth/eth.go +++ b/eth/eth.go @@ -24,6 +24,7 @@ import ( "fmt" "net/http" + "github.com/ethereum/go-ethereum/core/txpool" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/miner" @@ -50,6 +51,8 @@ type ( Add([]*coretypes.Transaction, bool, bool) []error Stats() (int, int) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription + Status(hash common.Hash) txpool.TxStatus + Has(hash common.Hash) bool } // ExecutionLayerNode is the entrypoint for the evm execution environment. diff --git a/eth/go.mod b/eth/go.mod index 61bf0bf3d4..575ba6964f 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -41,6 +41,7 @@ require ( github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/deepmap/oapi-codegen v1.13.4 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect diff --git a/eth/go.sum b/eth/go.sum index f06c239527..26f488115e 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -68,8 +68,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etly github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go index 22f86b4359..97ae4a33c2 100644 --- a/eth/polar/api_backend.go +++ b/eth/polar/api_backend.go @@ -194,11 +194,11 @@ func (b *backend) HeaderByNumber( switch number { case rpc.PendingBlockNumber: // TODO: handle "miner" stuff, Pending block is only known by the miner - // block := b.eth.miner.PendingBlock() - // TODO: this may be hiding a larger issue with the timing of the NewHead channel stuff. - // Investigate and hopefully remove this GTE. - header := b.polar.blockchain.CurrentHeader() - return header, nil + block := b.polar.miner.PendingBlock() + if block == nil { + return nil, nil //nolint:nilnil // it's ok. + } + return block.Header(), nil case rpc.LatestBlockNumber: return b.polar.blockchain.CurrentHeader(), nil case rpc.FinalizedBlockNumber: @@ -243,10 +243,8 @@ func (b *backend) BlockByNumber(_ context.Context, number rpc.BlockNumber) (*typ // Pending block is only known by the miner switch number { case rpc.PendingBlockNumber: - header := b.polar.blockchain.CurrentBlock() - return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - // block := b.polar.miner.PendingBlock() - // return block, nil + block := b.polar.miner.PendingBlock() + return block, nil // Otherwise resolve and return the block case rpc.LatestBlockNumber: header := b.polar.blockchain.CurrentBlock() @@ -309,25 +307,19 @@ func (b *backend) StateAndHeaderByNumber( ctx context.Context, number rpc.BlockNumber, ) (state.StateDB, *types.Header, error) { - var header *types.Header // Pending state is only known by the miner if number == rpc.PendingBlockNumber { - header = b.polar.blockchain.CurrentBlock() - // The above code is returning a block from the blockchain based on the given header - // hash and block - // number. - // return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - // block, state := b.polar.miner.Pending() - // return state, block.Header(), nil - } else { - // Otherwise resolve the block number and return its state - var err error - header, err = b.HeaderByNumber(ctx, number) - if err != nil { - return nil, nil, err + block, state := b.polar.miner.Pending() + if block == nil { + return nil, nil, nil } + return state, block.Header(), nil + } + // Otherwise resolve the block number and return its state + header, err := b.HeaderByNumber(ctx, number) + if err != nil { + return nil, nil, err } - if header == nil { // to match Geth return nil, nil, core.ErrBlockNotFound diff --git a/go.work b/go.work index c84f98fae6..a1ad444e03 100644 --- a/go.work +++ b/go.work @@ -1,6 +1,7 @@ go 1.21 use ( + ./build/tools ./contracts ./cosmos ./e2e/localnet @@ -8,5 +9,4 @@ use ( ./e2e/testapp ./eth ./lib - ./tools ) From f3bf0d0ee45fd79de2c2556292cde41d6b72dc91 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 18:01:35 -0400 Subject: [PATCH 118/122] chore(actions): bump setup-go (#1263) --- .github/workflows/e2e.yml | 35 +++++++++++++--------------------- .github/workflows/pipeline.yml | 14 ++++---------- 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index ae61d8acb8..ae8fedf727 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -42,9 +42,11 @@ jobs: uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} + check-latest: true + cache-dependency-path: "**/*.sum" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -81,9 +83,11 @@ jobs: uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} + check-latest: true + cache-dependency-path: "**/*.sum" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -122,24 +126,18 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} + check-latest: true + cache-dependency-path: "**/*.sum" + - name: Download image artifact uses: actions/download-artifact@v2 with: name: ${{ matrix.base-image }} - name: Load image run: docker load -i ${{ matrix.base-image }}.tar - - name: Cache Golang Deps - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go - key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-golang- - name: Run `make test-hive` run: make hive-setup test-hive env: @@ -158,24 +156,17 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Setup Golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} + check-latest: true + cache-dependency-path: "**/*.sum" - name: Download image artifact uses: actions/download-artifact@v2 with: name: ${{ matrix.base-image }} - name: Load image run: docker load -i ${{ matrix.base-image }}.tar - - name: Cache Golang Deps - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go - key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-golang- - name: Run ${{ matrix.namespace }} run: make test-${{ matrix.namespace }} env: diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 8aa85611a7..43447d8055 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -40,18 +40,12 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 - name: Setup Golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} - - name: Cache Golang Deps - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go - key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-golang- + check-latest: true + cache-dependency-path: "**/*.sum" + - name: Run ${{ matrix.args }} run: | make ${{ matrix.args }} From f659c519fff6f376d3473ca30c38ec62f43e4ead Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 18:08:54 -0400 Subject: [PATCH 119/122] chore(deps): bump internal deps --- cosmos/go.mod | 7 +++---- cosmos/go.sum | 12 ++++++------ e2e/localnet/go.mod | 4 ++-- e2e/localnet/go.sum | 8 ++++---- e2e/precompile/go.mod | 6 +++--- e2e/precompile/go.sum | 12 ++++++------ eth/go.mod | 4 ++-- eth/go.sum | 8 ++++---- 8 files changed, 30 insertions(+), 31 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index 1bf630da1f..0f870eff51 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -33,9 +33,9 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 - pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 - pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f + pkg.berachain.dev/polaris/lib v0.0.0-20231031220135-f3bf0d0ee45f ) require ( @@ -83,7 +83,6 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/docker/docker v24.0.7+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 0032989a33..4fc9a2c7cd 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -1459,12 +1459,12 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2 h1:Vd82baPNQh+6wUaj+qARezJ9dOHHdupJQncgj1UO1FQ= -pkg.berachain.dev/polaris/contracts v0.0.0-20231011003341-63d98bc34da2/go.mod h1:LwuVx7lVFkIa/EXGNz2536i+YTK/mEU4A1vQJFZ8y4Q= -pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 h1:HDy1RniHe/9mLhrQrTcjHvshmj64vO+QZvVbRiXnhjc= -pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3/go.mod h1:Wo7D3qNsCaBcibLwCmSY2O7Rzc94sslbk+qBMA8KSl8= -pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 h1:JO4hSX+qcyijVqDEHt3RXmXPV0XCbjjjlpBj0xHotcc= -pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3/go.mod h1:TQCmHbKEk6xF/9tG8m770ocVYXSdrxXcPyR22KJv60g= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= +pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= +pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f h1:ig3uCqDoaCvbZ4uVDGWeADSSUBAFr8QOAbirQBLFdE8= +pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:oMkuuC++8LHdw05BX+QHtzX/YHMAKZHnE/fWBMMa+P8= +pkg.berachain.dev/polaris/lib v0.0.0-20231031220135-f3bf0d0ee45f h1:mho28mqM87UH9A3fBeC3qugV2u9QgOpYJnc1zZkfZQs= +pkg.berachain.dev/polaris/lib v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:6w+5Axb6GV66PLllrYf7h1G3x8Pwu5nvd7ZiibiI3HM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/e2e/localnet/go.mod b/e2e/localnet/go.mod index 89f26a9f0d..cda846209e 100644 --- a/e2e/localnet/go.mod +++ b/e2e/localnet/go.mod @@ -8,8 +8,8 @@ require ( github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 github.com/ory/dockertest v3.3.5+incompatible - pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 - pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f + pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f ) require ( diff --git a/e2e/localnet/go.sum b/e2e/localnet/go.sum index d94818ba2b..a0108fcef7 100644 --- a/e2e/localnet/go.sum +++ b/e2e/localnet/go.sum @@ -318,9 +318,9 @@ gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= -pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= -pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 h1:HDy1RniHe/9mLhrQrTcjHvshmj64vO+QZvVbRiXnhjc= -pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3/go.mod h1:Wo7D3qNsCaBcibLwCmSY2O7Rzc94sslbk+qBMA8KSl8= +pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f h1:TUIqQfHmD7lsVnf24kxwxlBTxSKOPt5W39t/0Mnk+cU= +pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:5Nz9qfw/JZGle4OtEsJBkgWDn9MNWCEZlCW/6pE5yZg= +pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f h1:ig3uCqDoaCvbZ4uVDGWeADSSUBAFr8QOAbirQBLFdE8= +pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:oMkuuC++8LHdw05BX+QHtzX/YHMAKZHnE/fWBMMa+P8= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/e2e/precompile/go.mod b/e2e/precompile/go.mod index 0844fc2aa5..7a13660bae 100644 --- a/e2e/precompile/go.mod +++ b/e2e/precompile/go.mod @@ -10,9 +10,9 @@ require ( github.com/cosmos/gogoproto v1.4.11 github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.27.10 - pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 - pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231023174626-bf146d519cd3 - pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f + pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231031220135-f3bf0d0ee45f + pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f ) require ( diff --git a/e2e/precompile/go.sum b/e2e/precompile/go.sum index 2160cf60b7..a9cec6fd6e 100644 --- a/e2e/precompile/go.sum +++ b/e2e/precompile/go.sum @@ -1402,12 +1402,12 @@ nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= -pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231023174626-bf146d519cd3 h1:BHc3Q5w2U6AKCDgfZpSz3dKj1+L3rSnNnpgw5G9UAxo= -pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231023174626-bf146d519cd3/go.mod h1:mV/YhYDconEy3q0q7xXcDS5kMsXx5iROBFriHHz7r/M= -pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3 h1:HDy1RniHe/9mLhrQrTcjHvshmj64vO+QZvVbRiXnhjc= -pkg.berachain.dev/polaris/eth v0.0.0-20231023174626-bf146d519cd3/go.mod h1:Wo7D3qNsCaBcibLwCmSY2O7Rzc94sslbk+qBMA8KSl8= +pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f h1:TUIqQfHmD7lsVnf24kxwxlBTxSKOPt5W39t/0Mnk+cU= +pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:5Nz9qfw/JZGle4OtEsJBkgWDn9MNWCEZlCW/6pE5yZg= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231031220135-f3bf0d0ee45f h1:F8lb+21WGFDPyHIhr2glE+dx+2LssxDgjsL/j/542EM= +pkg.berachain.dev/polaris/e2e/localnet v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:gJaao1irtehJ1jtV0d7FhNrb2IbF3c7KbbgTHR/W+xY= +pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f h1:ig3uCqDoaCvbZ4uVDGWeADSSUBAFr8QOAbirQBLFdE8= +pkg.berachain.dev/polaris/eth v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:oMkuuC++8LHdw05BX+QHtzX/YHMAKZHnE/fWBMMa+P8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/eth/go.mod b/eth/go.mod index 575ba6964f..903623ab9e 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -12,8 +12,8 @@ require ( github.com/onsi/gomega v1.27.10 github.com/stretchr/testify v1.8.4 golang.org/x/text v0.13.0 - pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 - pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 + pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f + pkg.berachain.dev/polaris/lib v0.0.0-20231031220135-f3bf0d0ee45f ) require ( diff --git a/eth/go.sum b/eth/go.sum index 26f488115e..803568356a 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -436,10 +436,10 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3 h1:HuPF3//LfKdnWf4kBKsEBTIvtyzD7ikz/KdoKGxYzDg= -pkg.berachain.dev/polaris/contracts v0.0.0-20231023174626-bf146d519cd3/go.mod h1:YZZ0c17iFXlmnPyi59b/uaTD4IH71YrMQVn6W9PCVsY= -pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3 h1:JO4hSX+qcyijVqDEHt3RXmXPV0XCbjjjlpBj0xHotcc= -pkg.berachain.dev/polaris/lib v0.0.0-20231023174626-bf146d519cd3/go.mod h1:TQCmHbKEk6xF/9tG8m770ocVYXSdrxXcPyR22KJv60g= +pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f h1:TUIqQfHmD7lsVnf24kxwxlBTxSKOPt5W39t/0Mnk+cU= +pkg.berachain.dev/polaris/contracts v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:5Nz9qfw/JZGle4OtEsJBkgWDn9MNWCEZlCW/6pE5yZg= +pkg.berachain.dev/polaris/lib v0.0.0-20231031220135-f3bf0d0ee45f h1:mho28mqM87UH9A3fBeC3qugV2u9QgOpYJnc1zZkfZQs= +pkg.berachain.dev/polaris/lib v0.0.0-20231031220135-f3bf0d0ee45f/go.mod h1:6w+5Axb6GV66PLllrYf7h1G3x8Pwu5nvd7ZiibiI3HM= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From e29bc32fe87b76e67148227ad5bab35dc067199f Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 1 Nov 2023 11:59:17 -0400 Subject: [PATCH 120/122] feat(keys): return of the `eth_secp256k1` (#1264) --- .../crypto/ethsecp256k1/v1/keys.pulsar.go | 1074 +++++++++++++++++ cosmos/crypto/codec/codec.go | 34 + cosmos/crypto/codec/codec_test.go | 41 + cosmos/crypto/hd/algo.go | 67 + cosmos/crypto/hd/algo_test.go | 99 ++ cosmos/crypto/hd/hd.go | 73 ++ cosmos/crypto/hd/hd_test.go | 33 + cosmos/crypto/keyring/option.go | 35 + cosmos/crypto/keyring/option_test.go | 180 +++ cosmos/crypto/keys/ethsecp256k1/keys.go | 137 +++ cosmos/crypto/keys/ethsecp256k1/keys.pb.go | 499 ++++++++ cosmos/crypto/keys/ethsecp256k1/keys_test.go | 80 ++ .../crypto/keys/ethsecp256k1/signature_cgo.go | 64 + .../keys/ethsecp256k1/signature_cgo_test.go | 66 + cosmos/go.mod | 5 +- cosmos/go.sum | 30 + e2e/hive/clients/polard/entrypoint.sh | 2 +- e2e/precompile/polard/start-node.sh | 2 +- e2e/testapp/app.go | 4 + e2e/testapp/docker/local/docker-init.sh | 2 +- e2e/testapp/docker/seed/init.sh | 2 +- .../docker/seed/scripts/seed0-init-step1.sh | 2 +- .../docker/seed/scripts/seed0-init-step2.sh | 2 +- .../docker/seed/scripts/seed1-init-step1.sh | 2 +- .../validator/scripts/val0-init-step1.sh | 2 +- .../validator/scripts/val1-init-step1.sh | 2 +- e2e/testapp/entrypoint.sh | 2 +- e2e/testapp/polard/cmd/root.go | 5 + eth/crypto/imported.go | 32 +- go.work.sum | 14 +- .../polaris/crypto/ethsecp256k1/v1/keys.proto | 40 + 31 files changed, 2608 insertions(+), 24 deletions(-) create mode 100644 cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go create mode 100644 cosmos/crypto/codec/codec.go create mode 100644 cosmos/crypto/codec/codec_test.go create mode 100644 cosmos/crypto/hd/algo.go create mode 100644 cosmos/crypto/hd/algo_test.go create mode 100644 cosmos/crypto/hd/hd.go create mode 100644 cosmos/crypto/hd/hd_test.go create mode 100644 cosmos/crypto/keyring/option.go create mode 100644 cosmos/crypto/keyring/option_test.go create mode 100644 cosmos/crypto/keys/ethsecp256k1/keys.go create mode 100644 cosmos/crypto/keys/ethsecp256k1/keys.pb.go create mode 100644 cosmos/crypto/keys/ethsecp256k1/keys_test.go create mode 100644 cosmos/crypto/keys/ethsecp256k1/signature_cgo.go create mode 100644 cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go create mode 100644 proto/polaris/crypto/ethsecp256k1/v1/keys.proto diff --git a/cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go b/cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go new file mode 100644 index 0000000000..8dc63e61b2 --- /dev/null +++ b/cosmos/api/polaris/crypto/ethsecp256k1/v1/keys.pulsar.go @@ -0,0 +1,1074 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package ethsecp256k1v1 + +import ( + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_PubKey protoreflect.MessageDescriptor + fd_PubKey_key protoreflect.FieldDescriptor +) + +func init() { + file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() + md_PubKey = File_polaris_crypto_ethsecp256k1_v1_keys_proto.Messages().ByName("PubKey") + fd_PubKey_key = md_PubKey.Fields().ByName("key") +} + +var _ protoreflect.Message = (*fastReflection_PubKey)(nil) + +type fastReflection_PubKey PubKey + +func (x *PubKey) ProtoReflect() protoreflect.Message { + return (*fastReflection_PubKey)(x) +} + +func (x *PubKey) slowProtoReflect() protoreflect.Message { + mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_PubKey_messageType fastReflection_PubKey_messageType +var _ protoreflect.MessageType = fastReflection_PubKey_messageType{} + +type fastReflection_PubKey_messageType struct{} + +func (x fastReflection_PubKey_messageType) Zero() protoreflect.Message { + return (*fastReflection_PubKey)(nil) +} +func (x fastReflection_PubKey_messageType) New() protoreflect.Message { + return new(fastReflection_PubKey) +} +func (x fastReflection_PubKey_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_PubKey +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_PubKey) Descriptor() protoreflect.MessageDescriptor { + return md_PubKey +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_PubKey) Type() protoreflect.MessageType { + return _fastReflection_PubKey_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_PubKey) New() protoreflect.Message { + return new(fastReflection_PubKey) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_PubKey) Interface() protoreflect.ProtoMessage { + return (*PubKey)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_PubKey) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Key) != 0 { + value := protoreflect.ValueOfBytes(x.Key) + if !f(fd_PubKey_key, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_PubKey) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PubKey.key": + return len(x.Key) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PubKey) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PubKey.key": + x.Key = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_PubKey) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PubKey.key": + value := x.Key + return protoreflect.ValueOfBytes(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PubKey) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PubKey.key": + x.Key = value.Bytes() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PubKey) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PubKey.key": + panic(fmt.Errorf("field key of message polaris.crypto.ethsecp256k1.v1.PubKey is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_PubKey) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PubKey.key": + return protoreflect.ValueOfBytes(nil) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PubKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PubKey does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_PubKey) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in polaris.crypto.ethsecp256k1.v1.PubKey", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_PubKey) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PubKey) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_PubKey) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_PubKey) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*PubKey) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Key) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*PubKey) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Key) > 0 { + i -= len(x.Key) + copy(dAtA[i:], x.Key) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Key))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*PubKey) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Key = append(x.Key[:0], dAtA[iNdEx:postIndex]...) + if x.Key == nil { + x.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_PrivKey protoreflect.MessageDescriptor + fd_PrivKey_key protoreflect.FieldDescriptor +) + +func init() { + file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() + md_PrivKey = File_polaris_crypto_ethsecp256k1_v1_keys_proto.Messages().ByName("PrivKey") + fd_PrivKey_key = md_PrivKey.Fields().ByName("key") +} + +var _ protoreflect.Message = (*fastReflection_PrivKey)(nil) + +type fastReflection_PrivKey PrivKey + +func (x *PrivKey) ProtoReflect() protoreflect.Message { + return (*fastReflection_PrivKey)(x) +} + +func (x *PrivKey) slowProtoReflect() protoreflect.Message { + mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_PrivKey_messageType fastReflection_PrivKey_messageType +var _ protoreflect.MessageType = fastReflection_PrivKey_messageType{} + +type fastReflection_PrivKey_messageType struct{} + +func (x fastReflection_PrivKey_messageType) Zero() protoreflect.Message { + return (*fastReflection_PrivKey)(nil) +} +func (x fastReflection_PrivKey_messageType) New() protoreflect.Message { + return new(fastReflection_PrivKey) +} +func (x fastReflection_PrivKey_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_PrivKey +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_PrivKey) Descriptor() protoreflect.MessageDescriptor { + return md_PrivKey +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_PrivKey) Type() protoreflect.MessageType { + return _fastReflection_PrivKey_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_PrivKey) New() protoreflect.Message { + return new(fastReflection_PrivKey) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_PrivKey) Interface() protoreflect.ProtoMessage { + return (*PrivKey)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_PrivKey) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Key) != 0 { + value := protoreflect.ValueOfBytes(x.Key) + if !f(fd_PrivKey_key, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_PrivKey) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": + return len(x.Key) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PrivKey) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": + x.Key = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_PrivKey) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": + value := x.Key + return protoreflect.ValueOfBytes(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PrivKey) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": + x.Key = value.Bytes() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PrivKey) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": + panic(fmt.Errorf("field key of message polaris.crypto.ethsecp256k1.v1.PrivKey is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_PrivKey) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "polaris.crypto.ethsecp256k1.v1.PrivKey.key": + return protoreflect.ValueOfBytes(nil) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: polaris.crypto.ethsecp256k1.v1.PrivKey")) + } + panic(fmt.Errorf("message polaris.crypto.ethsecp256k1.v1.PrivKey does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_PrivKey) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in polaris.crypto.ethsecp256k1.v1.PrivKey", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_PrivKey) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_PrivKey) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_PrivKey) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_PrivKey) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*PrivKey) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Key) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*PrivKey) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Key) > 0 { + i -= len(x.Key) + copy(dAtA[i:], x.Key) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Key))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*PrivKey) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Key = append(x.Key[:0], dAtA[iNdEx:postIndex]...) + if x.Key == nil { + x.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: polaris/crypto/ethsecp256k1/v1/keys.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// `PubKey` defines a type alias for an `ecdsa.PublicKey` that implements +// CometBFT's `PubKey` interface. It represents the 33-byte compressed public +// key format. +type PubKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // `key` is the public key in byte form. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *PubKey) Reset() { + *x = PubKey{} + if protoimpl.UnsafeEnabled { + mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PubKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PubKey) ProtoMessage() {} + +// Deprecated: Use PubKey.ProtoReflect.Descriptor instead. +func (*PubKey) Descriptor() ([]byte, []int) { + return file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescGZIP(), []int{0} +} + +func (x *PubKey) GetKey() []byte { + if x != nil { + return x.Key + } + return nil +} + +// `PrivKey` defines a type alias for a n`ecdsa.PrivateKey` that implements +// CometBFT's `PrivateKey` interface. +type PrivKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // `key` is the private key in byte form. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *PrivKey) Reset() { + *x = PrivKey{} + if protoimpl.UnsafeEnabled { + mi := &file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrivKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrivKey) ProtoMessage() {} + +// Deprecated: Use PrivKey.ProtoReflect.Descriptor instead. +func (*PrivKey) Descriptor() ([]byte, []int) { + return file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescGZIP(), []int{1} +} + +func (x *PrivKey) GetKey() []byte { + if x != nil { + return x.Key + } + return nil +} + +var File_polaris_crypto_ethsecp256k1_v1_keys_proto protoreflect.FileDescriptor + +var file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x70, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x2f, 0x65, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2f, 0x76, 0x31, + 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e, 0x70, 0x6f, 0x6c, + 0x61, 0x72, 0x69, 0x73, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x65, 0x74, 0x68, 0x73, + 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2e, 0x76, 0x31, 0x22, 0x1a, 0x0a, 0x06, 0x50, + 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x1b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x4b, + 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x42, 0x8a, 0x02, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, + 0x61, 0x72, 0x69, 0x73, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x65, 0x74, 0x68, 0x73, + 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4b, 0x65, 0x79, + 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6c, 0x61, 0x72, + 0x69, 0x73, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x73, 0x65, 0x63, + 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x74, 0x68, 0x73, 0x65, 0x63, + 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x45, 0xaa, 0x02, + 0x1e, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x2e, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, + 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x1e, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x5c, 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x2a, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x5c, 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x21, + 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x69, 0x73, 0x3a, 0x3a, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3a, + 0x3a, 0x45, 0x74, 0x68, 0x73, 0x65, 0x63, 0x70, 0x32, 0x35, 0x36, 0x6b, 0x31, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescOnce sync.Once + file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData = file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc +) + +func file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescGZIP() []byte { + file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescOnce.Do(func() { + file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData = protoimpl.X.CompressGZIP(file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData) + }) + return file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDescData +} + +var file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_polaris_crypto_ethsecp256k1_v1_keys_proto_goTypes = []interface{}{ + (*PubKey)(nil), // 0: polaris.crypto.ethsecp256k1.v1.PubKey + (*PrivKey)(nil), // 1: polaris.crypto.ethsecp256k1.v1.PrivKey +} +var file_polaris_crypto_ethsecp256k1_v1_keys_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() } +func file_polaris_crypto_ethsecp256k1_v1_keys_proto_init() { + if File_polaris_crypto_ethsecp256k1_v1_keys_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PubKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrivKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_polaris_crypto_ethsecp256k1_v1_keys_proto_goTypes, + DependencyIndexes: file_polaris_crypto_ethsecp256k1_v1_keys_proto_depIdxs, + MessageInfos: file_polaris_crypto_ethsecp256k1_v1_keys_proto_msgTypes, + }.Build() + File_polaris_crypto_ethsecp256k1_v1_keys_proto = out.File + file_polaris_crypto_ethsecp256k1_v1_keys_proto_rawDesc = nil + file_polaris_crypto_ethsecp256k1_v1_keys_proto_goTypes = nil + file_polaris_crypto_ethsecp256k1_v1_keys_proto_depIdxs = nil +} diff --git a/cosmos/crypto/codec/codec.go b/cosmos/crypto/codec/codec.go new file mode 100644 index 0000000000..c3daf74901 --- /dev/null +++ b/cosmos/crypto/codec/codec.go @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package codec + +import ( + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + + "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" +) + +// RegisterInterfaces registers the ethsecp256k1 key types. +func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), ðsecp256k1.PubKey{}) + registry.RegisterImplementations((*cryptotypes.PrivKey)(nil), ðsecp256k1.PrivKey{}) +} diff --git a/cosmos/crypto/codec/codec_test.go b/cosmos/crypto/codec/codec_test.go new file mode 100644 index 0000000000..6e9542ccc0 --- /dev/null +++ b/cosmos/crypto/codec/codec_test.go @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package codec + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec/types" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestCodec(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/crypto/codec") +} + +var _ = Describe("Codec", func() { + It("should not panic", func() { + RegisterInterfaces(types.NewInterfaceRegistry()) + }) +}) diff --git a/cosmos/crypto/hd/algo.go b/cosmos/crypto/hd/algo.go new file mode 100644 index 0000000000..52f3cd66bb --- /dev/null +++ b/cosmos/crypto/hd/algo.go @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package hd + +import ( + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + + "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" +) + +const ( + // EthSecp256k1Type defines the ECDSA secp256k1 used on Ethereum. + EthSecp256k1Type = hd.PubKeyType(ethsecp256k1.KeyType) +) + +var ( + // Compile-time type assertion. + _ keyring.SignatureAlgo = EthSecp256k1 + // EthSecp256k1 uses the Bitcoin secp256k1 ECDSA parameters. + EthSecp256k1 = ethSecp256k1Algo{} +) + +// ethSecp256k1Algo implements the `keyring.SignatureAlgo` interface for the +// eth_secp256k1 algorithm. +type ethSecp256k1Algo struct{} + +// Name returns eth_secp256k1. +func (s ethSecp256k1Algo) Name() hd.PubKeyType { + return EthSecp256k1Type +} + +// Derive derives and returns the eth_secp256k1 private key for the given mnemonic +// and HD path. +func (s ethSecp256k1Algo) Derive() hd.DeriveFn { + return hd.Secp256k1.Derive() +} + +// Generate generates a eth_secp256k1 private key from the given bytes. +func (s ethSecp256k1Algo) Generate() hd.GenerateFn { + return func(bz []byte) cryptotypes.PrivKey { + bzArr := make([]byte, ethsecp256k1.PrivKeySize) + copy(bzArr, bz) + return ðsecp256k1.PrivKey{ + Key: bzArr, + } + } +} diff --git a/cosmos/crypto/hd/algo_test.go b/cosmos/crypto/hd/algo_test.go new file mode 100644 index 0000000000..6534203f99 --- /dev/null +++ b/cosmos/crypto/hd/algo_test.go @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package hd + +import ( + "strings" + + "github.com/cosmos/cosmos-sdk/crypto/keyring" + + ethsecp256k1 "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1" + "pkg.berachain.dev/polaris/eth/accounts" + "pkg.berachain.dev/polaris/eth/common" + crypto "pkg.berachain.dev/polaris/eth/crypto" + "pkg.berachain.dev/polaris/lib/utils" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +const ( + mnemonic = "absurd surge gather author blanket acquire proof struggle runway attract " + + "cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite " + + "verb tank" +) + +var _ = Describe("HD", func() { + It("should derive the correct key", func() { + EthSecp256k1 := EthSecp256k1 + + // Derive the 0'th key from the mnemonic. + bz, err := EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, + accounts.BIP44HDPath) + Expect(err).NotTo(HaveOccurred()) + Expect(bz).NotTo(BeEmpty()) + + badBz, err := EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, + "44'/118'/0'/0/0") + Expect(err).NotTo(HaveOccurred()) + Expect(badBz).NotTo(BeEmpty()) + + Expect(bz).NotTo(Equal(badBz)) + + privkey := EthSecp256k1.Generate()(bz) + badPrivKey := EthSecp256k1.Generate()(badBz) + + Expect(privkey.Equals(badPrivKey)).To(BeFalse()) + + pk, err := utils.MustGetAs[*ethsecp256k1.PrivKey](privkey).ToECDSA() + Expect(err).NotTo(HaveOccurred()) + + wallet, path, err := GenerateWallet(mnemonic) + Expect(err).NotTo(HaveOccurred()) + *path = strings.Replace(*path, "H", "'", 3) // TODO: figure out why this is needed. + Expect(*path).To(Equal(accounts.BIP44HDPath)) + Expect(crypto.FromECDSA(wallet)).To(Equal(privkey.Bytes())) + + // Check to verify that the address is correct. + // Also verified manually with metamask: https://imgur.com/a/Bz2jLaP + Expect(crypto.PubkeyToAddress(pk.PublicKey).String()). + To(Equal("0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4")) + Expect(crypto.PubkeyToAddress(wallet.PublicKey).String()). + To(Equal("0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4")) + Expect(common.BytesToAddress(privkey.PubKey().Address().Bytes()).String()). + To(Equal("0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4")) + Expect(common.BytesToAddress(privkey.PubKey().Address()).String()). + To(Equal(crypto.PubkeyToAddress(wallet.PublicKey).String())) + }) +}) + +var _ = Describe("Prove EDSCAify isn't needed", func() { + It("should round trip", func() { + // Generate a random private key. + key, err := ethsecp256k1.GenPrivKey() + Expect(err).NotTo(HaveOccurred()) + + // Convert the private key to an ECDSA private key. + x, err := ethsecp256k1.PrivKey{Key: key.Key}.ToECDSA() + Expect(err).NotTo(HaveOccurred()) + Expect(key.Key).To(Equal(crypto.FromECDSA(x))) + }) +}) diff --git a/cosmos/crypto/hd/hd.go b/cosmos/crypto/hd/hd.go new file mode 100644 index 0000000000..0588972e67 --- /dev/null +++ b/cosmos/crypto/hd/hd.go @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +// +//nolint:gomnd // ignore magic numbers +package hd + +import ( + "crypto/ecdsa" + + "github.com/btcsuite/btcd/btcutil/hdkeychain" + "github.com/btcsuite/btcd/chaincfg" + "github.com/cosmos/go-bip39" +) + +func GenerateWallet(mnemonic string) (*ecdsa.PrivateKey, *string, error) { + // Generate a Bip32 HD wallet for the mnemonic and a user supplied password + seed := bip39.NewSeed(mnemonic, "") + // Generate a new master node using the seed. + masterKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams) + if err != nil { + return nil, nil, err + } + // This gives the path: m/44H + acc44H, err := masterKey.Derive(hdkeychain.HardenedKeyStart + 44) + if err != nil { + return nil, nil, err + } + // This gives the path: m/44H/60H + acc44H60H, err := acc44H.Derive(hdkeychain.HardenedKeyStart + 60) + if err != nil { + return nil, nil, err + } + // This gives the path: m/44H/60H/0H + acc44H60H0H, err := acc44H60H.Derive(hdkeychain.HardenedKeyStart + 0) + if err != nil { + return nil, nil, err + } + // This gives the path: m/44H/60H/0H/0 + acc44H60H0H0, err := acc44H60H0H.Derive(0) + if err != nil { + return nil, nil, err + } + // This gives the path: m/44H/60H/0H/0/0 + acc44H60H0H00, err := acc44H60H0H0.Derive(0) + if err != nil { + return nil, nil, err + } + btcecPrivKey, err := acc44H60H0H00.ECPrivKey() + if err != nil { + return nil, nil, err + } + privateKey := btcecPrivKey.ToECDSA() + path := "m/44H/60H/0H/0/0" + return privateKey, &path, nil +} diff --git a/cosmos/crypto/hd/hd_test.go b/cosmos/crypto/hd/hd_test.go new file mode 100644 index 0000000000..2b0daa5234 --- /dev/null +++ b/cosmos/crypto/hd/hd_test.go @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package hd + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestHD(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/crypto/hd") +} diff --git a/cosmos/crypto/keyring/option.go b/cosmos/crypto/keyring/option.go new file mode 100644 index 0000000000..c002916229 --- /dev/null +++ b/cosmos/crypto/keyring/option.go @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package keyring + +import ( + "github.com/cosmos/cosmos-sdk/crypto/keyring" + + "pkg.berachain.dev/polaris/cosmos/crypto/hd" +) + +// OnlyEthSecp256k1Option defines a function keys options for the ethereum Secp256k1 curve. +func OnlyEthSecp256k1Option() keyring.Option { + return func(options *keyring.Options) { + options.SupportedAlgos = keyring.SigningAlgoList{hd.EthSecp256k1} + options.SupportedAlgosLedger = keyring.SigningAlgoList{hd.EthSecp256k1} + } +} diff --git a/cosmos/crypto/keyring/option_test.go b/cosmos/crypto/keyring/option_test.go new file mode 100644 index 0000000000..190f77ce4a --- /dev/null +++ b/cosmos/crypto/keyring/option_test.go @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package keyring + +import ( + "os" + "strings" + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/std" + + cryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" + "pkg.berachain.dev/polaris/cosmos/crypto/hd" + accounts "pkg.berachain.dev/polaris/eth/accounts" + "pkg.berachain.dev/polaris/eth/common" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var cdc *codec.ProtoCodec + +func registerCodec() { + interfaceRegistry := types.NewInterfaceRegistry() + std.RegisterInterfaces(interfaceRegistry) + cryptocodec.RegisterInterfaces(interfaceRegistry) + cdc = codec.NewProtoCodec(interfaceRegistry) +} + +func TestKeyring(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/crypto/keyring") +} + +var _ = Describe("Keyring", func() { + var ( + dir string + mockIn *strings.Reader + kr keyring.Keyring + ) + + BeforeEach(func() { + var err error + dir, err = os.MkdirTemp("", "keyring_test") + Expect(err).NotTo(HaveOccurred()) + registerCodec() + + mockIn = strings.NewReader("") + + interfaceRegistry := types.NewInterfaceRegistry() + std.RegisterInterfaces(interfaceRegistry) + cryptocodec.RegisterInterfaces(interfaceRegistry) + cdc = codec.NewProtoCodec(interfaceRegistry) + + kr, err = keyring.New( + "accounts", keyring.BackendTest, dir, mockIn, cdc, OnlyEthSecp256k1Option(), + ) + Expect(err).NotTo(HaveOccurred()) + }) + + AfterEach(func() { + err := os.RemoveAll(dir) + Expect(err).NotTo(HaveOccurred()) + }) + + Context("Key operations", func() { + It("should fail to retrieve key", func() { + info, err := kr.Key("foo") + Expect(err).To(HaveOccurred()) + Expect(info).To(BeNil()) + }) + }) + + Context("NewMnemonic operation", func() { + var ( + info *keyring.Record + mnemonic string + err error + ) + + BeforeEach(func() { + registerCodec() + mockIn.Reset("password\npassword\n") + info, mnemonic, err = kr.NewMnemonic("foo", keyring.English, accounts.BIP44HDPath, + keyring.DefaultBIP39Passphrase, hd.EthSecp256k1) + Expect(err).NotTo(HaveOccurred()) + }) + + It("should create a new mnemonic and info", func() { + Expect(mnemonic).NotTo(BeEmpty()) + Expect(info.Name).To(Equal("foo")) + Expect(info.GetType().String()).To(Equal("local")) + var pubKey cryptotypes.PubKey + pubKey, err = info.GetPubKey() + Expect(err).NotTo(HaveOccurred()) + Expect(pubKey.Type()).To(Equal(string(hd.EthSecp256k1Type))) + }) + }) + + Context("HD path operations", func() { + var ( + mnemonic string + bz []byte + err error + ) + + BeforeEach(func() { + registerCodec() + mockIn.Reset("password\npassword\n") + _, mnemonic, err = kr.NewMnemonic("foo", keyring.English, accounts.BIP44HDPath, + keyring.DefaultBIP39Passphrase, hd.EthSecp256k1) + Expect(err).NotTo(HaveOccurred()) + + hdPath := accounts.BIP44HDPath + + bz, err = hd.EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, hdPath) + Expect(err).NotTo(HaveOccurred()) + }) + + It("should derive the correct HD path", func() { + Expect(bz).NotTo(BeEmpty()) + var wrongBz []byte + wrongBz, err = hd.EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, + "/wrong/hdPath") + Expect(err).To(HaveOccurred()) + Expect(wrongBz).To(BeEmpty()) + }) + + Context("Key generation and retrieval", func() { + var ( + privkey cryptotypes.PrivKey + addr common.Address + ) + + BeforeEach(func() { + registerCodec() + mockIn.Reset("password\npassword\n") + _, mnemonic, err = kr.NewMnemonic("foo", keyring.English, accounts.BIP44HDPath, + keyring.DefaultBIP39Passphrase, hd.EthSecp256k1) + Expect(err).NotTo(HaveOccurred()) + + hdPath := accounts.BIP44HDPath + + bz, err = hd.EthSecp256k1.Derive()(mnemonic, keyring.DefaultBIP39Passphrase, + hdPath) + Expect(err).NotTo(HaveOccurred()) + + privkey = hd.EthSecp256k1.Generate()(bz) + addr = common.BytesToAddress(privkey.PubKey().Address().Bytes()) + }) + + It("should generate and retrieve the correct private key and address", func() { + Expect(addr.String()).To(Equal(common.Address(privkey.PubKey(). + Address()).String())) + }) + }) + }) +}) diff --git a/cosmos/crypto/keys/ethsecp256k1/keys.go b/cosmos/crypto/keys/ethsecp256k1/keys.go new file mode 100644 index 0000000000..5636e0aea4 --- /dev/null +++ b/cosmos/crypto/keys/ethsecp256k1/keys.go @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package ethsecp256k1 + +import ( + "bytes" + "crypto/ecdsa" + "crypto/subtle" + + cmcrypto "github.com/cometbft/cometbft/crypto" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + + "pkg.berachain.dev/polaris/eth/crypto" +) + +const ( + // PrivKeySize defines the length of the PrivKey byte array. + PrivKeySize = 32 + // PubKeySize defines the length of the PubKey byte array. + PubKeySize = PrivKeySize + 1 + // KeyType is the string constant for the secp256k1 algorithm. + KeyType = "eth_secp256k1" +) + +// =============================================================================================== +// Private Key +// =============================================================================================== + +// PrivKey is a wrapper around the Ethereum secp256k1 private key type. This wrapper conforms to +// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 private key type within the +// Cosmos SDK. + +// Compile-time type assertion. +var _ cryptotypes.PrivKey = &PrivKey{} + +// Bytes returns the byte representation of the ECDSA Private Key. +func (privKey PrivKey) Bytes() []byte { + return privKey.Key +} + +// PubKey returns the ECDSA private key's public key. If the privkey is not valid +// it returns a nil value. +func (privKey PrivKey) PubKey() cryptotypes.PubKey { + ecdsaPrivKey, err := privKey.ToECDSA() + if err != nil { + return nil + } + + return &PubKey{ + Key: crypto.CompressPubkey(&ecdsaPrivKey.PublicKey), + } +} + +// Equals returns true if two ECDSA private keys are equal and false otherwise. +func (privKey PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool { + return privKey.Type() == other.Type() && + subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 +} + +// Type returns eth_secp256k1. +func (privKey PrivKey) Type() string { + return KeyType +} + +// GenPrivKey generates a new random private key. It returns an error upon +// failure. +func GenPrivKey() (*PrivKey, error) { + priv, err := crypto.GenerateEthKey() + if err != nil { + return nil, err + } + + return &PrivKey{ + Key: crypto.FromECDSA(priv), + }, nil +} + +// ToECDSA returns the ECDSA private key as a reference to ecdsa.PrivateKey type. +func (privKey PrivKey) ToECDSA() (*ecdsa.PrivateKey, error) { + return crypto.ToECDSA(privKey.Bytes()) +} + +// =============================================================================================== +// Public Key +// =============================================================================================== + +// Pubkey is a wrapper around the Ethereum secp256k1 public key type. This wrapper conforms to +// crypotypes.Pubkey to allow for the use of the Ethereum secp256k1 public key type within the +// Cosmos SDK. + +// Compile-time type assertion. +var _ cryptotypes.PubKey = &PubKey{} + +// Address returns the address of the ECDSA public key. +// The function will return an empty address if the public key is invalid. +func (pubKey PubKey) Address() cmcrypto.Address { + key, err := crypto.DecompressPubkey(pubKey.Key) + if err != nil { + return nil + } + + return cmcrypto.Address(crypto.PubkeyToAddress(*key).Bytes()) +} + +// Bytes returns the pubkey byte format. +func (pubKey *PubKey) Bytes() []byte { + return pubKey.Key +} + +// Type returns eth_secp256k1. +func (pubKey *PubKey) Type() string { + return KeyType +} + +// Equals returns true if the pubkey type is the same and their bytes are deeply equal. +func (pubKey PubKey) Equals(other cryptotypes.PubKey) bool { + return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes()) +} diff --git a/cosmos/crypto/keys/ethsecp256k1/keys.pb.go b/cosmos/crypto/keys/ethsecp256k1/keys.pb.go new file mode 100644 index 0000000000..7ace5fa0b3 --- /dev/null +++ b/cosmos/crypto/keys/ethsecp256k1/keys.pb.go @@ -0,0 +1,499 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: polaris/crypto/ethsecp256k1/v1/keys.proto + +package ethsecp256k1 + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// `PubKey` defines a type alias for an `ecdsa.PublicKey` that implements +// CometBFT's `PubKey` interface. It represents the 33-byte compressed public +// key format. +type PubKey struct { + // `key` is the public key in byte form. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *PubKey) Reset() { *m = PubKey{} } +func (m *PubKey) String() string { return proto.CompactTextString(m) } +func (*PubKey) ProtoMessage() {} +func (*PubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_e0c989ba1b8717d6, []int{0} +} +func (m *PubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_PubKey.Merge(m, src) +} +func (m *PubKey) XXX_Size() int { + return m.Size() +} +func (m *PubKey) XXX_DiscardUnknown() { + xxx_messageInfo_PubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_PubKey proto.InternalMessageInfo + +func (m *PubKey) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +// `PrivKey` defines a type alias for a n`ecdsa.PrivateKey` that implements +// CometBFT's `PrivateKey` interface. +type PrivKey struct { + // `key` is the private key in byte form. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *PrivKey) Reset() { *m = PrivKey{} } +func (m *PrivKey) String() string { return proto.CompactTextString(m) } +func (*PrivKey) ProtoMessage() {} +func (*PrivKey) Descriptor() ([]byte, []int) { + return fileDescriptor_e0c989ba1b8717d6, []int{1} +} +func (m *PrivKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PrivKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PrivKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_PrivKey.Merge(m, src) +} +func (m *PrivKey) XXX_Size() int { + return m.Size() +} +func (m *PrivKey) XXX_DiscardUnknown() { + xxx_messageInfo_PrivKey.DiscardUnknown(m) +} + +var xxx_messageInfo_PrivKey proto.InternalMessageInfo + +func (m *PrivKey) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func init() { + proto.RegisterType((*PubKey)(nil), "polaris.crypto.ethsecp256k1.v1.PubKey") + proto.RegisterType((*PrivKey)(nil), "polaris.crypto.ethsecp256k1.v1.PrivKey") +} + +func init() { + proto.RegisterFile("polaris/crypto/ethsecp256k1/v1/keys.proto", fileDescriptor_e0c989ba1b8717d6) +} + +var fileDescriptor_e0c989ba1b8717d6 = []byte{ + // 182 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0xc8, 0xcf, 0x49, + 0x2c, 0xca, 0x2c, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x4f, 0x2d, 0xc9, 0x28, 0x4e, + 0x4d, 0x2e, 0x30, 0x32, 0x35, 0xcb, 0x36, 0xd4, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x83, 0x2a, 0xd5, 0x83, 0x28, 0xd5, 0x43, 0x56, 0xaa, + 0x57, 0x66, 0xa8, 0x24, 0xc5, 0xc5, 0x16, 0x50, 0x9a, 0xe4, 0x9d, 0x5a, 0x29, 0x24, 0xc0, 0xc5, + 0x9c, 0x9d, 0x5a, 0x29, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x13, 0x04, 0x62, 0x2a, 0x49, 0x73, 0xb1, + 0x07, 0x14, 0x65, 0x96, 0x61, 0x95, 0x74, 0x0a, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, + 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, + 0x39, 0x86, 0x28, 0xcb, 0x82, 0xec, 0x74, 0xbd, 0xa4, 0xd4, 0xa2, 0xc4, 0xe4, 0x8c, 0xc4, 0xcc, + 0x3c, 0xbd, 0x94, 0xd4, 0x32, 0x7d, 0xb8, 0x7b, 0xf3, 0x8b, 0x73, 0xf3, 0xe1, 0xce, 0x06, 0x39, + 0x13, 0xc5, 0xed, 0x49, 0x6c, 0x60, 0x47, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5e, 0xa7, + 0xc8, 0x46, 0xe1, 0x00, 0x00, 0x00, +} + +func (m *PubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PrivKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PrivKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { + offset -= sovKeys(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func sovKeys(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozKeys(x uint64) (n int) { + return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *PubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PrivKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipKeys(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthKeys + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupKeys + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthKeys + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") +) diff --git a/cosmos/crypto/keys/ethsecp256k1/keys_test.go b/cosmos/crypto/keys/ethsecp256k1/keys_test.go new file mode 100644 index 0000000000..5e4e7b5166 --- /dev/null +++ b/cosmos/crypto/keys/ethsecp256k1/keys_test.go @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package ethsecp256k1 + +import ( + "testing" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + + ethcrypto "pkg.berachain.dev/polaris/eth/crypto" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestEthSecp256K1(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "cosmos/crypto/keys/ethsecp256k1") +} + +var _ = Describe("PubPrivKey", func() { + var privKey *PrivKey + + BeforeEach(func() { + var err error + privKey, err = GenPrivKey() + Expect(err).ToNot(HaveOccurred()) + }) + + It("validates type and equality", func() { + Expect(privKey).To(BeAssignableToTypeOf((cryptotypes.PrivKey)(&PrivKey{}))) + }) + + It("validates inequality", func() { + privKey2, err := GenPrivKey() + Expect(err).ToNot(HaveOccurred()) + Expect(privKey.Equals(privKey2)).To(BeFalse()) + }) + + It("validates Ethereum address equality", func() { + addr := privKey.PubKey().Address() + key, err := privKey.ToECDSA() + Expect(err).ToNot(HaveOccurred()) + expectedAddr := ethcrypto.PubkeyToAddress(key.PublicKey) + Expect(expectedAddr.Bytes()).To(Equal(addr.Bytes())) + }) + + It("validates type", func() { + pubKey := &PubKey{ + Key: privKey.PubKey().Bytes(), + } + Expect(pubKey).To(BeAssignableToTypeOf((cryptotypes.PubKey)(&PubKey{}))) + }) + + It("validates equality", func() { + privKey2, err := GenPrivKey() + Expect(err).ToNot(HaveOccurred()) + Expect(privKey).ToNot(Equal(privKey2)) + Expect(privKey.PubKey()).ToNot(Equal(privKey2.PubKey())) + }) + +}) diff --git a/cosmos/crypto/keys/ethsecp256k1/signature_cgo.go b/cosmos/crypto/keys/ethsecp256k1/signature_cgo.go new file mode 100644 index 0000000000..0b02aa042b --- /dev/null +++ b/cosmos/crypto/keys/ethsecp256k1/signature_cgo.go @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package ethsecp256k1 + +import ( + "pkg.berachain.dev/polaris/eth/crypto" +) + +// Sign signs the provided message using the ECDSA private key. It returns an error if the +// Sign creates a recoverable ECDSA signature on the `secp256k1` curve over the +// provided hash of the message. The produced signature is 65 bytes +// where the last byte contains the recovery ID. +func (privKey PrivKey) Sign(digestBz []byte) ([]byte, error) { + // We hash the provided input since EthSign expects a 32byte hash. + if len(digestBz) != crypto.DigestLength { + digestBz = crypto.Keccak256(digestBz) + } + + key, err := privKey.ToECDSA() + if err != nil { + return nil, err + } + + return crypto.EthSign(digestBz, key) +} + +// VerifySignature verifies that the ECDSA public key created a given signature over +// the provided message. The signature should be in [R || S] format. +func (pubKey PubKey) VerifySignature(msg, sig []byte) bool { + // This is a little hacky, but in order to work around the fact that the Cosmos-SDK typically + // does not hash messages, we have to accept an unhashed message and hash it. + // NOTE: this function will not work correctly if a msg of length 32 is provided, that is actually + // the hash of the message that was signed. + if len(msg) != crypto.DigestLength { + msg = crypto.Keccak256(msg) + } + + // The signature length must be correct. + if len(sig) == crypto.SignatureLength { + // remove recovery ID (V) if contained in the signature + sig = sig[:len(sig)-1] + } + + // The signature needs to be in [R || S] format when provided to `VerifySignature`. + return crypto.VerifySignature(pubKey.Key, msg, sig) +} diff --git a/cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go b/cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go new file mode 100644 index 0000000000..1933a05b88 --- /dev/null +++ b/cosmos/crypto/keys/ethsecp256k1/signature_cgo_test.go @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package ethsecp256k1 + +import ( + "crypto/ecdsa" + + "pkg.berachain.dev/polaris/eth/crypto" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("PrivKey_PubKey", func() { + var privKey *PrivKey + var ecdsaPrivKey *ecdsa.PrivateKey + + BeforeEach(func() { + var err error + privKey, err = GenPrivKey() + Expect(err).ToNot(HaveOccurred()) + ecdsaPrivKey, err = privKey.ToECDSA() + Expect(err).ToNot(HaveOccurred()) + }) + + It("validates signing bytes", func() { + msg := []byte("hello world") + // for the eth case, we have to manually hash in the test. + sigHash := crypto.Keccak256(msg) + + expectedSig, err := crypto.EthSign(sigHash, ecdsaPrivKey) + Expect(err).ToNot(HaveOccurred()) + + sig, err := privKey.Sign(msg) + Expect(err).ToNot(HaveOccurred()) + Expect(expectedSig).To(Equal(sig)) + }) + + It("validates signature", func() { + msg := []byte("hello world") + sigHash := crypto.Keccak256(msg) + sig, err := privKey.Sign(sigHash) + Expect(err).ToNot(HaveOccurred()) + + res := privKey.PubKey().VerifySignature(sigHash, sig) + Expect(res).To(BeTrue()) + }) +}) diff --git a/cosmos/go.mod b/cosmos/go.mod index 0f870eff51..0e0f6b59b7 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -17,10 +17,13 @@ require ( cosmossdk.io/math v1.1.3-rc.1 cosmossdk.io/store v1.0.0-rc.0 cosmossdk.io/x/tx v0.11.0 + github.com/btcsuite/btcd v0.23.0 + github.com/btcsuite/btcd/btcutil v1.1.3 github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 github.com/cosmos/cosmos-sdk v0.50.0-rc.1.0.20231023194456-42dbfc4d7087 + github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.11 github.com/ethereum/go-ethereum v1.13.1 github.com/golang/mock v1.6.0 @@ -52,6 +55,7 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.8.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/bytedance/sonic v1.10.0 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect @@ -67,7 +71,6 @@ require ( github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.0.0-rc.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 4fc9a2c7cd..80e4a3533a 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -83,6 +83,7 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -118,12 +119,30 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsy github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.0 h1:V2/ZgjfDFIygAX3ZapeigkVBoVUtOJKSwrhZdlpSvaA= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -237,15 +256,19 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= @@ -581,6 +604,8 @@ github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsD github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -588,6 +613,7 @@ github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -606,6 +632,7 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= @@ -737,6 +764,7 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -993,6 +1021,7 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1046,6 +1075,7 @@ 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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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= diff --git a/e2e/hive/clients/polard/entrypoint.sh b/e2e/hive/clients/polard/entrypoint.sh index a1a782eb87..c2bce64c01 100644 --- a/e2e/hive/clients/polard/entrypoint.sh +++ b/e2e/hive/clients/polard/entrypoint.sh @@ -24,7 +24,7 @@ KEYS[0]="dev0" CHAINID="polaris-2061" MONIKER="localtestnet" KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" LOGLEVEL="info" HOMEDIR="/" ETH_GENESIS_JSON="genesis.json" diff --git a/e2e/precompile/polard/start-node.sh b/e2e/precompile/polard/start-node.sh index 3ece948c62..1f16f92420 100755 --- a/e2e/precompile/polard/start-node.sh +++ b/e2e/precompile/polard/start-node.sh @@ -28,7 +28,7 @@ MONIKER="localtestnet" # otherwise your balance will be wiped quickly # The keyring test does not require private key to steal tokens from you KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="/" diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index a3db0b32c7..25231c7e23 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -55,6 +55,7 @@ import ( evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" + ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" polarruntime "pkg.berachain.dev/polaris/cosmos/runtime" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -205,6 +206,9 @@ func NewPolarisApp( // RegisterUpgradeHandlers is used for registering any on-chain upgrades. app.RegisterUpgradeHandlers() + // Register eth_secp256k1 keys + ethcryptocodec.RegisterInterfaces(app.interfaceRegistry) + // Load the app. if err := app.Load(loadLatest); err != nil { panic(err) diff --git a/e2e/testapp/docker/local/docker-init.sh b/e2e/testapp/docker/local/docker-init.sh index f0e43f9759..6071d2cc5b 100644 --- a/e2e/testapp/docker/local/docker-init.sh +++ b/e2e/testapp/docker/local/docker-init.sh @@ -29,7 +29,7 @@ MONIKER="localtestnet" # otherwise your balance will be wiped quickly # The keyring test does not require private key to steal tokens from you KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="/" diff --git a/e2e/testapp/docker/seed/init.sh b/e2e/testapp/docker/seed/init.sh index 118c453695..0ad79711ca 100755 --- a/e2e/testapp/docker/seed/init.sh +++ b/e2e/testapp/docker/seed/init.sh @@ -22,7 +22,7 @@ KEY="brick" CHAINID="berachain-666" MONIKER="brickchain" KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" LOGLEVEL="info" HOMEDIR="data/.polard" TRACE="" diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh index 7778ec2ff3..4aa4cd5f09 100755 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step1.sh @@ -25,7 +25,7 @@ if [ -z "$KEYRING" ]; then KEYRING="test" fi if [ -z "$KEYALGO" ]; then - KEYALGO="secp256k1" + KEYALGO="eth_secp256k1" fi if [ -z "$LOGLEVEL" ]; then LOGLEVEL="info" diff --git a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh index 164d4f5ca1..079e2a587a 100644 --- a/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh +++ b/e2e/testapp/docker/seed/scripts/seed0-init-step2.sh @@ -25,7 +25,7 @@ if [ -z "$KEYRING" ]; then KEYRING="test" fi if [ -z "$KEYALGO" ]; then - KEYALGO="secp256k1" + KEYALGO="eth_secp256k1" fi polard genesis collect-gentxs --home "$HOMEDIR" diff --git a/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh b/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh index 6042f44524..0f784b4b7d 100644 --- a/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh +++ b/e2e/testapp/docker/seed/scripts/seed1-init-step1.sh @@ -25,7 +25,7 @@ if [ -z "$KEYRING" ]; then KEYRING="test" fi if [ -z "$KEYALGO" ]; then - KEYALGO="secp256k1" + KEYALGO="eth_secp256k1" fi if [ -z "$LOGLEVEL" ]; then LOGLEVEL="info" diff --git a/e2e/testapp/docker/validator/scripts/val0-init-step1.sh b/e2e/testapp/docker/validator/scripts/val0-init-step1.sh index 0049b9c4ed..1c5ce6f7a5 100644 --- a/e2e/testapp/docker/validator/scripts/val0-init-step1.sh +++ b/e2e/testapp/docker/validator/scripts/val0-init-step1.sh @@ -22,7 +22,7 @@ KEY1="val0" CHAINID="brickchain-666" MONIKER1="val-0" KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" HOMEDIR="/.polard" polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/docker/validator/scripts/val1-init-step1.sh b/e2e/testapp/docker/validator/scripts/val1-init-step1.sh index 68a49db78c..e11b397216 100644 --- a/e2e/testapp/docker/validator/scripts/val1-init-step1.sh +++ b/e2e/testapp/docker/validator/scripts/val1-init-step1.sh @@ -22,7 +22,7 @@ KEY2="val1" CHAINID="brickchain-666" MONIKER1="val-1" KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" HOMEDIR="/.polard" polard init $MONIKER1 -o --chain-id $CHAINID --home "$HOMEDIR" diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index a5a4eea0aa..ac4663f22f 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -28,7 +28,7 @@ MONIKER="localtestnet" # otherwise your balance will be wiped quickly # The keyring test does not require private key to steal tokens from you KEYRING="test" -KEYALGO="secp256k1" +KEYALGO="eth_secp256k1" LOGLEVEL="info" # Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="./.tmp/polard" diff --git a/e2e/testapp/polard/cmd/root.go b/e2e/testapp/polard/cmd/root.go index d508e78d2c..9334a7ef38 100644 --- a/e2e/testapp/polard/cmd/root.go +++ b/e2e/testapp/polard/cmd/root.go @@ -63,6 +63,8 @@ import ( evmv1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/v1alpha1" evmconfig "pkg.berachain.dev/polaris/cosmos/config" + ethcryptocodec "pkg.berachain.dev/polaris/cosmos/crypto/codec" + "pkg.berachain.dev/polaris/cosmos/crypto/keyring" signinglib "pkg.berachain.dev/polaris/cosmos/lib/signing" testapp "pkg.berachain.dev/polaris/e2e/testapp" ) @@ -110,8 +112,11 @@ func NewRootCmd() *cobra.Command { WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). WithHomeDir(testapp.DefaultNodeHome). + WithKeyringOptions(keyring.OnlyEthSecp256k1Option()). WithViper("") // In simapp, we don't use any prefix for env variables. + ethcryptocodec.RegisterInterfaces(interfaceRegistry) + rootCmd := &cobra.Command{ Use: "polard", Short: "polaris sample app", diff --git a/eth/crypto/imported.go b/eth/crypto/imported.go index 8d10097681..703c7498a6 100644 --- a/eth/crypto/imported.go +++ b/eth/crypto/imported.go @@ -22,18 +22,28 @@ package crypto import ( "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/secp256k1" ) var ( - // GenerateEthKey is a function that generates a new Ethereum key. - GenerateEthKey = crypto.GenerateKey - // Keccak256 is a function that computes and returns the Keccak256 hash of the input data. - Keccak256 = crypto.Keccak256 - // Keccak256Hash is a function that computes and returns the Keccak256 hash of the input data, - // but the return type is Hash. - Keccak256Hash = crypto.Keccak256Hash - // PubkeyToAddress is a function that derives the Ethereum address from the given public key. - PubkeyToAddress = crypto.PubkeyToAddress - // LoadECDSA is a function that loads a private key from a given file. - LoadECDSA = crypto.LoadECDSA + SigToPub = crypto.SigToPub + Ecrecover = crypto.Ecrecover + CreateAddress = crypto.CreateAddress + UnmarshalPubkey = crypto.UnmarshalPubkey + CompressPubkey = crypto.CompressPubkey + DecompressPubkey = crypto.DecompressPubkey + DigestLength = crypto.DigestLength + EthSign = crypto.Sign + EthSecp256k1Sign = secp256k1.Sign + LoadECDSA = crypto.LoadECDSA + FromECDSA = crypto.FromECDSA + GenerateEthKey = crypto.GenerateKey + ValidateSignatureValues = crypto.ValidateSignatureValues + Keccak256 = crypto.Keccak256 + Keccak256Hash = crypto.Keccak256Hash + PubkeyToAddress = crypto.PubkeyToAddress + SignatureLength = crypto.SignatureLength + ToECDSA = crypto.ToECDSA + VerifySignature = crypto.VerifySignature + FromECDSAPub = crypto.FromECDSAPub ) diff --git a/go.work.sum b/go.work.sum index 434c59b6e7..72a4e21001 100644 --- a/go.work.sum +++ b/go.work.sum @@ -407,6 +407,7 @@ github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTN github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -495,8 +496,6 @@ github.com/berachain/polaris-geth 88eca5365ecc96474ca94bd4f0d8d9d99bed2a09/go.mo github.com/berachain/polaris-geth v0.0.0-20231024032003-b94ca5da2234/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/berachain/polaris-geth v0.0.0-20231024032731-4fdd2b9deba9/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/berachain/polaris-geth v0.0.0-20231024043959-88eca5365ecc/go.mod h1:I0U5VewuuTzvBtVzKo7b3hJzDhXOUtn9mJW7SsIPB0Q= -github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb h1:4oWKO5gaauAaOqAuVFz1J0/5+raBtr+SZuFNOU9HQn0= -github.com/berachain/polaris-geth v0.0.0-20231024060913-70d774cdaecb/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -505,6 +504,13 @@ github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTS github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= +github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= +github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= +github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= @@ -577,6 +583,7 @@ github.com/cristalhq/acmd v0.11.1 h1:DJ4fh2Pv0nPKmqT646IU/0Vh5FNdGblxvF+3/W3NAUI github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= @@ -810,6 +817,7 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= @@ -820,6 +828,7 @@ github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok= @@ -854,6 +863,7 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= diff --git a/proto/polaris/crypto/ethsecp256k1/v1/keys.proto b/proto/polaris/crypto/ethsecp256k1/v1/keys.proto new file mode 100644 index 0000000000..e6414ace25 --- /dev/null +++ b/proto/polaris/crypto/ethsecp256k1/v1/keys.proto @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +syntax = "proto3"; + +package polaris.crypto.ethsecp256k1.v1; + +option go_package = "pkg.berachain.dev/polaris/cosmos/crypto/keys/ethsecp256k1"; + +// `PubKey` defines a type alias for an `ecdsa.PublicKey` that implements +// CometBFT's `PubKey` interface. It represents the 33-byte compressed public +// key format. +message PubKey { + // `key` is the public key in byte form. + bytes key = 1; +} + +// `PrivKey` defines a type alias for a n`ecdsa.PrivateKey` that implements +// CometBFT's `PrivateKey` interface. +message PrivKey { + // `key` is the private key in byte form. + bytes key = 1; +} From b5236fe10d1993ed07d6804ebfdb355f1009b60e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 12:05:57 -0400 Subject: [PATCH 121/122] chore(deps): bump github.com/btcsuite/btcd from 0.23.0 to 0.23.2 in /cosmos (#1265) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cosmos/go.mod | 2 +- cosmos/go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cosmos/go.mod b/cosmos/go.mod index 0e0f6b59b7..0df1cd382d 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -17,7 +17,7 @@ require ( cosmossdk.io/math v1.1.3-rc.1 cosmossdk.io/store v1.0.0-rc.0 cosmossdk.io/x/tx v0.11.0 - github.com/btcsuite/btcd v0.23.0 + github.com/btcsuite/btcd v0.23.2 github.com/btcsuite/btcd/btcutil v1.1.3 github.com/cometbft/cometbft v0.38.0 github.com/cosmos/cosmos-db v1.0.0 diff --git a/cosmos/go.sum b/cosmos/go.sum index 80e4a3533a..01aa4eddcf 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -121,8 +121,9 @@ github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0 h1:V2/ZgjfDFIygAX3ZapeigkVBoVUtOJKSwrhZdlpSvaA= github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.2 h1:/YOgUp25sdCnP5ho6Hl3s0E438zlX+Kak7E6TgBgoT0= +github.com/btcsuite/btcd v0.23.2/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= From 949a826ae4546d7f92d25076200f3581ec2e3206 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Wed, 1 Nov 2023 16:22:54 -0400 Subject: [PATCH 122/122] refactor(blockchain): Minor cleanup and add safety checks. (#1266) --- cosmos/miner/miner.go | 44 +++- cosmos/runtime/runtime.go | 11 +- cosmos/x/evm/keeper/abci.go | 8 +- cosmos/x/evm/keeper/genesis.go | 5 +- cosmos/x/evm/keeper/keeper.go | 7 +- cosmos/x/evm/keeper/processor.go | 2 +- cosmos/x/evm/module.go | 4 +- .../distribution/distribution_test.go | 4 +- e2e/testapp/app.go | 2 +- eth/core/chain.go | 21 +- eth/core/chain_reader.go | 1 - eth/core/chain_resources.go | 21 ++ eth/core/chain_writer.go | 220 +++++++++++------- eth/polar/api_backend.go | 1 - 14 files changed, 233 insertions(+), 118 deletions(-) diff --git a/cosmos/miner/miner.go b/cosmos/miner/miner.go index 39a6ab583c..10bccbc693 100644 --- a/cosmos/miner/miner.go +++ b/cosmos/miner/miner.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/miner" + evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" "pkg.berachain.dev/polaris/eth" "pkg.berachain.dev/polaris/eth/core/types" ) @@ -45,17 +46,33 @@ type EnvelopeSerializer interface { ToSdkTxBytes(*engine.ExecutionPayloadEnvelope, uint64) ([]byte, error) } +type App interface { + BeginBlocker(sdk.Context) (sdk.BeginBlock, error) + PreBlocker(sdk.Context, *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) +} + +// EVMKeeper is an interface that defines the methods needed for the EVM setup. +type EVMKeeper interface { + // Setup initializes the EVM keeper. + Setup(evmkeeper.Blockchain) error + SetLatestQueryContext(context.Context) error +} + // Miner implements the baseapp.TxSelector interface. type Miner struct { eth.Miner + app App + keeper EVMKeeper serializer EnvelopeSerializer currentPayload *miner.Payload } // New produces a cosmos miner from a geth miner. -func New(gm eth.Miner) *Miner { +func New(gm eth.Miner, app App, keeper EVMKeeper) *Miner { return &Miner{ - Miner: gm, + Miner: gm, + keeper: keeper, + app: app, } } @@ -68,11 +85,30 @@ func (m *Miner) Init(serializer EnvelopeSerializer) { func (m *Miner) PrepareProposal( ctx sdk.Context, _ *abci.RequestPrepareProposal, ) (*abci.ResponsePrepareProposal, error) { - var payloadEnvelopeBz []byte - var err error + var ( + payloadEnvelopeBz []byte + err error + ) + + // We have to prime the state plugin. + if err = m.keeper.SetLatestQueryContext(ctx); err != nil { + return nil, err + } + + // We have to run the PreBlocker && BeginBlocker to get the chain into the state + // it'll be in when the EVM transaction actually runs. + if _, err = m.app.PreBlocker(ctx, nil); err != nil { + return nil, err + } else if _, err = m.app.BeginBlocker(ctx); err != nil { + return nil, err + } + + // Trigger the geth miner to build a block. if payloadEnvelopeBz, err = m.buildBlock(ctx); err != nil { return nil, err } + + // Return the payload as a transaction in the proposal. return &abci.ResponsePrepareProposal{Txs: [][]byte{payloadEnvelopeBz}}, err } diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 324386800d..d37058df25 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -21,6 +21,7 @@ package runtime import ( + "context" "time" "cosmossdk.io/log" @@ -50,6 +51,7 @@ import ( type EVMKeeper interface { // Setup initializes the EVM keeper. Setup(evmkeeper.Blockchain) error + SetLatestQueryContext(context.Context) error } // CosmosApp is an interface that defines the methods needed for the Cosmos setup. @@ -57,6 +59,7 @@ type CosmosApp interface { SetPrepareProposal(sdk.PrepareProposalHandler) SetMempool(mempool.Mempool) SetAnteHandler(sdk.AnteHandler) + miner.App } // Polaris is a struct that wraps the Polaris struct from the polar package. @@ -92,10 +95,6 @@ func New( panic(err) } - // Wrap the geth miner and txpool with the cosmos miner and txpool. - p.WrappedTxPool = txpool.New(p.Blockchain(), p.TxPool()) - p.WrappedMiner = miner.New(p.Miner()) - return p } @@ -103,6 +102,10 @@ func New( // It takes a BaseApp and an EVMKeeper as arguments. // It returns an error if the setup fails. func (p *Polaris) Build(app CosmosApp, ek EVMKeeper) error { + // Wrap the geth miner and txpool with the cosmos miner and txpool. + p.WrappedTxPool = txpool.New(p.Blockchain(), p.TxPool()) + p.WrappedMiner = miner.New(p.Miner(), app, ek) + app.SetMempool(p.WrappedTxPool) app.SetPrepareProposal(p.WrappedMiner.PrepareProposal) diff --git a/cosmos/x/evm/keeper/abci.go b/cosmos/x/evm/keeper/abci.go index 811cc4ba56..c5fc838b3f 100644 --- a/cosmos/x/evm/keeper/abci.go +++ b/cosmos/x/evm/keeper/abci.go @@ -35,7 +35,9 @@ func (k *Keeper) Precommit(ctx context.Context) error { block := k.chain.GetBlockByNumber(blockNum) if block == nil { panic( - fmt.Sprintf("EVM BLOCK FAILURE AT BLOCK %d", blockNum), + fmt.Sprintf( + "EVM BLOCK %d FAILED TO PROCESS", blockNum, + ), ) } else if block.NumberU64() != blockNum { panic( @@ -47,8 +49,8 @@ func (k *Keeper) Precommit(ctx context.Context) error { return nil } -// PrepareCheckState runs on the Cosmos-SDK lifecycle PrepareCheckState(). -func (k *Keeper) PrepareCheckState(ctx context.Context) error { +// SetLatestQueryContext runs on the Cosmos-SDK lifecycle SetLatestQueryContext(). +func (k *Keeper) SetLatestQueryContext(ctx context.Context) error { k.sp.Prepare(ctx) return nil } diff --git a/cosmos/x/evm/keeper/genesis.go b/cosmos/x/evm/keeper/genesis.go index 1928a52056..22816847ee 100644 --- a/cosmos/x/evm/keeper/genesis.go +++ b/cosmos/x/evm/keeper/genesis.go @@ -44,9 +44,8 @@ func (k *Keeper) InitGenesis(ctx sdk.Context, genState *core.Genesis) error { } // Insert to chain. - k.chain. - PreparePlugins(ctx.WithEventManager(sdk.NewEventManager())) - return k.chain.InsertBlockWithoutSetHead(genState.ToBlock()) + k.chain.PreparePlugins(ctx.WithEventManager(sdk.NewEventManager())) + return k.chain.WriteGenesisBlock(genState.ToBlock()) } // ExportGenesis returns the exported genesis state. diff --git a/cosmos/x/evm/keeper/keeper.go b/cosmos/x/evm/keeper/keeper.go index ec60248414..f1bd832d3d 100644 --- a/cosmos/x/evm/keeper/keeper.go +++ b/cosmos/x/evm/keeper/keeper.go @@ -31,16 +31,17 @@ import ( "pkg.berachain.dev/polaris/cosmos/config" "pkg.berachain.dev/polaris/cosmos/x/evm/plugins/state" "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/core" ethprecompile "pkg.berachain.dev/polaris/eth/core/precompile" + coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/eth/params" ) type Blockchain interface { PreparePlugins(context.Context) Config() *params.ChainConfig - core.ChainWriter - core.ChainReader + WriteGenesisBlock(*coretypes.Block) error + InsertBlockAndSetHead(*coretypes.Block) error + GetBlockByNumber(uint64) *coretypes.Block } type Keeper struct { diff --git a/cosmos/x/evm/keeper/processor.go b/cosmos/x/evm/keeper/processor.go index da949bc79f..38d3037aca 100644 --- a/cosmos/x/evm/keeper/processor.go +++ b/cosmos/x/evm/keeper/processor.go @@ -61,7 +61,7 @@ func (k *Keeper) ProcessPayloadEnvelope( // Prepare should be moved to the blockchain? THIS IS VERY HOOD YES NEEDS TO BE MOVED. k.chain.PreparePlugins(ctx) - if err = k.chain.InsertBlockWithoutSetHead(block); err != nil { + if err = k.chain.InsertBlockAndSetHead(block); err != nil { return nil, err } diff --git a/cosmos/x/evm/module.go b/cosmos/x/evm/module.go index 5969ad3dd3..07d2d653a5 100644 --- a/cosmos/x/evm/module.go +++ b/cosmos/x/evm/module.go @@ -126,9 +126,9 @@ func (am AppModule) RegisterServices(registrar grpc.ServiceRegistrar) error { // ConsensusVersion implements AppModule/ConsensusVersion. func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion } -// PrepareCheckState prepares the application state for a check. +// SetLatestQueryContext prepares the application state for a check. func (am AppModule) PrepareCheckState(ctx context.Context) error { - return am.keeper.PrepareCheckState(ctx) + return am.keeper.SetLatestQueryContext(ctx) } // Precommit performs precommit operations. diff --git a/e2e/precompile/contracts/distribution/distribution_test.go b/e2e/precompile/contracts/distribution/distribution_test.go index a79517c974..68db70c7e0 100644 --- a/e2e/precompile/contracts/distribution/distribution_test.go +++ b/e2e/precompile/contracts/distribution/distribution_test.go @@ -121,8 +121,8 @@ var _ = Describe("Distribution Precompile", func() { Expect(err).ToNot(HaveOccurred()) ExpectSuccessReceipt(tf.EthClient(), tx) - // Wait for 2 blocks to be produced, to make sure there are rewards. - for i := 0; i < 2; i++ { + // Wait for 5 blocks to be produced, to make sure there are rewards. + for i := 0; i < 5; i++ { Expect(tf.WaitForNextBlock()).To(Succeed()) } diff --git a/e2e/testapp/app.go b/e2e/testapp/app.go index 25231c7e23..fa5d851e9a 100644 --- a/e2e/testapp/app.go +++ b/e2e/testapp/app.go @@ -191,7 +191,7 @@ func NewPolarisApp( ) // Setup Polaris Runtime. - if err := app.Polaris.Build(app.BaseApp, app.EVMKeeper); err != nil { + if err := app.Polaris.Build(app, app.EVMKeeper); err != nil { panic(err) } diff --git a/eth/core/chain.go b/eth/core/chain.go index f419e17ff8..53fcf2816f 100644 --- a/eth/core/chain.go +++ b/eth/core/chain.go @@ -66,6 +66,7 @@ type blockchain struct { engine consensus.Engine processor core.Processor + validator core.Validator // statedb is the state database that is used to mange state during transactions. statedb state.StateDB @@ -79,10 +80,6 @@ type blockchain struct { currentBlock atomic.Pointer[types.Block] // finalizedBlock is the finalized/latest block. finalizedBlock atomic.Pointer[types.Block] - // currentReceipts is the current/pending receipts. - currentReceipts atomic.Value - // currentLogs is the current/pending logs. - currentLogs atomic.Value // receiptsCache is a cache of the receipts for the last `defaultCacheSizeBytes` bytes of // blocks. blockHash -> receipts @@ -98,14 +95,13 @@ type blockchain struct { txLookupCache *lru.Cache[common.Hash, *types.TxLookupEntry] // subscription event feeds - scope event.SubscriptionScope - chainFeed event.Feed - chainHeadFeed event.Feed - logsFeed event.Feed - pendingLogsFeed event.Feed - rmLogsFeed event.Feed // currently never used - chainSideFeed event.Feed // currently never used - logger log.Logger + scope event.SubscriptionScope + chainFeed event.Feed + chainHeadFeed event.Feed + logsFeed event.Feed + rmLogsFeed event.Feed // currently never used + chainSideFeed event.Feed // currently never used + logger log.Logger } // ========================================================================= @@ -134,6 +130,7 @@ func NewChain( } bc.statedb = state.NewStateDB(bc.sp, bc.pp) bc.processor = core.NewStateProcessor(bc.config, bc, bc.engine) + bc.validator = core.NewBlockValidator(bc.config, bc, bc.engine) // TODO: hmm... bc.currentBlock.Store( types.NewBlock(&types.Header{Time: 0, Number: big.NewInt(0), diff --git a/eth/core/chain_reader.go b/eth/core/chain_reader.go index cccaba8d88..b284e0076b 100644 --- a/eth/core/chain_reader.go +++ b/eth/core/chain_reader.go @@ -97,7 +97,6 @@ func (bc *blockchain) CurrentFinalBlock() *types.Header { // CurrentSafeBlock retrieves the current safe block of the canonical // chain. The block is retrieved from the blockchain's internal cache. func (bc *blockchain) CurrentSafeBlock() *types.Header { - // TODO: determine the difference between safe and final in polaris. return bc.CurrentFinalBlock() } diff --git a/eth/core/chain_resources.go b/eth/core/chain_resources.go index 95b67cb421..cd14c21ed0 100644 --- a/eth/core/chain_resources.go +++ b/eth/core/chain_resources.go @@ -54,6 +54,27 @@ func (bc *blockchain) StateAtBlockNumber(number uint64) (state.StateDB, error) { return state.NewStateDB(sp, bc.pp), nil } +// HasBlockAndState checks if the blockchain has a block and its state at +// a given hash and number. +func (bc *blockchain) HasBlockAndState(hash common.Hash, number uint64) bool { + // Check for State. + if sdb, err := bc.StateAt(hash); sdb == nil || err == nil { + sdb, err = bc.StateAtBlockNumber(number) + if sdb == nil || err != nil { + return false + } + } + + // Check for Block. + if block := bc.GetBlockByNumber(number); block == nil { + block = bc.GetBlockByHash(hash) + if block == nil { + return false + } + } + return true +} + // GetVMConfig returns the vm.Config for the current chain. func (bc *blockchain) GetVMConfig() *vm.Config { return bc.vmConfig diff --git a/eth/core/chain_writer.go b/eth/core/chain_writer.go index e96ae7b976..fd2e196ef7 100644 --- a/eth/core/chain_writer.go +++ b/eth/core/chain_writer.go @@ -22,83 +22,177 @@ package core import ( "context" - "time" + "errors" "github.com/ethereum/go-ethereum/core" "pkg.berachain.dev/polaris/eth/core/state" "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/eth/log" ) // ChainWriter defines methods that are used to perform state and block transitions. type ChainWriter interface { LoadLastState(context.Context, uint64) error - InsertBlock(block *types.Block, receipts types.Receipts, logs []*types.Log) error - InsertBlockWithoutSetHead(block *types.Block) error + WriteGenesisBlock(block *types.Block) error + InsertBlockAndSetHead(block *types.Block) error WriteBlockAndSetHead(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state state.StateDB, emitHeadEvent bool) (status core.WriteStatus, err error) } -// WriteBlockAndSetHead is a no-op in the current implementation. Potentially usable later. -func (*blockchain) WriteBlockAndSetHead( - _ *types.Block, _ []*types.Receipt, _ []*types.Log, _ state.StateDB, - _ bool) (core.WriteStatus, error) { - return core.NonStatTy, nil +// WriteGenesisBlock inserts the genesis block into the blockchain. +func (bc *blockchain) WriteGenesisBlock(block *types.Block) error { + // TODO: add more validation here. + if block.NumberU64() != 0 { + return errors.New("not the genesis block") + } + _, err := bc.WriteBlockAndSetHead(block, nil, nil, nil, true) + return err } -func (bc *blockchain) InsertBlockWithoutSetHead(block *types.Block) error { - // Retrieve the parent block and it's state to execute on top - // parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1) - // if parent == nil { - // return fmt.Errorf("parent block not found") - // } +// InsertBlockAndSetHead inserts a block into the blockchain and sets the head. +func (bc *blockchain) InsertBlockAndSetHead(block *types.Block) error { + // Validate that we are about to insert a valid block. + if block.NumberU64() > 1 { // TODO DIAGNOSE + if err := bc.validator.ValidateBody(block); err != nil { + log.Error("invalid block body", "err", err) + return err + } + } - // Process block using the parent state as reference point - pstart := time.Now() - receipts, logs, _, err := bc.processor.Process(block, bc.statedb, *bc.vmConfig) + // Process the incoming EVM block. + receipts, logs, usedGas, err := bc.processor.Process(block, bc.statedb, *bc.vmConfig) if err != nil { + log.Error("failed to process block", "num", block.NumberU64(), "err", err) return err } - ptime := time.Since(pstart) - bc.logger.Info("processed block in", "time", ptime) - return bc.InsertBlock(block, receipts, logs) -} -// InsertBlock inserts a block into the canonical chain and updates the state of the blockchain. -func (bc *blockchain) InsertBlock( - block *types.Block, - receipts types.Receipts, - logs []*types.Log, -) error { - var err error - if _, err = bc.statedb.Commit( - block.NumberU64(), - bc.config.IsEIP158(block.Header().Number), - ); err != nil { + // ValidateState validates the statedb post block processing. + if err = bc.validator.ValidateState(block, bc.statedb, receipts, usedGas); err != nil { + log.Error("invalid state after processing block", "num", block.NumberU64(), "err", err) return err } - // TODO: prepare historical plugin here? - // TBH still think we should deprecate it and run in another routine as indexer. + // We can just immediately finalize the block. It's okay in this context. + if _, err = bc.WriteBlockAndSetHead( + block, receipts, logs, nil, true); err != nil { + log.Error("failed to write block", "num", block.NumberU64(), "err", err) + return err + } - // ***************************************** // - // TODO: add safety check for canonicallness // - // ***************************************** // + return err +} - // *********************************************** // - // TODO: restructure this function / flow it sucks // - // *********************************************** // - blockHash, blockNum := block.Hash(), block.Number().Uint64() - bc.logger.Info( - "finalizing evm block", "hash", blockHash.Hex(), "num_txs", len(receipts)) +// WriteBlockAndSetHead sets the head of the blockchain to the given block and finalizes the block. +func (bc *blockchain) WriteBlockAndSetHead( + block *types.Block, receipts []*types.Receipt, logs []*types.Log, + _ state.StateDB, emitHeadEvent bool, +) (core.WriteStatus, error) { + // Write the block to the store. + if err := bc.writeBlockWithState(block, receipts); err != nil { + return core.NonStatTy, err + } + currentBlock := bc.currentBlock.Load() + + // We need to error if the parent is not the head block. + if block.NumberU64() > 0 && block.ParentHash() != currentBlock.Hash() { + log.Error("canonical chain broken", + "block-number", block.NumberU64(), "block-hash", block.ParentHash().Hex()) + return core.NonStatTy, errors.New("canonical chain broken") + } + + // Set the current block. + bc.currentBlock.Store(block) + + // TODO: this is fine to do here but not really semantically correct + // and is very confusing. + // For clarity reasons, we should make the cosmos chain make a separate call + // to finalize the block. + bc.finalizedBlock.Store(block) + + // Store txLookup entries for all transactions in the block. + blockNum := block.NumberU64() + blockHash := block.Hash() + bc.blockNumCache.Add(blockNum, block) + bc.blockHashCache.Add(blockHash, block) + for txIndex, tx := range block.Transactions() { + bc.txLookupCache.Add( + tx.Hash(), + &types.TxLookupEntry{ + Tx: tx, + TxIndex: uint64(txIndex), + BlockNum: blockNum, + BlockHash: blockHash, + }, + ) + } + + // Write the receipts cache. + // TODO deprecate this cache? + if receipts != nil { + bc.receiptsCache.Add(block.Hash(), receipts) + } + + // Fire off the feeds. + bc.chainFeed.Send(ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) + if len(logs) > 0 { + bc.logsFeed.Send(logs) + } + + // In theory, we should fire a ChainHeadEvent when we inject + // a canonical block, but sometimes we can insert a batch of + // canonical blocks. Avoid firing too many ChainHeadEvents, + // we will fire an accumulated ChainHeadEvent and disable fire + // event here. + if emitHeadEvent { + bc.chainHeadFeed.Send(ChainHeadEvent{Block: block}) + } + + return core.CanonStatTy, nil +} - // store the block header on the host chain - err = bc.bp.StoreHeader(block.Header()) +// writeBlockWithState writes the block along with its state (receipts and logs) +// into the blockchain. +func (bc *blockchain) writeBlockWithState( + block *types.Block, receipts []*types.Receipt, +) error { + // In Polaris since we are using single block finality. + // Finalized == Current == Safe. All are the same. + // Store the header as well as update all the finalized stuff. + err := bc.bp.StoreHeader(block.Header()) if err != nil { bc.logger.Error("failed to store block header", "err", err) return err } + // Irrelevant of the canonical status, write the block itself to the database. + // TODO THIS NEEDS TO WRITE TO EXTERNAL DB. + if err = bc.writeHistoricalData(block, receipts); err != nil { + return err + } + + // Commit all cached state changes into underlying memory database. + // In Polaris this is a no-op. + _, err = bc.statedb.Commit(block.NumberU64(), bc.config.IsEIP158(block.Number())) + if err != nil { + return err + } + + bc.logger.Info( + "finalizing evm block", "hash", block.Hash().Hex(), "num_txs", len(receipts)) + + return nil +} + +// InsertBlock inserts a block into the canonical chain and updates the state of the blockchain. +// TODO: WRITE TO EXTERNAL STORE +func (bc *blockchain) writeHistoricalData( + block *types.Block, + receipts types.Receipts, +) error { + var err error + blockHash, blockNum := block.Hash(), block.Number().Uint64() + // store the block, receipts, and txs on the host chain if historical plugin is supported if bc.hp != nil { if err = bc.hp.StoreBlock(block); err != nil { @@ -115,41 +209,5 @@ func (bc *blockchain) InsertBlock( } } - // mark the current block, receipts, and logs - if block != nil { - bc.currentBlock.Store(block) - bc.finalizedBlock.Store(block) - - bc.blockNumCache.Add(blockNum, block) - bc.blockHashCache.Add(blockHash, block) - - for txIndex, tx := range block.Transactions() { - bc.txLookupCache.Add( - tx.Hash(), - &types.TxLookupEntry{ - Tx: tx, - TxIndex: uint64(txIndex), - BlockNum: blockNum, - BlockHash: blockHash, - }, - ) - } - } - if receipts != nil { - bc.currentReceipts.Store(receipts) - bc.receiptsCache.Add(blockHash, receipts) - } - if logs != nil { - bc.pendingLogsFeed.Send(logs) - bc.currentLogs.Store(logs) - if len(logs) > 0 { - bc.logsFeed.Send(logs) - } - } - - // Send chain events. - bc.chainFeed.Send(ChainEvent{Block: block, Hash: blockHash, Logs: logs}) - bc.chainHeadFeed.Send(ChainHeadEvent{Block: block}) - return nil } diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go index 97ae4a33c2..5d55dc253d 100644 --- a/eth/polar/api_backend.go +++ b/eth/polar/api_backend.go @@ -556,7 +556,6 @@ func (b *backend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) eve } func (b *backend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { - b.logger.Debug("called eth.rpc.backend.SubscribeLogsEvent", "ch", ch) return b.polar.blockchain.SubscribeLogsEvent(ch) }
    Release notes

    Sourced from github.com/docker/docker's releases.

    v24.0.7

    24.0.7

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Bug fixes and enhancements

    • Write overlay2 layer metadata atomically. moby/moby#46703
    • Fix "Rootful-in-Rootless" Docker-in-Docker on systemd version 250 and later. moby/moby#46626
    • Fix dockerd-rootless-setuptools.sh when username contains a backslash. moby/moby#46407
    • Fix a bug that would prevent network sandboxes to be fully deleted when stopping containers with no network attachments and when dockerd --bridge=none is used. moby/moby#46702
    • Fix a bug where cancelling an API request could interrupt container restart. moby/moby#46697
    • Fix an issue where containers would fail to start when providing --ip-range with a range larger than the subnet. docker/for-mac#6870
    • Fix data corruption with zstd output. moby/moby#46709
    • Fix the conditions under which the container's MAC address is applied. moby/moby#46478
    • Improve the performance of the stats collector. moby/moby#46448
    • Fix an issue with source policy rules ending up in the wrong order. moby/moby#46441

    Packaging updates

    Security

    v24.0.6

    24.0.6

    For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones:

    Bug fixes and enhancements

    • containerd storage backend: Fix docker ps failing when a container image is no longer present in the content store. moby/moby#46095
    • containerd storage backend: Fix docker ps -s -a and docker container prune failing when a container image config is no longer present in the content store. moby/moby#46097
    • containerd storage backend: Fix docker inspect failing when a container image config is no longer (or was never) present in the content store. moby/moby#46244
    • containerd storage backend: Fix diff and export with the overlayfs snapshotter by using reference-counted rootfs mounts. moby/moby#46266
    • containerd storage backend: Fix a misleading error message when the image platforms available locally do not match the desired platform. moby/moby#46300
    • containerd storage backend: Fix the FROM scratch Dockerfile instruction with the classic builder. moby/moby#46302
    • containerd storage backend: Fix mismatched image rootfs and manifest layers errors with the classic builder. moby/moby#46310

    ... (truncated)